DMA读取ADC几个重要的地方

2019-07-21 07:00发布

最近做DMA读取3个通道的ADC数据终于搞定了 总结了几个重要的设置大家可以参考一下(在原子哥程序的基础上改的)
 ADC中要设定成扫描模式  连续转换模式 和通道的设置
DMA中要设置成 从外设读取数据  循环模式 传输数据量=存储器的大小=要转换的通道数
以上是小弟的几点愚见 有什么不对的请指教。
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
31条回答
正点原子
1楼-- · 2019-07-21 07:13
可以直接上你的代码,给别人参考,呵呵.
shenhao7752376
2楼-- · 2019-07-21 11:45
正点原子
3楼-- · 2019-07-21 15:17
下想分享
lin9511
4楼-- · 2019-07-21 19:22
试试  呵呵  谢谢啊
stc-mp3
5楼-- · 2019-07-21 20:21
 精彩回答 2  元偷偷看……
stc-mp3
6楼-- · 2019-07-22 00:04
   
void  Adc_Init(void)
{        
RCC->APB2ENR|=1<<2;    //使能PORTA口时钟 ADC4,5,6

GPIOA->CRL&=0XF000FFFF;//PA.4,5,6 anolog输入  
RCC->APB2ENR|=1<<9;    //ADC1时钟使能 
__nop();
__nop();      
RCC->APB2RSTR|=1<<9;   //ADC1复位 
RCC->APB2RSTR&=~(1<<9);//复位结束   
RCC->CFGR|=3<<14;      //SYSCLK/DIV2=72M/8=9Mhz 得到ADC采样率位43.65Khz    
  
ADC1->CR1&=0XF0FFFF;   //独立工作模式 
ADC1->CR1|=1<<8;       //扫描模式    
ADC1->CR2|=1<<1;       //连续转换模式  
ADC1->CR2|=0x000E0000; //软件控制转换 由bit21控制  SWSTART控制
ADC1->CR2|=1<<20;      //使用用外部触发(SWSTART)!!! 必须使用一个事件来触发 
ADC1->CR2&=~(1<<11);   //右对齐 

ADC1->SQR1&=~(0XF<<20);
ADC1->SQR1|=1<<21;     //3个转换在规则序列中 

*** ADC1->SQR3&=0XFFFF8000;//规则序列 通道ch
*** ADC1->SQR3|=0X0000A50A; //10 8  9 
  
ADC1->SMPR2&=0XFE00FFFF;     //通道4,5,6的转换时间为:239.5+12.5个ADC时钟周期 
ADC1->SMPR2|=0xFFFFFFFF;      //通道4,5,6  239.5周期,提高采样时间可以提高精确度 
  
ADC1->CR2|=1<<0;       //开启AD转换器,第一次唤醒AD转换器   
ADC1->CR2|=1<<3;       //使能复位校准   
while(ADC1->CR2&1<<3); //等待校准结束    
    //该位由软件设置并由硬件清除。在校准寄存器被初始化后该位将被清除。     
ADC1->CR2|=1<<2;       //开启AD校准     
while(ADC1->CR2&1<<2); //等待校准结束 
//该位由软件设置以开始校准,并在校准结束时由硬件清除     
      
}   
//获得ADC值
//ch:通道值 0~3
u16 Get_Adc(u8 ch)   
{
//设置转换序列     
*** ADC1->SQR3&=0XFFFFFC00;//规则序列1 通道ch
*** ADC1->SQR3|=0X0000010A; //8 10        
ADC1->CR2|=1<<22;       //启动规则转换通道 
while(!(ADC1->SR&1<<1));//等待转换结束      
return ADC1->DR; //返回adc值
}


原子哥上面的代码中这两处我不太明白能讲讲吗?(标***处)上面的例子是要用到 8 9 10 三个通道

一周热门 更多>