DMA的作用
DMA(Direct Memory Access)—直接存储器存取,是单片机的一个外设,它的主要功能是用来搬数据, 但是不需要占用CPU,即在传输数据的时候,CPU可以干其他的事情,好像是多线程一样。 数据传输支持从外设到存储器或者存储器到存储器,这里的存储器可以是SRAM或者是FLASH。 DMA控制器包含了DMA1和DMA2,其中DMA1有7个通道,DMA2有5个通道,这里的通道可以理解为传输数据的一种管道。要注意的是DMA2只存在于大容量的单片机中。
DMA外设要点概括
对于dma这个器件,就是建立起一个数据传输的通道
DMA的主要特性
主要有7各通道,源和目标的确立就是根据传输模式来选择
例如串口接收数据,将数据放到内存里就要通过DMA,外设到存储器的模式
例如存储器的数据,发送到外设里,通过串口的发送,用DMA来建立通道
存储器和存储器之间就相当于复制
dma传输的步骤
建立传输通道
存储器-》存储器
外设-》存储器
存储器-》外设
确立传输对象
具体功能
uart(源)–内存(目标)
内存数据给uart
敲定传输细节
确定由谁来发生dma请求,外设的dma请求对应通道
优先级
确定传输数据双方的数据格式
一般传输、循环传输
例如,如果使用adc器件,就需要不停采集,就需要循环传输
是否需要传送标志或者中断
HAL库中外设驱动的实现
句柄结构体 ——handletypedef
instance 它指向了外设内,一个具体的外设成员,如adc里的ADC1
,实例化一个具体的外设对象,实际上它用指针指向一个外设基地址
Init 指向了一个具体外设的初始化结构体,用来配置外设的工作参数
initTypedef 具体外设对象的初始化参数,
根据外设的各种配置寄存器,组织起来的外设参数配置结构体,内附在——handletypedef
DMA外设请求
串口不同选择的通道不同,instance确定外设具体的传输对象,对应外设请求
这张图主要是描述了DMA的工作模式主要是
存储器到存储器
外设到存储器
存储器到外设
HAL库的配置
1 先配置rcc–在clock里面变成HSE,72MHZ
2 在配置sys-变成serial wires模式
3 配置DMA
(1)如果是内存到内存,先点击DMA可以直接是如图软件内存到内存
(2) 配置外设为usart1,是外设到内存还是内存到外设,然后之间传输 的是字节还是half word,还有内存和外设之间的自增值
4 在配置串口的时候,一定记住配置成异步模式
然后是初始化的代码
void USART_DMA_Config(void)
{
DEBUG_USART_DMA_CLK_ENABLE();
DMA_Handle.Instance=DEBUG_USART_DMA_STREAM; //数据流选择
DMA_Handle.Init.Direction=DMA_MEMORY_TO_PERIPH; //存储器到外设HAL_DMA_Init(&DMA_Handle);
DMA_Handle.Init.PeriphInc=DMA_PINC_DISABLE; //外设非增量模式/* Associate the DMA handle */
DMA_Handle.Init.MemInc=DMA_MINC_ENABLE; //存储器增量模式__HAL_LINKDMA(&UartHandle, hdmatx, DMA_Handle);
DMA_Handle.Init.PeriphDataAlignment=DMA_PDATAALIGN_BYTE; //外设数据长度:8位
DMA_Handle.Init.MemDataAlignment=DMA_MDATAALIGN_BYTE; //存储器数据长度:8位
DMA_Handle.Init.Mode=DMA_NORMAL; //外设普通模式
DMA_Handle.Init.Priority=DMA_PRIORITY_MEDIUM; //中等优先级
HAL_DMA_Init(&DMA_Handle);
/* Associate the DMA handle */
__HAL_LINKDMA(&UartHandle, hdmatx, DMA_Handle);
}
以上代码是存储器到外设里面init的初始化
在代码片,会用到的函数