DMA: 直接存储器存取(DMA)用来提供在外设和存储器之间或者存储器和存储器之间的高速数据传 输。无须CPU干预,数据可以通过DMA快速地移动,这就节省了CPU的资源来做其他操作。
存储器映像:
单片机内存分为ROM:掉电不丢失,RAM:掉电丢失
ROM:
程序存储器Flash,存储c语言编译后的程序代码。
系统存储器:存储bootloader,用于串口下载,跳转app
选项字节:存储一些独立于程序代码的配置参数
RAM:
运行内存SRAM存储运行过程中的临时变量,定义程序变量,结构体等
外设寄存器,存储各个外设的配置参数,初始化各个外设
内核外设寄存器:存储内核各个外设的配置参数,NVIC,Systick.。
为了方便CPU的运行效率,可以配置好DMA,定义数据存储的位置和需要搬运的位置,配置好DMA,CPU不需要干预数据搬运。
为了高效有理的访问存储器,设计了总线矩阵,
左端是主动单元拥有存储器的访问权。
右端是被动单元元,被左边主动单元读写。
功能描述:DMA控制器和Cortex™-M3核心共享系统数据总线,执行直接存储器数据传输。Cortex-M3通过DCode总线专门访问flash,系统总线访问总线矩阵,DMA通过DMA总线访问总线矩阵,以太网外设通过DMA总线去读写存储单元。
仲裁器:由于有多个DMA通道同一时间只允许一条DMA总线去访问被动单元,所以需要根据通道的优先级。
当CPU和DMA同时访问相同的目标(RAM或外设)时,DMA请求会暂停CPU访问系统总线达若干个周期,总线仲裁器执行循环调度,以保证CPU至少可以得到一半的系统总线(存储器或外设)带宽。
AHB从设备:DMA自身的寄存器,所以他可以是主动单元主动去访问总线矩阵读写右边存储器,也是一个AHB总线被动单元 ,CPU可通过系统总线访问总线矩阵,通过总线矩阵去访问AHB单元,去配置MA。
DMA请求:DMA硬件外设触发,可以是ADC转换成功,串口收到数据,IIC数据接收到数据寄存器。需要启动DMA数据转运,硬件外设触发DMA请求。
DMA基本结构
两大站点:外设寄存器,存储器站点:flash、SRAM。外设到存储器也可以是存储器到外设,存储器到存储器。
举个例子当使用IIC +DMA时你的数据保存在SRAM中,你想发数通过IIC发送出去那么你就需要DMA把SRAM的数据搬运到IIC数据寄存器中就是存储器到外设。
而外设到存储器就是IIC收到数据存储在IIC数据寄存器,DMA搬运到SRAM中实现外设到存储器。也可以把数据搬运到Flash中。
外设起始地址和存储器起始地址就是数据从哪里来到哪里去。
数据宽度:指定一次数据搬运是多大,可以是1byte=8bit或16bit halfword(半字)和32 bit word(字)。使用IIC就用byte作为数据宽度,ADC就使用halfword 一次传输uint16_t个单位数据。
外设地址是否自增:指定一次转运完成后,下一次搬运地址是否需要下一个地址,使能了之后就会偏移下一个地址。
存储器地址是否自增:当DMA转运一次之后,传输下一个数据需要放到下一个存储单元,所以使能地址自增可以让数据一直连续存储, 若没使能数据就会被覆盖。
传输计数器:总共需要转运多少次,没转运1次计数-1,直到0停止,地址也会恢复默认值。
自动重装器:当计数到0时,是否要把计数器恢复到原先设定的值。一般ADC需要连续扫描使能自动重装器。
硬件触发:与外设有关,当外设如adc转换完成,串口接收到数据,定时器事件到会触发DMA请求。
软件触发:以最快速度连续不断触发DMA,不可与自动重装器同时使用。
M2M:设定软件触发还是硬件触发。置1为软件触发,置0为硬件触发。
DMA进行转运前提条件:
1:开关控制,使能DMA_Cmd
2:必须选择硬件/软件触发
3:传输计数器必须大于0
注意:必须先设定传输计数器才能使能开关控制。
DMA请求:由于外设数量比较多,而DMA通道只有固定十多个通道(芯片不同,数量不同)。所以每个外设挂载的通道也是不一样,当你需要用到哪个外设的DMA时,就得zhao到对应的外设通道 。
举个例子:当你要使用SPI1_RX时使用DMA搬运数据,那么你就要选择DMA通道2,而挂在在通道2上有多个外设,你只需要开始SPI1_DMACmd()即可。
外设起始地址 | DataA[0]的地址 | 存取器起始地址 | DataB[0]的地址 |
数据宽度 | 1byte | 1byte | |
地址是否自增 | enable | enable | |
自动重装器 | disable |
外设起始地址 | ADC通道 | 存取器起始地址 | DataB[0]的地址 |
数据宽度 | halfword | halfword | |
地址是否自增 | disable | enable | |
自动重装器 | disable |