STM32F103 学习笔记-22-DMA(第1节)-DMA功能框图讲解和DMA初始化结构体讲解
一、DMA 简介DMA (Direct Memory Access直接存储器访问) 是 STM32F103 系列微控制器内置的一个独立外设其核心功能是在不占用 CPU 资源的情况下实现数据在存储器与外设之间、存储器与存储器之间的高速传输。1.1 核心优势传统的数据传输方式需要 CPU 主动参与将数据从源地址读取到内核寄存器再写入目标地址整个过程 CPU 被完全占用。而 DMA 传输时CPU 只需配置传输参数并启动 DMA之后 DMA 控制器会自动完成数据搬运CPU 可以并行执行其他任务极大提高了系统效率。1.2 支持的传输方向DMA 支持三种数据传输模式存储器到存储器 (Memory-to-Memory, M2M)数据在内部 Flash、SRAM 之间传输外设到存储器 (Peripheral-to-Memory, P2M)典型应用如 ADC 采集数据到 SRAM存储器到外设 (Memory-to-Peripheral, M2P)典型应用如 SRAM 中的数据通过串口发送1.3 DMA 控制器与通道STM32F103 系列包含两个 DMA 控制器DMA1拥有 7 个独立通道支持所有三种传输模式DMA2拥有 5 个独立通道支持所有三种传输模式重要说明DMA2 仅存在于大容量产品Flash 容量 256KB~512KB和互联型产品STM32F105/F107 系列中。指南者和霸道开发板使用的 STM32F103ZET6 属于大容量产品因此同时具备 DMA1 和 DMA2。二、DMA 功能框图详解DMA 功能框图主要由三部分组成DMA 请求、通道和仲裁器。2.1 DMA 请求DMA 传输必须由请求源触发。对于 P2M 和 M2P 模式请求源只能是外设对于 M2M 模式由软件触发。当外设需要进行 DMA 传输时会向对应的 DMA 通道发送请求信号。DMA 控制器接收到请求后若通道空闲则启动数据传输。2.2 DMA 通道DMA 通道可以理解为独立的数据传输管道每个通道都有自己的配置寄存器可以独立配置传输方向、数据宽度、地址增量等参数。2.2.1 DMA1 通道映射DMA1 通道外设请求源通道 1ADC1、TIM2_CH3、TIM4_CH1通道 2SPI1_RX、TIM1_CH1、TIM2_UP、TIM3_CH1通道 3SPI1_TX、TIM1_CH2、TIM2_CH2、TIM3_CH2通道 4SPI2_RX、USART1_TX、TIM1_CH4、TIM1_TRIG、TIM3_CH3通道 5SPI2_TX、USART1_RX、TIM1_UP、TIM3_CH4、TIM3_TRIG通道 6USART2_RX、TIM1_CH1、TIM2_CH4通道 7USART2_TX、TIM1_CH2、TIM2_CH1、TIM4_CH22.2.2 DMA2 通道映射DMA2 通道外设请求源通道 1ADC3、TIM5_CH4、TIM8_CH3通道 2SPI3_RX、TIM5_CH3、TIM8_CH4、TIM8_TRIG通道 3SPI3_TX、TIM5_CH2、TIM8_CH1通道 4UART4_RX、SDIO、TIM5_CH1、TIM8_CH2通道 5UART4_TX、TIM5_UP、TIM6_UP/DAC_CH1、TIM7_UP/DAC_CH2、TIM8_UP特殊说明存储器到存储器(M2M)模式不受上述通道映射限制可以使用 DMA1 和 DMA2 的任意通道。2.3 DMA 仲裁器当多个 DMA 通道同时产生传输请求时仲裁器负责决定哪个通道优先获得总线使用权。仲裁规则分为两个阶段软件优先级阶段通过 DMA_CCRx 寄存器的 PL[1:0] 位配置分为四个等级00低优先级01中优先级10高优先级11最高优先级硬件优先级阶段当两个通道的软件优先级相同时通道编号小的优先级更高。例如DMA1 通道 4 的优先级高于 DMA1 通道 7。跨控制器优先级DMA1 的所有通道优先级均高于 DMA2 的通道。三、DMA 初始化结构体详解STM32 标准外设库使用DMA_InitTypeDef结构体来配置 DMA 参数该结构体定义在stm32f10x_dma.h文件中。3.1 数据从哪里来要到哪里去这部分由结构体的前三个成员决定typedef struct { uint32_t DMA_PeripheralBaseAddr; // 外设基地址 uint32_t DMA_MemoryBaseAddr; // 存储器基地址 uint32_t DMA_DIR; // 数据传输方向 // ... 其他成员 } DMA_InitTypeDef;DMA_PeripheralBaseAddr配置 DMA_CPAR 寄存器指定外设数据寄存器的地址。例如串口发送时应设置为(uint32_t)USART1-DR。DMA_MemoryBaseAddr配置 DMA_CMAR 寄存器指定存储器的起始地址。例如发送数组时应设置为数组名数组首地址。DMA_DIR配置 DMA_CCR 寄存器的 DIR 位位 4指定数据传输方向DMA_DIR_PeripheralDST外设作为目标地址M2P 模式DMA_DIR_PeripheralSRC外设作为源地址P2M 模式M2M 模式说明除了配置上述三个成员外还需要单独配置 DMA_CCR 寄存器的 MEM2MEM 位位 14为 1即设置结构体成员DMA_M2M DMA_M2M_Enable。3.2 数据要传多少传的单位是什么这部分由以下五个成员决定uint32_t DMA_BufferSize; // 传输数据数目 uint32_t DMA_PeripheralInc; // 外设地址增量模式 uint32_t DMA_MemoryInc; // 存储器地址增量模式 uint32_t DMA_PeripheralDataSize; // 外设数据宽度 uint32_t DMA_MemoryDataSize; // 存储器数据宽度DMA_BufferSize配置 DMA_CNDTR 寄存器指定一次传输的数据单元数目。该寄存器为 16 位因此最大传输数目为65535。DMA_PeripheralInc配置 DMA_CCR 寄存器的 PINC 位位 6指定外设地址是否自动递增DMA_PeripheralInc_Enable每次传输后外设地址自动加 1DMA_PeripheralInc_Disable外设地址保持不变适用于单个数据寄存器的情况DMA_MemoryInc配置 DMA_CCR 寄存器的 MINC 位位 7指定存储器地址是否自动递增DMA_MemoryInc_Enable每次传输后存储器地址自动加 1适用于数组传输DMA_MemoryInc_Disable存储器地址保持不变DMA_PeripheralDataSize 和DMA_MemoryDataSize分别配置 DMA_CCR 寄存器的 PSIZE[1:0] 位位 8-9和 MSIZE[1:0] 位位 10-11指定数据宽度DMA_PeripheralDataSize_Byte8 位字节DMA_PeripheralDataSize_HalfWord16 位半字DMA_PeripheralDataSize_Word32 位字数据宽度不匹配说明当源数据宽度小于目标数据宽度时源数据会被零扩展到目标宽度当源数据宽度大于目标数据宽度时源数据的高位会被丢弃只保留低位3.3 什么时候传输结束这部分由以下两个成员决定uint32_t DMA_Mode; // 传输模式 uint32_t DMA_Priority; // 通道优先级DMA_Mode配置 DMA_CCR 寄存器的 CIRC 位位 5指定传输模式DMA_Mode_Normal正常模式传输完成后通道自动停止DMA_Mode_Circular循环模式传输完成后自动重新加载传输数目开始新一轮传输DMA_Priority配置 DMA_CCR 寄存器的 PL[1:0] 位位 12-13指定通道的软件优先级取值如 2.3 节所述。四、常用 DMA 固件库函数4.1 DMA 初始化函数void DMA_Init(DMA_Channel_TypeDef* DMAy_Channelx, DMA_InitTypeDef* DMA_InitStruct);功能根据DMA_InitStruct中的参数初始化 DMA 通道参数DMAy_Channelx指定要初始化的 DMA 通道如DMA1_Channel4DMA_InitStruct指向 DMA 初始化结构体的指针4.2 DMA 使能函数void DMA_Cmd(DMA_Channel_TypeDef* DMAy_Channelx, FunctionalState NewState);功能使能或禁用指定的 DMA 通道参数DMAy_Channelx指定要操作的 DMA 通道NewStateENABLE使能通道DISABLE禁用通道4.3 状态查询函数FlagStatus DMA_GetFlagStatus(uint32_t DMAy_FLAG); void DMA_ClearFlag(uint32_t DMAy_FLAG);功能查询或清除 DMA 通道的状态标志常用标志DMA1_FLAG_TC4DMA1 通道 4 传输完成标志DMA1_FLAG_HT4DMA1 通道 4 传输过半标志DMA1_FLAG_TE4DMA1 通道 4 传输出错标志4.4 中断配置函数void DMA_ITConfig(DMA_Channel_TypeDef* DMAy_Channelx, uint32_t DMA_IT, FunctionalState NewState);功能使能或禁用 DMA 通道的中断参数DMA_IT指定要配置的中断类型如DMA_IT_TC传输完成中断、DMA_IT_HT传输过半中断、DMA_IT_TE传输出错中断五、注意事项通道选择限制P2M 和 M2P 模式必须严格按照通道映射表选择通道不能随意使用数据宽度匹配建议源和目标的数据宽度保持一致避免数据丢失或不必要的扩展地址增量配置对于单个外设数据寄存器如 USART_DR、ADC_DR外设地址增量应设置为禁用循环模式使用循环模式适用于需要持续传输数据的场景如串口打印、ADC 连续采集传输完成判断在 Normal 模式下可以通过查询传输完成标志位来判断传输是否结束参考出处视频讲解STM32F103 DMA 直接存储器访问理论篇《零死角玩转 STM32F103-指南者》第 22 章 DMA 直接存储器访问