8 DWA
DMA简介
DMA(Direct Memory Access)直接存储器存取(可以直接访问32内部存储器,包括内存SRAM,Flash)
DMA可以提供外设和存储器或者存储器和存储器之间的高速数据传输,无须CPU干预,节省了CPU的资源
存储器和存储器(软件触发);外设和存储器(硬件触发)
12个独立可配置的通道: DMA1(7个通道), DMA2(5个通道)
每个通道都支持软件触发和特定的硬件触发
STM32F103C8T6 DMA资源:DMA1(7个通道)
8.1 DWA直接存储读取
存储器映像
类型 | 起始地址 | 存储器 | 用途 |
---|---|---|---|
ROM(只读) | 0x0800 0000 | 程序存储器Flash | 存储C语言编译后的程序代码 |
0x1FFF F000 | 系统存储器 | 存储BootLoader,用于串口下载 | |
0x1FFF F800 | 选项字节 | 存储一些独立于程序代码的配置参数 | |
RAM(随机存储器) | 0x2000 0000 | 运行内存SRAM | 存储运行过程中的临时变量 |
0x4000 0000 | 外设寄存器 | 存储各个外设的配置参数 | |
0xE000 0000 | 内核外设寄存器 | 存储内核各个外设的配置参数(NVIC和SysTick) |
DMA框图
DMA基本结构
DMA进行转运的条件:
第一,就是开关控制,DMA_Cmd必须使能;
第二,传输计数器必须大于0;
第三,触发源必须由触发信号;
DMA请求
数据宽度与对齐
数据转运+DMA
将DataA转到DataB,外设地址给DataA数组地址,有储器地址给Data B的首地址,宽度按8位字节传输,两地址都自增,传输计数器给7,无需自动重装,用软件触发,调用DMA_ Cmd( )
ADC扫描模式+DMA
DMA最常见的用途就是配合ADC的扫描模式
外设地址给ADC_DR地址,有储器地址在SRAM中定一个数组ADValue,以16位半字转输
函数解释:
void DMA_DeInit(DMA_Channel_TypeDef* DMAy_Channelx); //恢复缺省配置
void DMA_Init(DMA_Channel_TypeDef* DMAy_Channelx, DMA_InitTypeDef* DMA_InitStruct); //初始化
void DMA_StructInit(DMA_InitTypeDef* DMA_InitStruct); //结构体初始化
void DMA_Cmd(DMA_Channel_TypeDef* DMAy_Channelx, FunctionalState NewState); //DMA通道使能
void DMA_ITConfig(DMA_Channel_TypeDef* DMAy_Channelx, uint32_t DMA_IT, FunctionalState NewState); //中断输出使能
void DMA_SetCurrDataCounter(DMA_Channel_TypeDef* DMAy_Channelx, uint16_t DataNumber); //设置当前传输数据寄存器
uint16_t DMA_GetCurrDataCounter(DMA_Channel_TypeDef* DMAy_Channelx); //获取当前传输数据寄存器
FlagStatus DMA_GetFlagStatus(uint32_t DMAy_FLAG); //获取标志位状态
void DMA_ClearFlag(uint32_t DMAy_FLAG); //清除标志位
ITStatus DMA_GetITStatus(uint32_t DMAy_IT); //获取中断状态
void DMA_ClearITPendingBit(uint32_t DMAy_IT); //清除中断挂起位