FIFO用于在源数据传输到目标之前临时存储这些数据。通过不同FIFO配置,可以管理数据发送形式。
DMA使用框架
1、建立(选取)传输通道
存储器->存储器
外设->存储器
存储器->外设
2、确定传输对象
具体的功能:
UART(源)-内存(目标)
内存数据(源)-UART(目标)
3、敲定传输细节
确定由谁来产生DMA请求,外设的DMA请求对应通道
通道优先级
确定传输数据双方的数据格式
确定数据是否需要一直采集(循环模式是否使能)
是否需要传输标志\中断
DMA请求映射表
双缓冲区模式
DMA可以分时的去填充两块存储区,CPU可以避开正在填充的那一块,处理已经填充好的那一块存储区域,这样可以加快数据的处理,提高程序执行的效率。
FIFO的功能作用
FIFO是一个缓冲区,用于在源数据传输到目标之前临时存储这些数据。同时它也有数据处理的作用
单次传输和突发传输
单次传输->1个请求->1次传输
突发传输->1个请求->多次传输 配合FIFO使用
HAL库外设驱动的实现
1、句柄结构体(xx_HandleTypeDef):
instance:它指向了外设内,一个具体的外设成员。如:ADC里的ADC1、ADC2、UART里的UART1、UART2、DMA的Channel1、Channel2,实际上它用指针指向一个外设基地址。
Init:指向了一个具体外设的初始化结构体,用来配置外设的工作参数。
2、初始化结构体(xx_InitTypeDef):
根据外设的各种配置寄存器,组织起来的外设参数配置结构体,内附在xx_HandleTypeDef结构体中
它们之间的关系如下:
回调函数如何执行的?
中断->中断处理函数->传入句柄结构体->回调函数(自己定义,有点类似触发器)
使用HAL库配置串口DMA请求
DMA-存储器到存储器模式
用CubeMX配置好后,只修改主函数配置,完成DMA存储器-存储器模式
数组比较函数
这里解释一下传输流标志DMA_FLAG_
DMA_FLAG_TCIF0_4就是指DMA的Stream0或Stream4, DMA_FLAG_TCIF1_5就是指DMA的Stream1或Stream5
DMA_FLAG_TCIF2_6就是指DMA的Stream2或Stream6, DMA_FLAG_TCIF3_7就是指DMA的Stream3h或Stream7。
对应DMA请求映射表找到相应的流
DMA-存储器到外设模式
CubeMX生成的串口初始化函数
这些配置CubeMX都已经帮我们配置好了,我们只在主函数做修改,达到相应的功能
实验结果