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

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

1.DMA简介:


907a21fca5c04436834a6cd56553e0ee.png


DMA是协助CPU转运数据的。


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


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


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


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


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


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


2.存储器映像:


c0d66ce7009f4a508e49bb3bb7bf7f89.png


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


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


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


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


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


3.DMA框图:


2b087b856175498386f758aacffb0935.png


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


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


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


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


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


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


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


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


SRAM是可以任意读写的。


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


432b47191ca5476298265ae0d140cf18.png


注:存储器内部转换时,注意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.数据宽度对齐:


f10f1300bf1f43018572f3ff327d4a33.png


解释:数据相同宽度时(如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:


b25488cba2ee47149d811c5cb724919e.png


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


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


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


数据宽度都填uint8_t。


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


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


自动重装:不需要。


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


开启DMA_Cmd,使能。


ADC扫描模式+DMA:


9eedcdd463a24f5a943d5f95cfcd5f2c.png


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


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


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


数据宽度都填uint16_t。


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


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


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


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


开启DMA_Cmd,使能。


ADC扫描模式不能没有DMA。


 


相关文章
|
2月前
|
传感器
【STM32】I2C练习,SHT3X温度传感器的数据读取
【STM32】I2C练习,SHT3X温度传感器的数据读取
|
2月前
|
传感器
|
2月前
|
Java C语言
STM32使用printf重定向到USART(串口)并打印数据到串口助手
STM32使用printf重定向到USART(串口)并打印数据到串口助手
102 0
|
2月前
|
存储 芯片
STM32 cubemx配置USART DMA传输
STM32 cubemx配置USART DMA传输
85 0
|
9月前
|
存储 Perl
STM32速成笔记(八)—DMA
本文介绍了DMA的概念,用途。对于STM32F103ZET6的DMA做出了详细地介绍,给出了DMA配置步骤。最后,以配置DMA搬运ADC转换结果为例,给出了DMA的配置和使用方法。
145 0
STM32速成笔记(八)—DMA
|
10月前
|
存储 内存技术
STM32F0单片机快速入门八 聊聊 Coolie DMA
STM32F0单片机快速入门八 聊聊 Coolie DMA
|
10月前
|
缓存 自然语言处理 网络协议
STM32CubeMX | | 使用小熊派串口驱动峰汇ETH-01以太网模块上传数据到OneNet
STM32CubeMX | | 使用小熊派串口驱动峰汇ETH-01以太网模块上传数据到OneNet
123 0
|
10月前
|
Linux C语言 Android开发
ESP8266透传:利用STM32f103zet6发送数据到HTTP服务器
ESP8266透传:利用STM32f103zet6发送数据到HTTP服务器
240 0
|
11月前
|
传感器 数据采集
STM32(HAL库)通过ADC读取MQ2数据
STM32(HAL库)通过ADC读取MQ2数据