1、初始化
- 时钟
串口时钟,引脚时钟
RCC->AHB1ENR|=1<<0; //使能PORTA口时钟
RCC->APB2ENR|=1<<4; //使能串口1时钟
- 引脚复用初始化
GPIO_Set(GPIOA,PIN9|PIN10,GPIO_MODE_AF,GPIO_OTYPE_PP,GPIO_SPEED_50M,GPIO_PUPD_PU);//PA9,PA10,复用功能,上拉输出
GPIO_AF_Set(GPIOA,9,7); //PA9,AF7
GPIO_AF_Set(GPIOA,10,7);//PA10,AF7
- 波特率设置
//波特率设置
USART1->BRR=mantissa; //波特率设置
USART1->CR1&=~(1<<15); //设置OVER8=0
USART1->CR1|=1<<3; //串口发送使能
- 是否使用中断
#if EN_USART1_RX //如果使能了接收
//使能接收中断
USART1->CR1|=1<<2; //串口接收使能
USART1->CR1|=1<<5; //接收缓冲区非空中断使能
MY_NVIC_Init(3,3,USART1_IRQn,2);//组2,最低优先级
#endif
- 串口使能
USART1->CR1|=1<<13; //串口使能
波特率设置 BRR寄存器
(尾数即整数部分)
计算公式
代码:USARTDIV=(float)(pclk21000000)/(bound16);//得到USARTDIV@OVER8=0
如果使用USART1,系统时钟为72MHZ,USART1使用PCLK2时钟,也定义为72MHz.
定义波特率=9600,fPCLK2=72MHz,则: 计算USARTDIV=72MHz/9600/16=468.75
取整数468=0x1D4. 小数0.75*16=12=0x0C. 所以写入寄存器USART_BRR中的值为:
0x1D4|0x0C=0x1D4C
USART_BRR=0x1D4C.
**说明一下:0.75*16=12=0x0C.
这是小数转十六进制的方法,乘16取整,一般省略后面的小数。
**
如果使用USART2,USART2使用PCLK1时钟,PCLK1时钟为36MHz.
定义波特率=9600,fPCLK1=36MHz,则: 计算USARTDIV=36MHz/9600/16=234.375
取整数234=0xEA.小数0.375*16=6=0x06.所以写入寄存器USART_BRR中的值为:USART_BRR=0xEA6.
正点原子计算代码
float temp;
u16 mantissa;
u16 fraction;
temp=(float)(pclk2*1000000)/(bound*16);//得到**USARTDIV**@OVER8=0
mantissa=temp; //得到整数部分(float变int,只取整数)
fraction=(temp-mantissa)*16; //得到小数部分@OVER8=0
mantissa<<=4; // 整数部分在BRR寄存器的4-15位
mantissa+=fraction;