DMA直接存储器存取

【DMA简介】

  1. DMA(Direct Memory Access)直接存储器存取
  2. 12个独立可配置的通道:DMA1(7个通道),DMA2(5个通道)。每个通道都支持软件触发和特定的硬件触发
  3. STM32F103C8T6的DMA资源:DMA1(7通道)

【存储器映像】:了解STM32中有哪些存储器及地址

 ROM:只读存储器,掉电不丢失。包括系统存储器,选项字节,和程序存储器Flash(主闪存):存储C语言编译后的程序代码,运行程序一般从主闪存里开始运行

RAM:随机存储器,掉电丢失。包括运行内存SRAM(程序中定义变量,数组,结构体的地方)。外设寄存器也是存储器的一种。外设内核寄存器的用途是存储内核各个外设(NVIC和SysTick)的配置参数

【验证存储器映像内容】

 对照PPT显示存放在运行内存SRAM区

 使用const定义的”定量“对照PPT显示存放在系统存储区Flash

 由PPT可得确实在外设寄存器的区域

【DMA框图】

  •  寄存器是一种特殊的存储器:CPU可以对寄存器进行读写,就像读写运行内存一样;寄存器可以通过导线对外部电路的状态进行控制(置引脚的高低电平,导通和断开开关,切换数据选择器)
  • 总线矩阵以左为主动单元(内核DMA和DMA主线),拥有存储器的访问权。其中DcODE总线是专门访问Flash的,系统总线是访问其他东西的。
  • DMA1有一条DMA总线,7个通道。DMA2有一条DMA总线,5个通道。通道可以分别设置转运数据的源地址和目的地址,但所有通道只能分时复用一条DMA总线,若产生冲突,则有仲裁器根据通道的优先级决定使用顺序。
  • 若DMA和CPU都要访问同一个目标,DMA会暂停CPU的访问以防止冲突,但仍保证CPU会得到一半的总线宽带。
  • 总线矩阵以右为被动单元,只能被主动单元读写
  • AHB从设备是DMA自身的寄存器,连接在总线右边的AHB总线上,故DMA既是总线矩阵的主动单元,也是AHB总线上的被动单元。
  • DMA请求(DMA硬件触发源),由各个外设触发。例如ADC转换完成,串口接收到数据

【DMA基本结构】

  •  起始地址表明数据传输的地址,数据宽度表明一次传输的数据数量,地址是否自增表明传输一次数据后指针是否更改到下一位
  • 传输计数器表明传输一轮数据的总次数,当传输计数器减到0以后DMA不再转运,之前自增的地址也会恢复到起始地址的位置。自动重装器表明传输计数器恢复到0以后,是否自动恢复到最初的值。
  • DMA的触发控制:决定DMA在什么时机下进行运转,包括硬件触发和软件触发(一般适用于存储器到存储器的转运)。由参数M2M决定。(软件触发和循环模式不能连用)。硬件触发源可以选择ADC,串口,定时器等等

【DMA转运的条件】

  1. 开关控制,DMA_Cmd必须使能
  2. 传输计数器必须大于0
  3. 触发源必须有触发信号
  4. 写传输计数器时,必须先关闭DMA再写

【DMA请求】

  1.  每个通道都支持软件触发和特定的硬件触发:具体使用哪个通道上的触发源,取决于开启哪个外设的DMA输出
  2. 触发源进入仲裁器判断优先级,产生最终的DMA1请求

【数据宽度与对齐】

  1. 外设与存储器的数据宽度相同,即为正常的转运
  2. 数据宽度不一样:(第一列是源端宽度,第二列是目标宽度,第三列是传输数目)

     目标宽度大于源端宽度:在高位补0;目标数据宽度小于源端数据:只写低位

【分析】

 

  •  触发后,7个通道依次进行AD转换,转换结果都放在ADC_DR数据寄存器里
  • 每个单独通道转换完成后,进行一次DMA数据转运,并且目的地址进行自增
  • DMA配置:外设地址写入ADC_DR寄存器地址。存储器地址在SRAM中定义一个数组ADValue,ADValue地址等同于存储器地址。数据宽度两边相等,都是16位的半字传输,无需处理。外设地址不自增,存储器地址自增。传输方向是外设站点到存储器站点。由于通道有7个,故传输计数器计数7次。
  • ADC扫描模式,在每个单独的通道转运完成以后,没有标志位或者触发中断,不好判断某一个通道转换完成的时机是什么时候,但会产生DMA请求从而触发DMA转运

 

 

  

posted @ 2023-05-11 21:11  整点薯条拯救一切  阅读(234)  评论(0)    收藏  举报