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

华大HC32F460避坑之串口通讯

[复制链接]
4724|52
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
本帖最后由 woai32lala 于 2022-5-1 19:55 编辑

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

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


一开始设置的通讯波特率为115200,串口发送数据正常,一开始以为是TVS管的结电容过大导致的发送频率上不去
然而,去掉TVS管D11之后,发送乱码问题依然没有解决。
然后再次考虑到是因为是因为控制接收和发送的PMOS管电平逻辑不对导致的,用示波器测得0-2.2V

SSP485芯片DE输入高电平为大于2V即可,因此不是发送引脚这边的电路问题。
我试着降低波特率,改为9600后,示波器直接测不出发送方波,这开始让我怀疑不是电路的问题,而是软件的问题。
我进行软件单步调试,运行了串口初始化函数USART_UART_Init
串口初始化这边返回OK
说明底层硬件外设是没有问题的,然后单步运行到下一步,设置波特率这一段,出现了问题,设置波特率返回error,测发送的波特率跟实际测得的每个周期长度也不一样,问题应该是出现在波特率设置了

看错误运行的断点,有这么一句话,找到了问题,波特率的整数部分不能超过255,小数部分不能小于0

而我设置的9600的波特率

选择的是内部时钟,分频PLCK1/1,
根据公式     DIV = ((float)C / ((float)B * 8.0f * (2.0f - (float)OVER8))) - 1.0f;
C = 1000000  B= 9600 OVER8= 1
算出来的整数部分为1301,这不出错都不行。
我又将波特率设置为115200,

得到整数部分是107,设置波特率返回值也是OK
看公式得知,波特率越高,DIV的整数部分越小,就会在他的判断成功条件以内。
那现在该怎么解决呢,根据公式,我们可以改变时钟的频率,那么时钟频率为多少和合适呢
我们通常采用最低的波特率9600,我就根据9600的波特率来算,DIV  设置为255
255 = (C/(9600 * 8 * 1) - 1;
得出C = 19,507,200
也就是说,要想得到4800的波特率,我们给波特率的时钟频率不能超过这数。
我们采用的是串口1,串口1的时钟来源选择的是PLCK1,我们的是中最高频率为100M

要想小于19,507,200这个频率,我们要分频,分频1248163264这些可选择
那我们选择16分频,得出的时钟频率为6.25M

然后我们串口的波特率设置为9600,再次进行调试

时钟分频和波特率都设置正常,正常的波特率波形也出来了。
以上就是华大HC32F460避坑之串口通讯的总结,还是要多看看数据手册,祝大家五一快乐!






75123626df22902807.png (70.69 KB )

75123626df22902807.png

69658626df3355b7ed.png (69.5 KB )

69658626df3355b7ed.png

98037626df4dcdef8d.png (91.24 KB )

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个串口,暂时没有发现问题。遇到不清楚的看官方历程,自己再摸索摸索就行了。

使用特权

评论回复
5
caigang13| | 2022-5-5 21:27 | 只看该作者
哈哈,感谢分享避坑经验。

使用特权

评论回复
6
weifeng90| | 2022-5-6 07:53 | 只看该作者
哈哈,学到了。

使用特权

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

使用特权

评论回复
8
两只袜子| | 2022-5-6 16:21 | 只看该作者
非常感谢楼主分享的避坑经验,值得学习

使用特权

评论回复
9

使用特权

评论回复
10
a15963254| | 2022-5-17 00:51 | 只看该作者
有BootLoader串口升级的例子吗付费购买

使用特权

评论回复
评论
请叫我污春 2022-5-17 15:26 回复TA
感谢楼主分享,确实有用 
11
lvyunhua| | 2022-5-21 22:09 | 只看该作者
不错,学习了

使用特权

评论回复
12
tpgf| | 2022-6-1 12:56 | 只看该作者
这个经验非常不错 哈 可以避开很多问题

使用特权

评论回复
13
drer| | 2022-6-1 13:34 | 只看该作者
完美避过坑哈

使用特权

评论回复
14
qcliu| | 2022-6-1 13:54 | 只看该作者
这个高电平有点低哈

使用特权

评论回复
15
coshi| | 2022-6-1 14:06 | 只看该作者
介绍的太详细啦

使用特权

评论回复
16
kxsi| | 2022-6-1 14:16 | 只看该作者
有时候也可以发外包

使用特权

评论回复
17
wiba| | 2022-6-1 14:32 | 只看该作者
看来还是有很多细微的地方不同啊

使用特权

评论回复
18
carpsnow| | 2022-6-19 11:32 | 只看该作者
串口一直跑,看了这个帖子,又回去看自己的代码了~~~

使用特权

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

使用特权

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

所以呢,成功了么

使用特权

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

本版积分规则

107

主题

534

帖子

5

粉丝