打印

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

[复制链接]
4106|8
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
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可以正常工作。如下所示:
crm_pll_config(CRM_PLL_SOURCE_HEXT_DIV, CRM_PLL_MULT_15, CRM_PLL_OUTPUT_RANGE_GT72MHZ);

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

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

不过根本的原因还是有点疑问:
根据参考手册:

如在fPCLK=120MHz时,在波特率为2400bps时,置于波特率寄存器的值为3125。
即DIV = 120 000 000 / 16 / 2400 = 3125.
那么在波特率为1200bps时.
DIV = 120 000 000 / 16 / 1200 = 6250.

又因为波特比率寄存器的[15:0]为分频系数,即DIV可以设置的范围为16~65535,那么6250应该在此范围内,怎么说分频因子不对呢,还有哪个地方是我没有理解的吗?

使用特权

评论回复
5
hjl2832| | 2022-9-16 08:28 | 只看该作者
你算一下,实际波特率寄存器中的值是DIV/16值,按上面的计算,2400波特率时,DIV = 120000000/2400=50000,小于65535的,如果是1200波特率,则=100000,远大于65535,这时波特率误差超过30%了,能通信并不能保证数据100%准确。你发长数据包就会发现到后面的数据有误差。

使用特权

评论回复
6
hoop| | 2022-9-16 18:56 | 只看该作者
你的公式用错了
DIV = 120 000 000 / 16 / 1200 = 6250.——不需要除16

使用特权

评论回复
7
liaojihua2010| | 2022-9-17 16:00 | 只看该作者
楼上2位正解

使用特权

评论回复
8
lvben5d| | 2022-9-18 10:21 | 只看该作者
楼主1200如此极低的波特率 是外设模块的吗? 还是为了通信稳定,如果为了稳定,可以UART TX RX加RC,连接线外部屏蔽。

使用特权

评论回复
9
fyywhy|  楼主 | 2022-9-18 16:33 | 只看该作者
已经理解了,感谢大家的解答,用如此低的波特率是为了通信稳定,主要是使用了光耦作隔离。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

1

主题

7

帖子

0

粉丝