在嵌入式开发中,经常会用到串口通讯。面对不同应用场景,需要不同的方案。 今天我们来讲一下高效,可靠,安全的方案,记得看到最后,会有收获。 常见的有串口轮询模式,串口中断模式,串口DMA接收传输等等; 利用串口的空闲中断配合DMA的环形缓冲区模式,可以高效接收不固定长度的消息报文 下图中经过黄色的高电平时间空闲之后,就会产生一个空闲事件,IDLE EVENT ![]() 因为DMA功能有
举个例子; 如下图所示,这里分配了一个DMA缓冲区,大小是12字节,如果从地址1开始接收,会出现以下这两种情况;
![]() 这个思路其实我之前也有实践过,但是没有很好地利用HC和TC事件。 所以无法处理这种情况,即DMA缓冲区处于环形模式( 下面是 ![]() 再次简单介绍一下缩略词的含义;
这里简单介绍一下情况E的解决方案,上面图片最右边小图;
所以,不难发现,如果只使用空闲中断,如果需要接收的数据长度大于缓冲区,就会出现数据覆盖的情况,而加上DMA的HT和TC中断,就完美解决了这样的问题; 当然除了这些,还有很多优秀的方案,这个项目提供大量的例子。 项目地址: ![]() 目前这个项目主要支持主流的STM32芯片平台和一些开发板上的测试DEMO,具体如下所示; ![]() 相应的例子程序如下所示,除了裸机程序,还有环形缓冲区接收,轮询接收,DMA+空闲中断基于RTOS的模式接收,挺丰富的,可以参考一下; ![]() 作者在 STM32F413-Nucleo 开发板进行程序的测试,发现优化效果很不错; 在
|
|
来自: 新用户0118F7lQ > 《文件夹1》