1 基础知识点
DMA
DMA(Direct Memory Access),即直接内存存储,在一些数据的传输中,如串口、SPI等,采用DMA方式,传输过程不需要CPU参与,可用让CPU有更多的时间处理其他的事情。
STM32F4的DMA通道选择如下:
接下来的程序思路如下:
2 编程要点
2.1 DMA发送
2.1.1 串口DMA发送配置
由于是发送不定长的数据,先不需要配置发送的长度,在每次的发送时,再配置。
//=======================================
2.1.2 DMA发送完成中断
DMA发送完成后,触发DMA发送完成中断,这里可用释放自定义的DMA发送完成信号量,表明下次的DMA传输可用进行。
//=======================================
2.1.3 DMA发送函数接口
//=======================================
2.2 DMA接收
2.2.1 串口DMA接收配置
需要配置一个接收地址和一个接收长度,用于DMA接收数据的暂存。
//=======================================
2.2.2 串口空闲中断
串口空闲中断的作用与上一篇
码农爱学习:FreeRTOS例程3-串口中断接收不定长的数据与二值信号量的使用zhuanlan.zhihu.com介绍的一样,都是在发送完一串字符后被触发,这次由于使用了DMA接收,所以接收的数据在DMA缓冲区,且接收的数据长度可用根DMA接收通道的总长度与剩余长度的差值来计算,将接收的数据复制出来使用即可,同时释放自定义的串口空闲信号量,以便其它任务可用及时获取串口接收到的数据。
//=======================================
2.3 串口配置与测试任务
2.3.1 串口配置
基础的GPIO配置,以及串口空闲中断配置,并调用上面的串口DMA发送与接收配置。
//=======================================
2.3.2 测试任务
创建DMA发送完成信号量和串口空闲信号量,并先释放DMA发送完成信号量,用于第一次DMA发送时获取信号量。然后测试两条DMA发送不定长字符串,最后测试DMA接收不定长字符串。
//打印任务函数(测试任务)
3 实验结果
通过串口助手,可以先接收到DMA发送的两个字符串(第一条hello是测试串口的,不是DMA发的),然后通过串口调试助手发送两次nice to meet you,测试DMA接收。
hello
ma nong ai xue xi
xxpcb.github.io
receive:nice to meet you
receive:nice to meet you
完整工程代码已保存至GitHub:
https://github.com/xxpcb/FreeRTOS-STM32F407-examplesgithub.com觉得文章有用,可以关注我哟~