文章目录[隐藏]
目录
DMA通道x配置寄存器(DMA_CCRx)(x = 1...7)
DMA通道x配置寄存器(DMA_CCRx)(x = 1...7)
DMA通道x配置寄存器(DMA_CCRx)(x = 1...7)
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寄存器的值会减1
数据传输方向
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. 获取或设置通道当前剩余数据量
版权声明:本文为CSDN博主「CodeForCoffee」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/qq_24118527/article/details/122765608
暂无评论