当前位置: 代码迷 >> 综合 >> 【STM32F103】DMA学习笔记(陆续添加)
  详细解决方案

【STM32F103】DMA学习笔记(陆续添加)

热度:64   发布时间:2023-12-12 11:33:41.0

参考: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
{
}