AT32F403AVGT7的UART在波特率1200BPS为什么无法正常工作?

[复制链接]
 楼主| fyywhy 发表于 2022-9-15 17:25 | 显示全部楼层 |阅读模式
AT32F403AVGT7 主频工作在240MHZ时,为什么使用UART在波特率1200BPS为什么无法正常工作,在不降低主频的情况下有什么解决办法吗?
muyichuan2012 发表于 2022-9-15 19:05 | 显示全部楼层
主频在240M时,USART的分频因子无法分到1200 bps,
如果在240M时,一定要用1200 bps,建议降频或增大APB时钟分频因子。
 楼主| fyywhy 发表于 2022-9-15 19:37 | 显示全部楼层
好的,感谢解答
 楼主| fyywhy 发表于 2022-9-15 20:32 | 显示全部楼层
通过测试,确实可以通过降低主频至120MHz,uart5可以正常工作。如下所示:
  1. crm_pll_config(CRM_PLL_SOURCE_HEXT_DIV, CRM_PLL_MULT_15, CRM_PLL_OUTPUT_RANGE_GT72MHZ);

在不变主频的情况下,也可以单独增大APB时钟分频因子。如下所示:
  1. crm_apb_div_set(CRM_AHB_DIV_2);

在不变主频的情况下,还可以单独增加aph1时钟分频因子。如下所示:
  1. crm_apb1_div_set(CRM_APB1_DIV_4);

不过根本的原因还是有点疑问:
根据参考手册:
216566323189307c7e.png
如在fPCLK=120MHz时,在波特率为2400bps时,置于波特率寄存器的值为3125。
即DIV = 120 000 000 / 16 / 2400 = 3125.
那么在波特率为1200bps时.
DIV = 120 000 000 / 16 / 1200 = 6250.
5257063231aaa3bd0d.png
又因为波特比率寄存器的[15:0]为分频系数,即DIV可以设置的范围为16~65535,那么6250应该在此范围内,怎么说分频因子不对呢,还有哪个地方是我没有理解的吗?

hjl2832 发表于 2022-9-16 08:28 | 显示全部楼层
你算一下,实际波特率寄存器中的值是DIV/16值,按上面的计算,2400波特率时,DIV = 120000000/2400=50000,小于65535的,如果是1200波特率,则=100000,远大于65535,这时波特率误差超过30%了,能通信并不能保证数据100%准确。你发长数据包就会发现到后面的数据有误差。
hoop 发表于 2022-9-16 18:56 | 显示全部楼层
你的公式用错了
DIV = 120 000 000 / 16 / 1200 = 6250.——不需要除16
liaojihua2010 发表于 2022-9-17 16:00 | 显示全部楼层
楼上2位正解
lvben5d 发表于 2022-9-18 10:21 | 显示全部楼层
楼主1200如此极低的波特率 是外设模块的吗? 还是为了通信稳定,如果为了稳定,可以UART TX RX加RC,连接线外部屏蔽。
 楼主| fyywhy 发表于 2022-9-18 16:33 | 显示全部楼层
已经理解了,感谢大家的解答,用如此低的波特率是为了通信稳定,主要是使用了光耦作隔离。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

1

主题

7

帖子

0

粉丝
快速回复 返回顶部 返回列表