STM32之DMA


Flash是主闪存,下载程序的地方,系统存储器出厂自动写入,不许修改。系统存储器是存储Bootloader,选项字节存的是flash的读保护,写保护,还有看门狗等。运行内存SRAM存的临时变量,也就是程序中定义变量数组结构体的地方。外设寄存器也是SRAM,存储外设的,内核外设寄存器是存储内核的外设的参数。

左上角是内核即CPU,其他都是存储器,寄存器是软件和硬件的桥梁。总线矩阵的左边是主动单元,右边是被动单元。DMA总线只有一条,所有通道需要分时复用DMA总线,所以需要仲裁器。AHB从设备对DMA进行配置。DMA请求用于硬件触发DMA的数据转运。DMA对Flash只读不写,写入需要一定的办法。

DMA的数据转运可以是外设到存储器,或者存储器到存储器。起始地址,数据的首地址,数据宽度决定了一次转运多少字节,地址自增决定是不是转运一次挪一下位置。传输计数器决定总共要转运几次,当传输计数器的数值减到0的时候,DMA就停止。自动重装器决定了传输计数器减到0要不要重装。下面是DMA的触发控制,M2M置1还是置0决定是硬件触发还是软件触发,软件触发和循环模式不能同时用。软件触发就是把传输计数器清零。循环模式是自动清零重装,同时用DMA就停不下来了。M2M控制是硬件触发还是软件触发。开关控制使能DMA。

DMA的进行转运的必要条件:

1.开关控制,DMA必须使能。

2.传输计数器的值必须大于零

3.触发源必须有触发信号

注意:写传输计数器时必须先关闭DMA。否则写不了。

图中EN即开关控制位,软件触发M2M实际上是控制硬件触发还是软件触发位,使用硬件触发的时候要注意每个通道的触发源是不一样的,软件触发就没有这个限制。这些通道产生的DMA请求进入到仲裁器,优先级越高优先执行。如果转运的起始寄存器或者存储器数据宽度不一样的话,参考下表:

注意:小转大,补零,超了舍弃高位。

举例一:将SRAM的dataA转运到dataB中

需要配置:

1:外设站点和存储器站点的首地址。数据宽度都是8位。

2:两个站点的数据都应该自增

3:方向配置成外设到存储器

4:传输计数器给7,自动重装不需要

5:触发选择软件触发,因为不需要时机

此时的转运时复制。

举例二:将ADC_DR的数据转运到SRAM数组中

需要配置:

1:外设地址写入ADC_DR的地址,存储器的地址可以在SRAM中定义一个数组,数据宽度时16位的半字传输。

2:外设ADC_DR地址不自增,存储器地址自增

3:方向配置成外设到存储器

4:传输计数器给7,自动重装在ADC连续扫描模式下需要,否则不需要

5:触发选择硬件触发,因为需要时机:单个通道转运完成会触发DMA请求

注意ADC的扫描模式需要DMA

相关推荐
xingzhemengyou15 小时前
STM32对函数进行CRC校验
stm32·单片机·嵌入式硬件
FPGA小徐6 小时前
STM32引脚详解:PC13-TAMPER-RTC 多功能复用引脚完全剖析(踩坑+配置+布线)
单片机·嵌入式硬件
小狼154546 小时前
拼多多订单数据导出 CSV 实战:接口分页、字段平铺与 5 个数据坑,多多开票助手
java·前端·javascript
Joe_Wang56 小时前
【从0到1学习JVM · 25】同样都要停顿所有线程,Parallel比Serial到底强在哪
java·jvm·学习·垃圾回收
wuminyu6 小时前
JVM虚拟线程的底层实现原理分析
java·linux·c语言·jvm·c++
M78佐菲6 小时前
ARM学习笔记(9)
linux·arm开发·笔记·嵌入式硬件·学习
铅笔小新z6 小时前
【stm32】中断与异常
stm32·单片机·嵌入式硬件
弹简特6 小时前
【Java项目-企悦抽】13-奖品管理模块-奖品列表和创建奖品的实现
java·开发语言·网络·springboot
小蒜学长6 小时前
基于Spring Boot+Vue的“禾源”农产品销售系统设计与实现(代码+数据库+LW)
java·spring boot·后端·农产品销售系统·产品溯源
光年20006 小时前
Mock-Server开箱即用的Mock服务
java·maven·mock·jetty