RX系列MCU UART空闲中断的软件实现,对于RX系列MCU,为了提高运行效率,减少CPU的占用,UART的数据接收往往和DMA功能一起使用,这样可以无需CPU的介入即可完成UART接收寄存器的数据向指定的接收缓存区的数据传送。此时,只有当预设的DMA传送buffer被填满,即DMA的传送计数器变为0时,才会产生中断。而在有些Use case中,客户需要UART接收不定长度的数据包,如果没有UART空闲检测机制,系统不会自动判断此时UART接收一帧数据已经完成。本文给出给出一个解决思路(只针对不能ELC触发定时器的UART通道。可以ELC触发定时器的UART通道可以通过接收数据后使用ELC触发定时器清零,通过定时器是否超时来判断是否完成一帧数据接收)。
01、设置一个定时器通道,在UART数据接收开始时打开(如果知道什么时候需要接收),或者一直打开(不知道数据什么时候会过来)。定时器周期判断接收DMA通道的传送数据计数器寄存器Transfer Count Register DMCRA。
02、DMCRA 的值在接收到一个字节时候就会减一,接收完一帧数据后这个值就不再变化了。
03、通过定时器周期函数去比较这个值有没有变化,可以判定一帧数据是否接收完成。建议定时器每隔1ms(这个值可以由客户的波特率设置的实际情况来定制)检查一次DMCRA寄存器里的值去判断是否接收完成。
请参考如下程序流程示意图。
下面介绍FIT模块示例配置
UART配置:使能收发by DMAC
DMAC配置:接收和发送配置到SCI9,源地址和目标地址此处随意设置,程序中可以调整。
定时器设置:
以下为实际程序代码,本文中列出关键部分(UART接收完PC发送过来的一帧数据后,回传到PC端)。
重新配置DMAC0接收源地址和目的地址:
定时器间隔中断回调函数:
UART使用DMA发送:
主程序:
实际测试结果(‘发’表示该帧数据是PC发给目标MCU的发送帧,‘收’表示该帧数据是MCU传回来的一帧数据):
来源:瑞萨MCU小百科
免责声明:本文为转载文章,转载此文目的在于传递更多信息,版权归原作者所有。本文所用视频、图片、文字如涉及作品版权问题,请联系小编进行处理(联系邮箱:cathy@eetrend.com)。