首页 > 代码库 > STM32 串行通信 USART 程序例举

STM32 串行通信 USART 程序例举

STM32 串行通信 USART 的笔记讲解连接http://blog.csdn.net/dragon12345666/article/details/24484185

1、串行通信 软件仿真STM32通过串口USART1发送26个英文字母

/**************************************************************************************************
 *	硬件平台:STM32F103VC
 *	学习重点:GPIOx的位绑定
 *	实现功能:软件仿真,实现STM32通过USART1发送数据
 *	配置寄存器实现(其中打开系统时钟和GPIO引脚的配置是通过库函数实现的,后面会具体讲解)
 **************************************************************************************************/

 /*=============================================================================
 * 位绑定公式:
 * 1、SRAM区域 :0X2200 0000 ----0X200F FFFF
 *    Aliasaddr = 0X22000000 + ( A -0X20000000 )*32 + n*4
 * 2、片上外设区域 :0X4200 0000 ----0X400F FFFF
 *    Aliasaddr = 0X42000000 + ( A -0X40000000 )*32 + n*4
 * 参数解释:
 *          Aliasaddr : 设置“端口GPIOx的第n位”的寄存器_相应位的实际地址
 *          A : 端口GPIOx的基地址(GPIOx_BASE) + 相应寄存器的偏移地址
 *          n : 配置的是相应寄存器的第n位
 * 寄存器的偏移地址 :CRL  CRH  IDR  ODR  BSRR  BRR  LCKR
 *                    00H  04H  08H  0CH  10H   14H  18H 
 =============================================================================*/


/* Includes ------------------------------------------------------------------*/
#include "stm32f10x_lib.h"	  //包含了所有的头文件 它是唯一一个用户需要包括在自己应用中的文件,起到应用和库之间界面的作用。
#include "stm32f10x_map.h"


/******************************快速位绑定**********************************************************/
/*----------------1、宏定义要操作的寄存器地址---------------------------------------------*/
 #define GPIOA_ODR (GPIOA_BASE + 0X0C)
 #define GPIOA_IDR (GPIOA_BASE + 0X08)

 #define GPIOB_ODR (GPIOB_BASE + 0X0C)
 #define GPIOB_IDR (GPIOB_BASE + 0X08)

 #define GPIOC_ODR (GPIOC_BASE + 0X0C)
 #define GPIOC_IDR (GPIOC_BASE + 0X08)

 #define GPIOD_ODR (GPIOD_BASE + 0X0C)
 #define GPIOD_IDR (GPIOD_BASE + 0X08)

 #define GPIOE_ODR (GPIOE_BASE + 0X0C)
 #define GPIOE_IDR (GPIOE_BASE + 0X08)

/*----------------2、获取端口GPIOx(A-E)的对应寄存器的某一操作位的位地址-------------------*/
// #define BitBand(Addr , BitNum) *( (volatile unsigned long *)(Addr & 0xf0000000) + 0x2000000 + ((Addr&0xfffff)*32) + (BitNum*4) ) 
// 因为 左移、右移 语句的执行速度比乘除法语句的运动速度快,所以将上述语句改成如下方式
 #define BitBand(Addr , BitNum) *( (volatile unsigned long *)( (Addr & 0xf0000000) + 0x2000000 + ((Addr&0xfffff)<<5) + (BitNum<<2) ) ) 
  
/*----------------3、宏定义函数,对固定的位绑定 进行功能封装------------------------------*/
 #define PAout(n) BitBand(GPIOA_ODR , n) 
 #define PAin(n)  BitBand(GPIOA_IDR , n)

 #define PBout(n) BitBand(GPIOB_ODR , n) 
 #define PBin(n)  BitBand(GPIOB_IDR , n)

 #define PCout(n) BitBand(GPIOC_ODR , n) 
 #define PCin(n)  BitBand(GPIOC_IDR , n)

 #define PDout(n) BitBand(GPIOD_ODR , n) 
 #define PDin(n)  BitBand(GPIOD_IDR , n)

 #define PEout(n) BitBand(GPIOE_ODR , n) 
 #define PEin(n)  BitBand(GPIOE_IDR , n)


/*----------------函数声明部分---------------*/
void delay1ms(int t) ;
void RCC_Configuration(void) ;
void GPIO_Configuration(void) ;


/* Private functions -----------------------------------------------------------------------------*/ 
/**************************************************************************************************
* Function Name  : main
* Description    : 从GPIOA.8-.16输入一个电平信号,GPIOA.0-.7口分别将对应引脚输入的电平信号输出
* Input          : None
* Output         : None
* Return         : None
****************************************************************************************************/
int main(void)
{

	float Div; 	//计算波特率时公式里面的除数
	u16 M,F;    //临时存储Div的整数部分的数字和小数部分的数字
	u32 Bound,BRR;	//Bound:要设置的波特率 , BRR:是Div的整数部分和小数部分整合后存入寄存器USART1->BRR中的值
	u8  data=http://www.mamicode.com/‘A‘;   //存放要发送的数据>

程序运行前的仿真界面:


程序运行后的仿真界面: