123下一页
返回列表 发新帖我要提问本帖赏金: 30.00元(功能说明)

[方案相关] 华大HC32F460避坑之串口通讯

[复制链接]
7765|52
 楼主| 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
理由:恭喜通过原创文章审核!请多多加油!

评论

感谢分享串口调试的BUG及解决指南,这种情况如果实际存在,应该是底层库的BUG,串口的波特率在9600应该不用任何修改直接设置就可使用,如果时钟周期是小数,单片机会自动寻找一个最接近的数,导致实际波特率会有一点偏差,但是一般都会在误码率允许范围之内。可向小华相关技术支持获取帮助,或更新底层库进行尝试。  发表于 2022-5-11 13:48
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 来自手机 | 显示全部楼层
非常感谢楼主分享的避坑经验,值得学习
小华单片机代理 发表于 2022-5-9 15:05 | 显示全部楼层
a15963254 发表于 2022-5-17 00:51 | 显示全部楼层
有BootLoader串口升级的例子吗付费购买

评论

感谢楼主分享,确实有用  发表于 2022-5-17 15:26
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以上能用,以下就都不能用 ...

所以呢,成功了么
您需要登录后才可以回帖 登录 | 注册

本版积分规则

108

主题

559

帖子

6

粉丝
快速回复 在线客服 返回列表 返回顶部