1、关于串口波特率的计算
波特率计算公式如下:
TX/RX波特率=FCLK/(16*USARTDIV)
USARTDIV=DIV_Mantissa+(DIVFraction/16)
以USART1波特率115200为例,FCLK为72M,则USARTDIV值为39.0625,即
39.0625=DIV_Mantissa+(DIVFraction/16)
其中,DIV_Mantissa表示整数部分,为36,DIVFraction/16表示小数部分,为0.0625,则DIVFraction的值为1.
2、关于串口通信修改波特率
注意若要在串口数据传输过程中修改波特率,建议在完成一次数据通信之后再修改波特率,修改波特率时建议先关闭串口,调用函数USART_Cmd(USART2, DISABLE);,以免造成数据传输错误,出现乱码,修改完成后再使能开启串口,调用函数USART_Cmd(USART2, ENABLE)。
如果想要多次修改波特率值,可以写一个数组,里面包括你想要切换的波特率,实时监测切换就行。波特率修改可参考下列函数。
3、关于串口发送数据是上次DR中的数据问题
在 TC=1 和 写DR寄存器同时发生下,会出现发送的数据是上次DR中的数据。
解决方法,建议使用TC标志判断,因为软件会读,相当于有延时。确保写DR寄存器的时候,上一个数据不要正好发完。
4、关于串口空闲中断标志位清除问题
空闲中断是在检测到在数据收受后,总线上在一个字节的时间内没有再接收到数据时发生。即串口的RXNE位被置位之后才开始检测,检测到空闲之后,串口的CR1寄存器的IDLE位被硬件置1,必须采用软件将IDLE位清零才能避免反复进入空闲中断。具体的做法是先读取USART_SR,再读取USART_DR。需要注意的是,不能采用库函数USART_ClearFlag()或者USART_ClearItPending()来清除IDEL标注,因为这两个函数接收的中断标志位仅包括:
USART_FLAG_CTS: CTS Change flag (not available for UART4 and UART5).
USART_FLAG_LBD: LIN Break detection flag.
USART_FLAG_TC: Transmission Complete flag.
USART_FLAG_RXNE: Receive data register not empty flag.
标签:USART,串口,flag,FLAG,注意事项,波特率,DR From: https://www.cnblogs.com/liaigu/p/17617836.html