萌新的STM32学习–24 USART的部分介绍
STM32的USART的介绍
 USART 英文解释是 通用同步异步收发器
 UART 通用异步收发器
USART/UART 都可以与外部设备进行全双工异步通信
 USART 我们常用的也是异步通信
USART 主要特征
 1.全双工异步通信 2.单线半双工通信
 3.单独的发送器和接收器使能位
 4.可配置使用DMA的多缓冲器通信
 5.多个带标志的中断源
 
 SW_RX 是芯片内部的引脚我们不用去理会
 而
 RTS CTS是同步时钟才会用到的
 SCLK也是同步才用到的
 
 灰色框图里面的寄存器是用户不可见的 我们所能操纵的只是数据存储器 DR
 
 TX:发送数据输出引脚
 RX:接收数据输入引脚
 SCLK:发送器时钟输出,适用于同步传输
 SW_RX:数据接收引脚,属于内部引脚,用于智能卡模式
 IrDA_RDI:IrDA 模式下的数据输入
 IrDA_TDO:IrDA 模式下的数据输出
 nRTS:发送请求,若是低电平,表示 USART 准备好接收数据
 nCTS:清除发送,若是高电平,在当前数据传输结束时阻断下一次的数据发送
设置USART 波特率
 
 
 fck 是给串口的时钟(USART2\3\3\4\5 的时钟源为 PCLK1,USART1 的时钟源PCLK2)
 USARTDIV 是一个无符号的定点数,存放在波特率寄存器(USART_BRR)的低 16 位,DIV_Mantissa[11:0]存放的是 USARTDIV 的整数部分,DIV_Fractionp[3:0]存放的是 USARTDIV 的小数部
 
 得到 USARTDIV = 39.0625,分离 USARTDIV 的整数部分与小数部分,整数部分为 39,即
 0x27,那么 DIV_Mantissa = 0x27;小数部分为 0.0625,转化为十六进制即 0.0625*16 = 1,所以
 DIV_Fractionp = 0x1,USART_BRR 寄存器应该赋值为 0x271,成功设置波特率为 115200。
 值得注意 USARTDIV 是允许有余数的,我们用四舍五入进行取整,这样会导致波特率会有
 所偏差,而这样的小误差是可以被允许的。
 USARTDIV=DIV_Mantissa+(DIV_Fraction/16)
 DIV_Mantissa是整数部分
 DIV_Fraction 是小数部分
波特比率寄存器 BRR
 
 
 USARTDIV=39.0625
怎么把USARTDIV的值写入USART_BRR
 小数部分就是fraction=0.0625x16+0.5
 +0.5是为了四舍五入
 最低位左移4 因为存放的12位是【15:4】 小数部分就不必修改了直接放到【3:0】
乘16和左移4位的效果是一样的
 表面看上去是
 USARTDIV*16+0.5
 因为USARTDIV=DIV_Mantissa+(DIV_Fraction/16)
 算上去就是指整数位向左移动了4位
所以来说经过一步步简化 最后得到的结果是
 
 写入寄存器的数据记录是: fck/baud+0.5
使用HAL库的好处就是会自动帮助我们设置完波特率








![java八股文面试[多线程]——Happens-Before规则](https://img-blog.csdnimg.cn/2be4216643714b4cb722d2949349742d.png)









