华大HC32F460避坑之串口通讯
本帖最后由 woai32lala 于 2022-5-1 19:55 编辑华大HC32F460避坑之串口通讯
#申请原创# #有奖活动#@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 = 1000000B= 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这个频率,我们要分频,分频1,2,4,8,16,32,64这些可选择
那我们选择16分频,得出的时钟频率为6.25M
然后我们串口的波特率设置为9600,再次进行调试
时钟分频和波特率都设置正常,正常的波特率波形也出来了。
以上就是华大HC32F460避坑之串口通讯的总结,还是要多看看数据手册,祝大家五一快乐!
串口会有问题? littlelida 发表于 2022-5-5 10:05
串口会有问题?
本人没发现问题,就是2个注意,一个是楼主说的设置波特率如果速率低了库函数有bug需要注意,另一个是460系列串口发送完中断标志是不可软件清除的,跟它自家的M0系列、其它家都不一样 用了4个串口,暂时没有发现问题。遇到不清楚的看官方历程,自己再摸索摸索就行了。 哈哈,感谢分享避坑经验。 哈哈,学到了。 可能大家的底层库不一样,但目前我用过的是2.1的,我确实是遇到了这个问题,通过这么修改是解决了。 非常感谢楼主分享的避坑经验,值得学习 有BootLoader串口升级的例子吗付费购买 不错,学习了 这个经验非常不错 哈 可以避开很多问题 完美避过坑哈 这个高电平有点低哈 介绍的太详细啦 有时候也可以发外包 看来还是有很多细微的地方不同啊 串口一直跑,看了这个帖子,又回去看自己的代码了~~~ 昨天要用31250这个MIDI的波特率发现不正常,于是改了几个波特率,发现正常的38400以上能用,以下就都不能用了,于是百度到这里了。 SUNKE9 发表于 2024-4-7 08:33
昨天要用31250这个MIDI的波特率发现不正常,于是改了几个波特率,发现正常的38400以上能用,以下就都不能用 ...
所以呢,成功了么