有部分客户在使用HK32F103系列芯片的串口通讯时,偶尔出现数据错误的原因具体有以下几点:
1.串口通讯时因为可能存在累计误差偶尔造成数据错误。
2.用户在配置串口波特率参数时因为HK有细微地方与ST不同。
下面就以上原因,用户根据如下修改,可以使串口通讯正常工作。
对于波特率累计误差,用户可以采用三种方式来解决:
1. 修改STOP bit位数,把stop bit设成0.5,但是我们芯片的发送stop bit宽度也会变成0.5。这种方法要注意的是:对方芯片有可能无法接受0.5 stop bit。
2.把波特率设置稍微提高1%左右。比如对方发出115200bps,HK的芯片波特率需要设置为115200*1.01=116352bps(偏差小于1%)。
3.建议HK芯片和对方发送数据时,都不要背靠背发送。
关于上述第二种波特率参数配置,主要是用户需要较高的波特率时,导致波特率配置寄存器的整数部分为1,还存在小数部分的情况。这时HK芯片对小数部分会被忽略掉,导致USART输出的bit宽度不对。出现这种应用时,用户需要调整USART工作频率和波特率的关系,避免波特率配置寄存器的整数部分为1,还存在小数部分。
另外应用串口(USART)还应注意以下2点:
1.串口USART RX IDLE中断问题
用户串口通讯打开了RX IDLE中断后出现反复进入的原因是因为IDLE中断标志不能清除。
解决方法:
Step 1. 关闭IDLE 中断.
Step 2. 在RXNE 事件后:
A. 清除IDLE标志.
B. 然后使能IDLE中断.
Step 3. 在IDLE中断触发后: 除能IDLE中断.
2.串口USART使用DMA传输时, DMA通道关闭后DMA_CNDTRn值Reload的问题。
这个与我们HK的DMA设置与ST略有不同,HK的DMA通道在关闭后,对应的DMA_CNDTRn的值会被重新加载为本次发送开始前用户配置的值(即已经发送的数据个数)。如果客户在dma发送完成后关闭了对应的通道,然后读取其DMA_CNDTRn的值就会出现非零值。如果用户想要使用拼接方式发送数据(在一次数据未发完前追加新的数据发送)且前一次数据已发送完成的情况下就会出现错误的数据拼接。
处理数据拼接的解决方案:
如果是单次数据发送模式,用户在DMA数据发送完成后不用关闭DMA通道,在追加新的数据发送时,先在未关闭DMA通道的情况下调用库函数读出DMA_CNDTRn寄存器的值,再关闭DMA通道,然后追加新的数据到缓存buffer(可能是用户在RAM中定义的一个数组),再启用DMA发送,这样来完成数据的拼接发送。
来源:航顺芯片
审核编辑:汤梓红
-
寄存器
+关注
关注
31文章
5336浏览量
120230 -
串口
+关注
关注
14文章
1551浏览量
76427 -
USART
+关注
关注
1文章
195浏览量
30835
发布评论请先 登录
相关推荐
评论