
DMA概述 Direct Memory Access 直接存储器访问 DMA传输将数据从一个地址空间复制到另一个地址空间 由CPU初始化这个DMA传输动作,动作本身由DMA控制器完成 DMA传输通过硬件为RAM和IO设备之间开辟一条直接传输数据的通道,提高了CPU的运行效率 STM32中的DMA STM32最多有2个DMA控制器,其中大容量产品有2个DMA控制器,小容量产品只有1个 DMA1有7个通道,DMA2有5个通道 每个通道专门用来管理来自于一个或多个外设对存储器访问的请求 还有一个仲裁协调各个DMA请求的优先权 ![]() STM32的DMA具有以下特征: 每个通道都直接连接专用的硬件DMA请求,支持软件触发,可以通过软件进行配置 优先级可以通过软件编程设置,共4级 独立的源和目标数据区的传输宽度,模拟打包和拆包过程,源和目标地址必须按数据传输宽度对齐 支持循环的缓冲器管理 每个通道都有3个事件标志(DMA半传输,DMA传输完成,DMA传输出错),这3个事件都可以成为单独的中断 外设和存储器,存储器和外设,存储器和存储器之间 存储包括:FLASH,SRAM,外设的SRAM 外设包括:APB1,APB2和AHB 可编程的数据传输数目:最大为65536 DMA的通道 DMA1有7个通道 ![]() ![]() DMA处理 在发生一个事件后,外设向DMA控制器发送一个请求信号。DMA控制器根据通道的优先权处理请求 当DMA控制器开始访问发出请求的外设时,DMA控制器立即发送给他一个应答信号 当从DMA控制器得到应答信号时,外设立即释放它的请求,一旦释放了这个请求,DMA控制器同时撤销应答信号 每次DMA传送由3个操作完成: DMA_CPARx存储的是外设的基地址,DMA_CMARx存储额是存储器的基地址,这两个要先赋值好 DMA_CNDTRx包含未完成操作的数目,在DMA_CNDTRx寄存器中,每完成一次发送,这个DMA_CNDTRx寄存器的值会减 数据传输方向 DMA_CCRx寄存器 DMA通道x配置寄存器(DMA_CCRx)(x = 1...7) ![]() 仲裁器 DMA通道x配置寄存器(DMA_CCRx)(x = 1...7) 同样是在这个寄存器,可以配置通道的优先级 ![]() 可编程的数据量 DMA通道x配置寄存器(DMA_CCRx)(x = 1...7) 源和目标的数据宽度一致时是最方便的 ![]() 指针增量 ![]() 存储器到存储器 还需要设置DMA_CCRx的MEM2MEM位 通道传输数据量 在DMA_CNDTRx寄存器中配置,虽然这是一个32的寄存器,但是只用到了低16位,所以最大数据量为2的16次方-1 ![]() 中断 ![]() 通道的配置过程 1. 设置DMA_CPARx(外设地址)和DMA_CMARx(存储器地址)的值 2. 设置传输方向,通过DMA_CCRx寄存器 3. 设置传输数据量,在DMA_CNDTRx寄存器 4. 设置传输优先级,在DMA_CCRx寄存器中 5. 设置是否循环模式,外设和存储器的增量模式 6. 数据宽度,中断配置,5和6都是在DMA_CCRx寄存器中进行配置 7. 在DMA_CCRx寄存器中进行ENABLE位的配置 当传输一半的数据后,半传输标志HTIF为1,当设置了允许半传输中断位HTIE时,将产生中断请求。在传输数据结束后,传输完成标志TCIF为1,当设置了允许传输完成中断位TCIE后,将产生一个中断请求 DMA相关函数配置 DMA_Init ![]() DMA_Cmd ![]() DMA_ITConfig ![]() DMA_SetCurrDataCounter ![]() DMA_GetCurrDataCounter ![]() DMA_GetFlagStatus ![]() DMA_ClearFlag ![]() DMA_GetITStatus ![]() DMA_ClearITPendingBit ![]() 常用的外设DMA使能库函数 ADC ![]() DAC ![]() USART ![]() I2C ![]() TIM ![]() ![]() DMA的初始化配置 ![]() ![]() 1. 使能DMA时钟 2. 初始化DMA通道参数 3. 使能DMA发送,使能外设DMA使能函数 4. 使能DMA通道,启动传输 5. 查询DMA传输状态 6. 获取或设置通道当前剩余数据量 ———————————————— 版权声明:CodeForCoffee |
经验分享 | STM32双定时器+ADC+DMA实战案例
经验分享 | STM32U5系列TIMER+DMA+DAC应用演示
经验分享 | 基于STM32H7 UART 空闲事件及DMA传输示例
经验分享 | 关于STM32 DMA传输的两个问题释疑
经验分享 | STM32G4 UART+TIMER+DMA应用示例
经验分享 | STM32 TIMER+DMA输出PWM异常二案例
经验分享 | STM32H7 EXTI + SPI +DMA 双缓冲应用演示
经验分享 | STM32H563 UART+DMA 2D功能演示
经验分享 | 基于STM32H563 USART演示DMA链表功能
经验分享 | 基于STM32H563演示UART+DMA功能