当前位置:   article > 正文

stm32笔记(2)————DMA直接存储器存取原理_dma存储

dma存储

一. DMA简介

1、DMA(Direct Memory Access)直接存储器存取

  • 数据转运小助手,协助CPU完成数据转运工作,DMA可以提供外设和存储器或者存储器和存储器之间的高速数据传输,无须CPU干预,节省了CPU的资源(DMA就像地主家的长工,只干活(传输数据)、不管事,长工(DMA)干活时不用地主(CPU)老盯着,干完活跟地主(CPU)说声就可以了)
  • 外设:一般指的是外设的数据计算器DR,data register,比如ADC的数据寄存器、串口的数据寄存器等等,
  • 存储器:运行内存SRAM和程序存储器Flash,是存储变量数组和程序代码的地方
  • 12个独立可配置的通道: DAM1(7个通道), DAM2(5个通道),通道就是数据转运的路径,从一个地方到另一个地方就可以看作一个通道。每个通道都支持软件触发和特定的硬件触发
  • STM32F103C8T6 DMA资源: DMA1(7个通道)

2、DMA通道的触发方式

  • 每个通道都支持软件触发和特定的硬件触发
  • 若是存储器到存储器的数据转运,比如把flash里的一批数据转运到SRAM中去,就需要软件触发,触发后,DMA就会一股脑的转运,以最快的速度全部转运好
  • 若是外设到存储器的数据转运,不能一股脑的转运,因为外设的数据是有一定时机的,需要硬件触发。比如转运ADC的数据,就得ADC每个通道AD转换完成后,硬件触发一次DMA,之后DMA再转运,触发一次转运一次,才能保证数据正确
  • 特定的硬件触发:每个DMA的通道,它的硬件出发源是不一样的,当使用某个外设的硬件出发源,就得使用它连接的那个通道,而不能任意选择通道

3、STM32存储器组织与映像

计算机系统的五大组成部分是运算器、控制器、存储器、输入设备和输出设备,其中运算器和控制器一般会合在一起叫CPU,所以计算机核心就是CPU和存储器。存储器有两个知识点,一是存储器的内容,另一个是存储器的地址,STM32同理。

1、ROM(只读存储器),是一种非易失性、掉电不丢失的存储器。

  • ROM分三块,程序存储器Flash(主闪存):存储C语言编译后的程序代码,也就是下载程序的位置,运行程序一般也是从主闪存里开始,数据地址以0800开头的,为主闪存地址
  • 系统存储器:用途如表,BootLoader程序是芯片出厂自动写入的不允许修改
  • 选项字节:用于存储一些独立于程序代码的配置参数,位置是在ROM区的最后面,下载程序可以不刷新选项字节的内容,这样选项字节的配置就可以保持不变,选项字节里,存的主要是flash的读保护、写保护,还有看门狗等等的配置

2、RAM(随机存储器),是一种易失性、掉电丢失的存储器。

  • 运行内存SRAM(静态随机存取储存器,Static RAM): 存储程序运行过程中定义的临时变量,如变量、数组、结构体。
  • 外设寄存器: 也就是初始化各个外设,最终所读写的东西,实质也是存储器的一种,存储介质也是SRAM。
  • 内核外设寄存器: 内核外设就是NVIC和SysTick,内核外设和其他外设不是一个厂家设计,所以地址被分开了,地址以E000开头。
    详细可参考芯片数据手册第4章存储器映像!

4、DMA框图
如图展现了STM32的Cortex-M3内核,可以将除该内核以外的其他部分都看作存储器。

寄存器是连接软件和硬件的桥梁,软件读写寄存器就相当于在控制硬件的执行。

  • 既然外设就是寄存器,寄存器就是存储器,那么DMA数据转运都可归为“从某个地址取内容,再放到另一个地址去”一类问题。为了高效有序地访问存储器,上图设计一个总线矩阵,其左端为主动单元,拥有存储器的访问权,右端为被动单元,它们的存储器只能被左边的主动单元读取。
  • 主动单元,内核有DCode和系统(总线),可以访问右边的存储器,其中DCode专门访问Flash的,系统(总线)可以访问其他东西。另外因为DMA要转运数据,所以DMA(Cortex-M3内核下面的DMA1和DMA2)也要有访问的主动权,所以另一个主动单元为DMA总线,除了DMA1和DMA2分别有一条DMA总线通向总线矩阵,以太网外设自己也私有DMA,可不用管。
  • DMA1和DMA2里有一个仲裁器,这是因为虽然多个通道可以独立转运数据,但是最终DMA总线只有一条,所以所有通道只能分时复用,如果产生抽个图就会由仲裁器根据通道优先级仲裁使用顺序。
  • 仲裁器下面是AHB从设备,用于配置DMA。是DMA自身的寄存器,DMA作为一个外设也会有相应的配置寄存器,连接到了总线矩阵右边的AHB总线上。所以DMA既是总线矩阵的主动单元,可读写各种寄存器,也是AHB总线上的被动单元,CPU通过如图红色线路可对DMA进行配置(CPU主动,DMA被动)。
  • DMA请求,请求就是触发的意思,右边的触发源是各个外设(图中ADC和DAC),所以DMA请求就是DMA的硬件触发源,比如ADC转换完成、串口接收到数据,需要触发DMA转运数据的时候,就会通过绿色线路向DMA发出硬件触发信号,然后DMA就可执行数据转运工作了。

