一:串口中断接收的通讯方式: 在STM32,串口接收数据时的经常使用的方式就是使用STM32的串口中断的方式,即串口每次接收到一个字节时候,就会产生串口中断,将接收到数据放到接收数组内,同时清除标志位。这种接收方式比较简单,之前的学习记录中也尝试过该接收方式,这种接收方式比较浪费CPU的资源。在串口通讯中,经常会遇到接收不定长的数据,这时候没有必要采用上述方式进行数据的接收处理,比如STM32的标准库和HAL中对串口接收中断的处理中,再到中断处理函数,CPU需要执行很多的程序,频繁的中断为CPU的运行增加了不少的负担,也可能会出现接收出错的情况,而且不确定接收数据长度时,也不确定处理函数应该何时进行处理。 为了解决上述问题,我们尝试使用串口的空闲中断与DMA接收数据,即开始STM32的空闲中断时,告知CPU本次接收数据完成了,可以进行下一步骤的处理;当然串口中断判断的依据,我个人的理解就是:使用串口与DMA接收字节数据时,当串口检测到在1-2个字节通讯时间内,串口没有接收到数据时,就会判定串口空闲了,使用DMA将数据拷贝到其他数据内进行处理即可。 二:使用的硬件平台: STM32:NUCLEO-U083RC开发板、编程工具使用:KEIL5.38 三:STM32cube软件配置过程: (基本的cube的使用参考之前的帖子,这里不做过多的介绍) 3.1串口的配置过程: 这里需要设置所调试的串口通讯参数、工作方式、波特率、校验位、停止位等等;为了调试方便,我这里使用的串口2可以直接与调试器的串口连接,调试代码起来很方便; 3.2 使能串口的中断: 这里需要注意一下,需要使能串口2的中断,否则串口无法接收数据 3.3 配置DMA的参数: 3.4 配置IO口的工作模式: 这样我们就把串口、DMA接收和中断的参数就配置好了,下面就可以进行软件代码的编写。 4:程序编写的基本思路: 定义一些接收数组、变量:
4.1:cube代码自动生成之后,需要手动开启接收中断和空闲中断: 如下所示:定义一下DMA接收数组的位置; 在串口初始化时候,需要使能串口的接收中断和空闲中断,在串口产生中断的时候,cpu可以调用串口中断函数
4.2编写空闲中断、DMA处理函数: 这里我们产生串口中断时候, 1:首先需要清楚空闲中断标志,以便再次进入该串口空闲中断, 2:停止DMA的接收,防止计算长度时候出错 3:计算一下DMA数据中有效数据 4:将有效数据拷贝至其他的定义的数据内,以便程序处理 5:将接收完一包有效数据的标志位置位,同时需要再次开启DMA接收, 完成代码如下所示:DMA1中断函数(程序自动生成,)
4.3 定义空闲中断回调函数: 在串口中添加上面,对空闲中断的处理:
4.4将串口接收的数据,回传到串口,即数据原路返回 在主函数中,将串口接收到的数据原路返回,
基本上,编写好以上代码,我们实现使用串口2空闲中断+DMA接收的接收不定长数据的接收,并实现数据的原路返回; 实物验证图片: |
【STM32MP257】🥳STM32MP257-DK-开发板开箱体验
刘氓兔的杂谈【001】-片上USB 高速PHY
今天下午直播 | 解析STM32U0 新一代超低功耗入门级MCU
有奖直播 | 解析STM32U0 新一代超低功耗入门级MCU
行业应用篇 | STM32U0为水气表提供降本增效新思路
【NUCLEO-WB09KE评测】+使用STM32CubeMX新建蓝牙工程
【NUCLEO-WB09KE评测】+基于STM32CubeMX创建工程点灯
刘氓兔的64位入门挑战【2】——MP257和cubemx
【NUCLEO-WB09KE评测】+实现读取温湿度传感器SHTC3数据
【NUCLEO-WB09KE评测】+实现串口printf打印和shell移植
``
感谢分享,写的非常的详细。
[md]谢谢!!!