一、DMA介绍篇
1、DMA(存储器直接存取)
2、功能:为CPU分担相当大一部分的”数据搬运”!!!解放CPU资源(CPU去负责更深的运算)
插入: 微控制器由CPU,存储器,外设三部分构成,各部分之间的协调与交互由CPU完成 (大脑,脚与手的关系) (CPU每次都是从A外设拿到一个数据送到B外设使用,中间通过一个”桥”) 而 DMA可实现存储器和存储器之间,外设和存储器之间,存储器和外设之间的传输(跳过CPU)!!!
3、我们来看一下CPU 与DMA在搬运数据上的不同吧!
(1) 基于CPU的单通道中断方式转换数据
extern __IO uint16_t ADC_ConvertedValue; //这里DMA方式 与CPU中断方式都引用一个外部变量(分析代码便可得出不同)
void ADC_IRQHandler(void) //ADC转换完成后会进入中断服务函数,(在中断函数内,通过CPU的“搬运”,对ADC转换后的值进行存储与转送)如下显示:
{
if (ADC_GetITStatus(ADCx,ADC_IT_EOC)==SET)
{
// 读取ADC的转换值
ADC_ConvertedValue = ADC_GetConversionValue(ADCx); // 获取ADC转换结果值的库函数(CPU读出ADC转换后的12数值先存储在ADC数据寄存器,然后CPU通过库函数提取到CPU寄存器里,然后再转附送到ADC_ConvertedValue地址的变量里 。
}
ADC_ClearITPendingBit(ADCx,ADC_IT_EOC);
}
(2)基于DMA的单通道转换数据
extern __IO uint16_t ADC_ConvertedValue; //这里DMA方式 与CPU中断方式都引用一个外部变量(分析代码便可得出不同)
//DMA传输不需要 ADC_GetConversionValue(ADCx); 中间变量(CPU寄存器)
//将ADC转换后的数据直接传送到B变量 (这个过程只需要经过CPU允许及DMA请求即可,关键在于配置DMA,下图为部分)
// 配置 DMA 初始化结构体
// 外设基址为:ADC 数据寄存器地址
DMA_InitStructure.DMA_PeripheralBaseAddr = ( uint32_t ) ( & ( ADCx->DR ) );
// 存储器地址,实际上就是一个内部SRAM的变量
DMA_InitStructure.DMA_MemoryBaseAddr = (uint32_t)&ADC_ConvertedValue; //直接将外设的数据寄存器提取到变量
// 数据源来自外设
DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC;
还望路过大神指点其中理解错误之处!!!