参考:STM32F10xxx参考手册
DMA主要特性比较多,简要为以下几条:
1.两个独立DMA模块,其中DMA2只有在大容量和互联网型号中有
2.四级优先级,同级的请求,则根据通道号大小,小的优先级高
3.可设置为循环缓存
4.传输宽度可设,字节,半字,全字(对应的字的长度应该是32bits,stm32是32位单片机)
5.三种事件可触发中断:DMA半传输,DMA传输完成,DMA传输错误
6.最大传输数目为65535
DMA处理过程
DMA_CPARx或DMA_CMARx用于设置传输开始地址
DMA_CNDTRx用于保存未完成的操作数目,会自递减(应该是16位寄存器)
DMA通道配置步骤
1.在DMA_CPARx中设置外设寄存器的地址,在DMA_CMARx中设置数据存储器的地址
2.DMA_CNDTRx设置传输的数据量,启动传输后,该寄存器值会递减
3.DMA_CCRx的PL位设置优先级
4.DMA_CCRx设置传输方向、循环模式、外设和存储器的增量模式、数据宽度、以及中断事件
5.DMA_CCRx的ENABLE位置1启动DMA通道
6.中断会在DMA_ISR寄存器置位对应的标志
循环模式
用于处理循环缓冲区和连续的数据传输(例如ADC扫描)。DMA_CCRx中CIRC位用于开启该功能
可编程设置数据传输宽度、对齐方式、数据大小端
PSIZE用于设置外设数据宽度
MSIZE用于设置存储器数据宽度
PINC和MINC用于设置大小端
DMA1控制器
外设与DMA通道是对应的,不是可以随意映射的。一个通道对应一个外设,而一个外设只对应一个通道
注意这里的外设只指一个外设请求,例如USART1就包括USART1_RX和USART1_RX两个
对应见下表
DMA寄存器
中断状态寄存器(DMA_ISR)
(只读?)位0表示没有事件发生,位1表示发生了事件
中断标志清除寄存器(DMA_IFCR)
(只写?)用于清除中断标志,置0无作用,置1用于去除中断标志(DMA_ISR)
通道x配置寄存器(DMA_CCRx)
位31:15,保留
位14:MEM2MEM,存储器到存储器模式,置1开启
位13:12:PL,通道优先级,00最低,11最高
位11:10:MSIZE,存储器数据宽度,00,8位;01,16位;10,32位;11,保留
位9:8:PSIZE,外设数据宽度,类同MSIZE
位7:MINC存储器地址增量模式(大小端?)
位6:PINC外设地址增量模式(大小端?)
位5:CIRC,循环模式,置1开启
位4:DIR,数据传输方向,0,从外设读;1从存储器读
位3:TEIE,允许传输错误中断,置1允许
位2:HTIE,允许半传输中断
位1:TCIE,允许传输完成中断
位0:EN,通道开启,置1开启
通道x传输数量寄存器(DMA_CNDTRx)
位31:16,保留
位15:0,NDT,用于写入传输数量,必须在通道不工作时写入(DMA_CCRx EN=0),当EN使能后,只读。
如果设置了循环模式,寄存器值会在变为0后自动加载原初值。
通道x外设地址寄存器(DMA_CPARx)
开启EN后不能写,只读
位31:0,PA,外设地址
当PSIZE=01(16位),不使用PA[0]位,自动为半字地址对齐
当PSIZE=10(32位),不使用PA[1:0],自动为字地址对齐
通道x存储器地址寄存器(DMA_CMARx)
类同DMA_CPARx
编程实例
采用DMA方式收发USART接收发送的数据。
硬件设计
采用USART1,对应的DMA通道为:USART1_TX对应DMA1的通道4,USART1_RX对应DMA1的通道5
软件设计
在内存中开辟两个数据缓冲区,一个用于接收USART1的数据,另一个向USART1传输数据,用于发送,将接收的字符串(ASCII)
中的小写字母转变为大写字母,传回。
代码如下:
main
{
}