STM32:DMA直接存储器存储(内含:1.DMA简介+2.存储器映像+3.DMA框图+4.DMA基本结构图+5.数据宽度对齐+6.两种经典转运情景)

发布于:2022-11-28 ⋅ 阅读:(953) ⋅ 点赞:(0)

1.DMA简介:

DMA是协助CPU转运数据的。

外设指外设数据寄存器DR,如ADC的数据寄存器,串口的数据寄存器等。

存储器指运行内存SRAM和程序存储器Flash,存储变量数组和代码的地方。

通道:把一个地方的数据转运到另一个地方就需要占用一个通道。(互不干扰)

存储器之间的数据传输:使用软件触发。特点:高速转运。

外设到寄存器之间的转运:硬件触发。(如ADC转运,需要触发一次DMA,才开始转运一次)

每个特点的硬件的触发源都不一样,通道也不一样。

2.存储器映像:

 

注:重点掌握存储器内容和地址。

计算器5大组成系统:运算器,控制器,存储器,输入设备,输出设备。运算器+控制器=CPU。

ROM是只读存储器,非易失性,掉电不丢失。RAM是随机存储器,易失性,掉电丢失。

Flash:读闪存。(运行数据先运行Flash)

选项字节,存储的一般是读保护,写保护,看门狗等程序。

3.DMA框图:

 

注:除了左上角的内核(CPU),其他东西都可等价于存储器。

Flash是主闪存存储器,SRAM是运行内存存储器。

寄存器是连接软件和硬件的桥梁(如置引脚的高低电平,导通和断开开关,切换数据选择器,计数器,数据寄存器等)。软件的读写寄存器操作,相当于读写硬件操作。

图中的总线矩阵处,左侧为主动单元,右侧为被动单元,被动单元只能倍被主动单元读写。

图中也画出了DMA的7通道和DMA2的5通道。各个通道都可以设置他们转运数据的源地址和目的地址。

仲裁器作用:DMA总线只有一条,各个通道转运可以独立,但是优先转运需要排序(类似于中断优先级).

图中也画出DMA作为外设,也有相应寄存器。AHB从设备,用于配置DMA参数。CPU通过该寄存器就可以控制DMA。

CPU或者DMA直接访问Flash,只读不写(可以选择其他复杂方式进行读写操作,但一般用不到).

SRAM是可以任意读写的。

4.DMA基本结构图(重点,编写代码的依据)

 

注:存储器内部转换时,注意Flash是只读的,所以不能进行SRAM到Flash,或者Flash到Flash的操作。

起始地址:决定数据是谁传递给谁。

数据宽度:指定一次转运按多大的数据宽度进行。可选择字节Byte(8位,即uint8_t),半字HalfWord,(16位,即uint16_t)和字Word(32位,即uint32_t)。

地址是否自增:一般寄存器不需要自增,存储器一般需要自增。

传输计数器:指定转运几次,是自减计数器(如写5,只能进行5次转运数据)。

自动重装器:当传输计数器减到0,可调节是否自动恢复到最初值。(使用后,5减到0,立即变为5)

其他部分为DMA触发控制(DMA在什么时机进行转运):触发源有硬件触发和软件触发,选择哪个触发源由M2M参数决定。

条件:1.开关控制,DMA_Cmd必须使能。

2.传输计数器必须>0。

3.触发源必须有触发信号。触发一次转运一次,传输计数器自减一次。当变为0且没用自动重装时,DMA就不会再进行转运。此时DMA_Cmd关闭,失能。再进行2~4的操作。

写传输计数器,不允许开启DMA。

5.数据宽度对齐:

解释:数据相同宽度时(如8对8),直接传输。

数据宽度传输时变大(如8对16等),需要在前几位补0.

如传输0x0/B0 0x1/B1 0x2/B2 0x3/B3,传输后变为0x0/00B1 0x0/02B2 0x4/00B4 0x6/00B8

数据宽度传输时变小(如16对8等),需要舍弃前几位.

如传输0x0/B1B0 0x2/B3B2 0x4/B5B4 0x6/B7B6,传输后变为0x0/B0 0x1/B2 0x2/B4 0x3/B6

6.两种经典转运情景:

数据转运+DMA:

 

目的:将SRAM数组DataA转运到SRAM数组DataB中。(DataA数据不会消失)

配置方法(对照DMA基本结构图):

起始地址:外设地址填DataA的首地址,存储器地址填DataB首地址。

数据宽度都填uint8_t。

地址是否自增:两个地址都自增。

传输计数器:转运七次,填7。

自动重装:不需要。

触发选择:选软件(存储器到存储器的转运,不需要等待,需要速度),填1。

开启DMA_Cmd,使能。

ADC扫描模式+DMA:

 

 

目的:触发后,7个通道依次进行AD转换。结果都放在ADC_DR数据寄存器里。每个通道转换完成后,进行一次DMA数据转运,目的地址自增。

配置方法(对照DMA基本结构图):

起始地址:外设地址填ADC_DR的地址,存储器地址填ADValue地址。

数据宽度都填uint16_t。

地址是否自增:外设地址不自增,存储器地址自增。

传输计数器:转运七次,填7。

自动重装:单次扫描,就不需要重装。连续扫描,DMA需要配合进行自动重装。

触发选择:DMA选择ADC的硬件触发,填0。

开启DMA_Cmd,使能。

ADC扫描模式不能没有DMA。

 

本文含有隐藏内容,请 开通VIP 后查看