5、寄存器读写

CPU/DMA直接访问Flash,是可以读不可写
SRAM是运行内存,可以任意读写
外设寄存器:看数据手册(数据寄存器是可以读写的)


6、DMA基本结构

(1) DMA进行数据转运时,首先应该定义两个站点。

  • 外设寄存器站点(也是存储器,但是一般被叫做外设)
  • flash和SRAM存储器站点(stm32中存储器一般指flash和SRAM,不包含外设寄存器)
  • 由于flash是只读的,所以只能是flash到SRAM的运转

(2) 每一个站点拥有三个参数,他们分别是:

  • 起始地址:存储将要传输数据的地址。有外设端的起始地址和存储器端的起始地址,这两个参数决定了数据是从哪里来,到哪里去的(需要注意,这里的“起始”地址并不一定指被传输数据的地址,它同样可以是数据被送往的目的地址)
  • 数据宽度:一次被传输的数据宽度,它可以是字节Byte(8位)半字HalfWord(16位)字Word(32位)。(STM32的字长为32位)
  • 地址是否自增:完成一次数据传输后地址指针是否自增。指定一次转运完成后,下一次转运是不是要把地址移动到下一个位置去,相当于是指针p++
    [1] 比如ADC扫描模式用DMA进行数据转运,外设地址是ADC_DR寄存器
    [2] 外设寄存器地址不用自增,若自增,下次转运就跑到别的寄存器里了
    [3] 存储器地址需要自增,没转运一个数据后,就往后挪,否则会把上次的数据覆盖掉

(3) 两个站点的使用

  • 如果是存储器到存储器的数据转运,需要把其中一个存储器的地址放在外设寄存器站点
  • 外设寄存器只是个名字而已,可以写寄存器,如果写flash的地址,它就会去flash里找,写SRAM就会去SRAM里找
  • 甚至可以两个站点换过来使用

(4) 传输计数器

  • 传输计数器是用来指定传输次数的寄存器,它是一个自减计数器,当它的值为0时,DMA就不会进行数据转运了,由于传输时自增后的地址也会恢复到起始地址的位置,方便下一次的数据转运
    例如写5,DMA就只能进行5次数据转运,每转运一次减1,为0时,不再转运,之前自增的地址,会恢复到起始位置

(5) 自动重装器

  • 当传输计数器自减到0后,可以配置自动重装器来确定是否自动使传输计数器回到初始定义的值,它决定了DMA转运数据的模式是单次模式或者循环模式(扫描模式加连续转换)(完成一次工作以后,是否立即开始下一次工作)

(6) DMA的触发控制
触发就是决定DMA需要在什么时机进行转运的,由M2M(Memory to Memory)位进行控制,1为软件触发,0为硬件触发
软件触发

  • 以最快的速度,连续不断地触发DMA,争取早日把传输计数清0,完成这一轮转换(和循环模式同时使用,因为软件触发是清0,循环模式是清0后自动重装,同时用,DMA停不下来)

  • 适用于存储器到存储器的转运,因为存储器到存储器的触发时软件启动、不需要时机、并且想尽快完成任务

  • 软件触发和循环模式不能同时使用,因为软件触发就是想把传输计数器清零,循环模式是清零后自动重装,如果同时使用DMA就停不下来了

硬件触发

  • 硬件触发源可以选择ADC、串口收到数据、定时时间到等等,所以需要硬件触发
  • 硬件达到时机时,传一个信号,来触发DMA进行转运
  • 开关控制,给DMA使能后,DMA就准备就绪,可以进行转运

(7) DMA进行转运的条件

图中右下角还有一个“开关控制”位,它指在编程时使用的DMA_Cmd()函数。

1、开关控制,DMA_Cmd必须使能
2、传输计数器必须大于0
3、触发源必须有触发信号,触发一次转运一次,传输计数器自减一次。当传输计数器等于0,且没有自动重装时,这时无论是否触发,DMA都不会再进行转运了
此时就需要DMA_Cmd给DISABLE,关闭DMA,再为传输计数器写一个大于0的数,在DMA_Cmd给Elable开启DMA,DMA才能继续工作
注意!!!写传输计数器时必须要先关闭DMA再进行,不能在DMA开启时写传输计数器,这是手册里的规定

二、DMA细节部分

1、DMA请求
在这里插入图片描述

硬件触发时,需要注意每个通道可选择的硬件触发源都是固定的,对每个通道而言,具体选择哪个通道,需要由对应的外设是否开启了DMA输出来决定的,并不由DMA决定。


2、数据传输(数据宽度和对齐要求)
在这里插入图片描述

如果低宽度转运到高宽度,在每个目标单位的高位补0;如果高宽度转运到低宽度,原单位的高位数据将丢失(小的写到大的,补0,大的写到小的,高位舍弃掉) 与uint8_t,uint16_t,uint32_t类型的数据相互赋值的规则类似


声明:本文内容由网友自发贡献,转载请注明出处:【wpsshop】
推荐阅读
相关标签
  

闽ICP备14008679号