利用空闲中断实现不定长数据的收发
一、空闲中断的特点
1. 在一帧数据传输结束后,通信线路将会维持高电平,这个状态称为空闲状态;
2. 当 CPU 检测到通信线路处于空闲状态时,且空闲状态持续时间大于一个字节传输时间时,空闲状态标志 IDLE 将由硬件置 1 。如果串口控制寄存器 CR1 中的 IDLEIE 位为 1 ,将会触发空闲中断 (IDLE 中断);
3. 由于空闲标志是在一帧数据传输完成后才置位,在有效数据传输过程中不会置位,因此借助空闲中断,可以实现不定长数据的收发。
二、空闲中断时序图
假设一帧数据由2 个字符构成,分别是 0xaa 、 0x55 ,传输的时序图如下:
从图中可以看到,在发送该帧数据之前和之后,数据线为高电平,处于 IDLE 状态。在该帧有效数据发送过程中,即 0xaa 字节与 0x55 字节之间,没有 IDLE 状态出现,这样利用 IDLE 状态就可以判断不定长数据的发送结束。
三、设计思路
1.使能 IDLE 中断,在串口 1 的中断服务程序 USART1_IRQHandler 中添加对 IDLE 中断的判断,该函数位于 stm32f4xx_it.c 文件;
2.设置传输模式为普通模式,启动 DMA 传输。串口一旦接收到数据,则触发 DMA 操作,将数据存放到用户定义的接收缓冲区;
3.当一帧数据发送完成后,线路处于 IDLE 状态,将触发 IDLE 中断,调用 IDLE 中断回调函数,设置数据接收完成标志;
4.主程序检测到接收完成标志置位后,将接收的一帧数据原样发回到PC ,并禁能 DMA ,以触发 DMA 中断。 DMA 中断将调用接收中断回调函数,在回调函数中重新启动 DMA 传输。
四、STM32CubeMX 配置
1、串口DMA配置
2、设置串口 接收 的 DMA 参数:
3、设置串口 发送 的 DMA 参数:
4、使能串口中断及DMA 中断
五、程序编写(一)
1、添加空闲中断的处理
2、添加用户宏定义及变量定义,添加用户初始化代码。
3、编写用户应用代码
4、编写回调函数
5、添加函数声明
6、下载调试
六、程序编写(二)
1、添加空闲中断的处理
2、添加用户宏定义及变量定义,添加用户初始化代码。
3、编写用户应用代码
5、编写回调函数
4、下载调试
七、程序编写(三)
1、添加用户宏定义及变量定义,添加用户初始化代码。
2、编写用户应用代码
3、编写回调函数
4、下载调试
复盘一下: 第一种方法是电子科技大学的一个老师课件里的,我照着写了一下,总会出现好多bug…,解决方法:在空闲中断回调函数那停止一下DMA传输就好了。 第二种是请教同事写的,实际项目中也用的比较多。 第三种是我详细研究了一下,看了看回调函数的实现过程,最后改良了一下,代码比较简洁,以后做项目的时候用一下试试!不知道大家喜欢哪一种? 另外我用typora写好笔记,上传后图片显示不出来…
|