STM32F4无人机实现串口+DMA数据收发
更多交流欢迎作者抖音号:81849645041
目的
了解DMA 的工作原理,通过配置 STM32F407 芯片的DMA,来完成通过 DMA 实现串口数据收发的基础实验。
原理
基于USART的数据通讯中采用中断方式可以在接收到信息或需要发送数据时产生中断,在中断服务程序中完成数据的接收与发送。但是中断方式的CPU使用率要高。在简单的系统中,使用中断方式确实是一种好方法。但是在复杂的系统中,处理器需要处理串行口通信,多个传感器数据的采集以及处理,牵扯到多个中断的优先级分配问题。为了保证数据发送与接收的可靠性,需要把USART的中断优先级设计较高,但是系统可能还有其他的需要更高优先级的中断,必须保证其定时的准确,这样就有可能造成串行通讯的中断不能及时响应,从而造成数据丢失。 为了保证串行通讯的数据及时可靠的接收,同时兼顾其它任务不受影响,采用了基于DMA和中断方式相结合的USART串行通信方式。
DMA,全称:Direct Memory Access,直接存储器访问用于在外设与存储器之间以及存储器与存储器之间提供高速数据传输。可以在无需任何 CPU 操作的情况下通过 DMA 快速移动数据。这样节省的 CPU 资源可供其它操作使用。
DMA 控制器基于复杂的总线矩阵架构,将功能强大的双 AHB 主总线架构与独立的 FIFO 结合在一起,优化了系统带宽。
STM32F4xx 有两个 DMA 控制器总共有 16 个数据流(每个控制器 8 个),每一个 DMA 控制器都用于管理一个或多个外设的存储器访问请求。每个数据流总共可以有多达 8 个通道(或称请求)。每个通道都有一个仲裁器,用于处理 DMA 请求间的优先级。
DMA 控制器执行直接存储器传输:因为采用 AHB 主总线,它可以控制 AHB 总线矩阵来启动 AHB 事务。
它可以执行下列事务:
● 外设到存储器的传输
● 存储器到外设的传输
● 存储器到存储器的传输
DMA寄存器包括:低中断状态寄存器(DMA_LISR)、高中断状态寄存器(DMA_HISR)、低中断标志清零寄存器(DMA_LIFCR)、高中断标志清零寄存器(DMA_HIFCR)、数据流x配置寄存器(DMA_SxCR)、数据流x数据项数寄存器(DMA_SxNDTR)、数据流x外设地址寄存器(DMA_SxPAR)、数据流x存储器0地址寄存器(DMA_SxM0AR)、数据流x存储器1地址寄存器(DMA_SxM1AR)、数据流xFIFO控制寄存器(DMA_SxFCR)。
低中断状态寄存器(DMA_LISR):
高中断状态寄存器(DMA_HISR):
数据流x配置寄存器(DMA_SxCR):
数据流x数据项数寄存器(DMA_SxNDTR):
数据流x外设地址寄存器(DMA_SxPAR):
说明:以上介绍的是DMA常用的一部分寄存器,具体详细资料请参照STM32F4xx参考手册。
准备
MDK5开发环境的成功安装。
STM32F4xx标准外设库。
STM32F407飞控板。
STM32F4xx 参考手册。
飞控板电路原理图。
串口调试助手软件。
USB转TTL模块。
步骤
查看 STM32F407数据表的时钟框图,了解到 DMA 连接在AHB1时钟线上,因此若使用 DMA 必须打开 AHB1时钟。
查看STM32F407 参考手册 DMA 通道列表可知,串口1的RX在DMA2上的数据流2通道4以及数据流5通道4、TX在DMA2的数据流7通道4(在这里串口1RX选用的是数据流2通道4)。
在工程中新建两个文件分别命名为bsp_usart_dma.c和bsp_usart_dma.h,并将文件保存并添加在该工程文件夹中。
在bsp_usart_dma.c文件中添加相应头文件
在bsp_usart_dma.c文件中定义接收缓冲区结构体变量,定义USART1_DMA2_Init()函数。
在USART1_DMA2_Init()函数中实现串口的DMA接收数据的配置。
第一步:使能DMA2的时钟
第二步:定义DMA_InitStruct_TX结构体变量并初始化DMA2_Stream7
第三步:配置DMA串口发送完成中断
第四步:定义DMA_InitStruct_RX结构体变量并初始化DMA2_Stream2,使能DMA2_Stream2
第五步:使能USART的DMA接口、使能串口1
在bsp_usart_dma.c文件中定义DMA2_Stream7传输完成中断服务函数
在bsp_usart_dma.c文件中定义数据解析函数,将rx_buf缓冲区数据拷贝到tx_buf中,再通过DMA2_Stream7将输出传输到串口发送寄存器中,最后在串口助手中显示出来。
在bsp_dma.h文件中定义结构体进行函数声明。
在main.c文件中调用相关函数。
第一步:引用相关的头文件
第二步:初始化滴答定时器、串口以及串口的DMA
第三步:记录开始时间,第四步:调用数据解析函数。
现象
将程序下载到开发板后,打开串口调试助手,多字符串发送数据,自动循环发送,虽然发送间隔为30ms,解析间隔为50ms,但由于DMA缓冲区的存在,可以保证数据全部被正确接收,接收缓冲区中显示了DMA接收到并发送出来的数据。
2024最新激活全家桶教程,稳定运行到2099年,请移步至置顶文章:https://sigusoft.com/99576.html
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。 文章由激活谷谷主-小谷整理,转载请注明出处:https://sigusoft.com/97351.html