
一、分数波特率的产生* W1 b3 ?# t$ o9 i% c% m3 o 一、接收器和发送器的波特率在USARTDIV的整数和小数寄存器中的值应设置成相同。 = ![]() 这里的fck是给外设的时钟(PCLK1用于USART2、 3、 4、 5, PCLK2用于USART1)USARTDIV是一个无符号的定点数。这12位的值设置在USART_BRR寄存器。0 C/ N3 ~) c) k, i$ q( h) e( ` g 注: 在写入USART_BRR之后,波特率计数器会被波特率寄存器的新值替换。因此,不要在通信进行中改变波特率寄存器的数值。如何从USART_BRR寄存器值得到USARTDIV 例1:5 q- k2 l; d1 V7 \ 如果 DIV_Mantissa = 27 , DIV_Fraction = 12 (USART_BRR=0x1BC),通用同步异步收发器(USART)于是:8 y( W* h6 e: v$ K3 p1 B5 u/ C( o _ Mantissa (USARTDIV) = 27 Fraction (USARTDIV) = 12/16 = 0.75 所以 USARTDIV = 27.75% o) Q0 r' k4 W% k& \1 C 例2:: Y4 h/ D% z7 }5 ~! w6 C 要求 USARTDIV = 25.62,& ` @5 M3 m$ i" | 就有:: A: W! z, S$ j$ w# B DIV_Fraction = 160.62 = 9.92 最接近的整数是: 10 = 0x0A DIV_Mantissa = mantissa (25.620) = 25 = 0x19 于是, USART_BRR = 0x19A 例3: 要求 USARTDIV = 50.992 D8 n# L" N9 i 就有: DIV_Fraction = 160.99 = 15.849 F5 M1 m) G* v- Z9 A+ S 最接近的整数是: 16 = 0x10 => DIV_frac[3:0]溢出 => 进位必须加到小数部分DIV_Mantissa = mantissa (50.990 + 进位) = 51 = 0x33 于是: USART_BRR = 0x330, USARTDIV=515 O5 a& p/ W$ d: s9 I, U0 T! x 6 a. x7 @9 b) h" Y+ } 二、设置波特率时的误差计算 # E, y. p6 Q5 f( } ![]() 注: 1. CPU的时钟频率越低,则某一特定波特率的误差也越低。可以达到的波特率上限可以由这组数据得到。6 I6 _; l3 f' R8 v( F. G 2. 只有USART1使用PCLK2(最高72MHz)。其它USART使用PCLK1(最高36MHz)。$ S Q4 K6 H5 W1 O% i" H9 f1 o 5 g8 v+ w" }5 g( b # B5 r4 q9 U/ y |
实战经验 | Keil工程使用NEAI库的异常问题
STM32 ISP IQTune:真正零门槛的免费ISP调整软件
【经验分享】STM32 新建基于STM32F40x 固件库的MDK5 工程
意法半导体MCU双供应链策略,打消中国客户后顾之忧
【经验分享】基于STM32使用HAL库实现USB组合设备CDC+MSC
2024意法半导体工业峰会:赋能智能电源和智能工业,构筑可持续未来
ST推出灵活、面向未来的智能电表通信解决方案,助力能源转型
意法半导体 x Qu-Bit Electronix:推动新一轮的数字声音合成革命
从STM32 MPU产品看嵌入式系统中微处理器的新变化
【Hot!】STM32全系列开发板都支持Arduino开发,你知道吗?