首页 > 其他 > 详细

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

时间:2019-06-05 13:14:16      阅读:93      评论:0      收藏:0      [点我收藏+]

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

 

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

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

原文:https://www.cnblogs.com/caiqian123/p/10978961.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!