ADC----DMA方式采集电压


一、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;

 

还望路过大神指点其中理解错误之处!!!


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM