在最近使用GD32F350的时候需要将串口速率配置到4M并且是TTL电平下使用,查看数据手册发现当时钟频率为108MHz,过采样为8,最高速度可达6.75MBits/s,因此4M速率是可以达到的。
测试条件:GD32F350与STM32F103在4M下单字节通讯
问题现象:串口误码严重
最开始排查是否是传输线过长导致,缩短线距到5CM,问题没有得到解决
怀疑STM32F103这边问题,用两个STM32在4M下通讯完全没有误码现象
问题指向GD32F350,串口通过总线APB2时钟来配置速率,根据需求的波特率、过采样值和外部时钟计算得出波特率分频系数,这是一个16位的数字,包含12位整数部分和4位小数部分。波特率发生器使用这两部分组合所得的数值来确定波特率。由于具有小数部分的波特率分频系数,将使USART能够产生所有标准波特率 去配置串口整数寄存器和小数寄存器。
计算式
USARTDIV= PCLK / 过采样值 × Baud Rate
时钟树配置为:采用外部8M时钟经PLL倍频后产生108M主频,总线APB2默认最高54M,
查看发现4M串口速率不是54M的整数倍,分频系数必然产生小数部分;怀疑会导致波特率不准。
改进措施:更改主频到96M,二分频产生APB2时钟48M,满足整数倍关系。
再次测试没有出现误码情况。