发新帖本帖赏金 30.00元(功能说明)我要提问
12下一页
返回列表
[方案相关]

华大HC32F460避坑之串口通讯

[复制链接]
2379|39
手机看帖
扫描二维码
随时随地手机跟帖
woai32lala|  楼主 | 2022-5-1 19:55 | 显示全部楼层 |阅读模式
本帖最后由 woai32lala 于 2022-5-1 19:55 编辑

华大HC32F460避坑之串口通讯      
#申请原创# #有奖活动#[url=home.php?mod=space&uid=760190]@21小跑堂

今天用华大的串口USART1做RS485通信,RS485电路如下图所示
19311626801601dd5b.png

一开始设置的通讯波特率为115200,串口发送数据正常,一开始以为是TVS管的结电容过大导致的发送频率上不去
然而,去掉TVS管D11之后,发送乱码问题依然没有解决。
然后再次考虑到是因为是因为控制接收和发送的PMOS管电平逻辑不对导致的,用示波器测得0-2.2V
86384626802151f82a.png
SSP485芯片DE输入高电平为大于2V即可,因此不是发送引脚这边的电路问题。
我试着降低波特率,改为9600后,示波器直接测不出发送方波,这开始让我怀疑不是电路的问题,而是软件的问题。 15676626df10f1bf66.png 8284626df12e2b7b2.png 3460626df90671e16.png
我进行软件单步调试,运行了串口初始化函数USART_UART_Init
串口初始化这边返回OK
说明底层硬件外设是没有问题的,然后单步运行到下一步,设置波特率这一段,出现了问题,设置波特率返回error,测发送的波特率跟实际测得的每个周期长度也不一样,问题应该是出现在波特率设置了

看错误运行的断点,有这么一句话,找到了问题,波特率的整数部分不能超过255,小数部分不能小于0
90474626df2d18546a.png
而我设置的9600的波特率
9811626df49c5cfa2.png 75054626df4df04b0d.png 87975626df5365e704.png
选择的是内部时钟,分频PLCK1/1,
根据公式     DIV = ((float)C / ((float)B * 8.0f * (2.0f - (float)OVER8))) - 1.0f;
C = 1000000  B= 9600 OVER8= 1
算出来的整数部分为1301,这不出错都不行。
59639626dfa3207344.png 我又将波特率设置为115200,
46607626df5dbb6084.png 9445626df63649b1b.png
得到整数部分是107,设置波特率返回值也是OK
看公式得知,波特率越高,DIV的整数部分越小,就会在他的判断成功条件以内。
那现在该怎么解决呢,根据公式,我们可以改变时钟的频率,那么时钟频率为多少和合适呢
我们通常采用最低的波特率9600,我就根据9600的波特率来算,DIV  设置为255
255 = (C/(9600 * 8 * 1) - 1;
得出C = 19,507,200
也就是说,要想得到4800的波特率,我们给波特率的时钟频率不能超过这数。
我们采用的是串口1,串口1的时钟来源选择的是PLCK1,我们的是中最高频率为100M
28962626df808b7b36.png
要想小于19,507,200这个频率,我们要分频,分频1248163264这些可选择
那我们选择16分频,得出的时钟频率为6.25M
97105626df8855a5b1.png
然后我们串口的波特率设置为9600,再次进行调试
27813626df93e23d61.png
时钟分频和波特率都设置正常,正常的波特率波形也出来了。
以上就是华大HC32F460避坑之串口通讯的总结,还是要多看看数据手册,祝大家五一快乐!






75123626df22902807.png
69658626df3355b7ed.png
98037626df4dcdef8d.png

使用特权

评论回复

打赏榜单

21小跑堂 打赏了 30.00 元 2022-05-11
理由:恭喜通过原创文章审核!请多多加油!

评论
21小跑堂 2022-5-11 13:48 回复TA
感谢分享串口调试的BUG及解决指南,这种情况如果实际存在,应该是底层库的BUG,串口的波特率在9600应该不用任何修改直接设置就可使用,如果时钟周期是小数,单片机会自动寻找一个最接近的数,导致实际波特率会有一点偏差,但是一般都会在误码率允许范围之内。可向小华相关技术支持获取帮助,或更新底层库进行尝试。 
littlelida| | 2022-5-5 10:05 | 显示全部楼层
串口会有问题?

使用特权

评论回复
sjnh| | 2022-5-5 10:18 | 显示全部楼层

本人没发现问题,就是2个注意,一个是楼主说的设置波特率如果速率低了库函数有bug需要注意,另一个是460系列串口发送完中断标志是不可软件清除的,跟它自家的M0系列、其它家都不一样

使用特权

评论回复
azrm| | 2022-5-5 11:52 | 显示全部楼层
用了4个串口,暂时没有发现问题。遇到不清楚的看官方历程,自己再摸索摸索就行了。

使用特权

评论回复
caigang13| | 2022-5-5 21:27 | 显示全部楼层
哈哈,感谢分享避坑经验。

使用特权

评论回复
weifeng90| | 2022-5-6 07:53 | 显示全部楼层
哈哈,学到了。

使用特权

评论回复
woai32lala|  楼主 | 2022-5-6 15:27 | 显示全部楼层
可能大家的底层库不一样,但目前我用过的是2.1的,我确实是遇到了这个问题,通过这么修改是解决了。

使用特权

评论回复
两只袜子| | 2022-5-6 16:21 | 显示全部楼层
非常感谢楼主分享的避坑经验,值得学习

使用特权

评论回复

使用特权

评论回复
a15963254| | 2022-5-17 00:51 | 显示全部楼层
有BootLoader串口升级的例子吗付费购买

使用特权

评论回复
评论
请叫我污春 2022-5-17 15:26 回复TA
感谢楼主分享,确实有用 
lvyunhua| | 2022-5-21 22:09 | 显示全部楼层
不错,学习了

使用特权

评论回复
tpgf| | 2022-6-1 12:56 | 显示全部楼层
这个经验非常不错 哈 可以避开很多问题

使用特权

评论回复
drer| | 2022-6-1 13:34 | 显示全部楼层
完美避过坑哈

使用特权

评论回复
qcliu| | 2022-6-1 13:54 | 显示全部楼层
这个高电平有点低哈

使用特权

评论回复
coshi| | 2022-6-1 14:06 | 显示全部楼层
介绍的太详细啦

使用特权

评论回复
kxsi| | 2022-6-1 14:16 | 显示全部楼层
有时候也可以发外包

使用特权

评论回复
wiba| | 2022-6-1 14:32 | 显示全部楼层
看来还是有很多细微的地方不同啊

使用特权

评论回复
carpsnow| | 2022-6-19 11:32 | 显示全部楼层
串口一直跑,看了这个帖子,又回去看自己的代码了~~~

使用特权

评论回复
SUNKE9| | 2024-4-7 08:33 | 显示全部楼层
昨天要用31250这个MIDI的波特率发现不正常,于是改了几个波特率,发现正常的38400以上能用,以下就都不能用了,于是百度到这里了。

使用特权

评论回复
woai32lala|  楼主 | 2024-4-7 12:43 | 显示全部楼层
SUNKE9 发表于 2024-4-7 08:33
昨天要用31250这个MIDI的波特率发现不正常,于是改了几个波特率,发现正常的38400以上能用,以下就都不能用 ...

所以呢,成功了么

使用特权

评论回复
发新帖 本帖赏金 30.00元(功能说明)我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

105

主题

528

帖子

5

粉丝