ADC-DMA规则通道采集三路电压寄存器版代码共享

2019-07-20 22:30发布

规则通道顺序第一次CH1第二次CH2第三次CH3  寄存器版本
下面上代码
先来DMA的
void DMA_ADC1_Init(void) { RCC->AHBENR|=1<<0; //开启DMA1时钟 //发送DMA模式 DMA1_Channel1->CCR=0; DMA1_Channel1->CCR&=~(1<<0);// 关闭存储器 DMA1_Channel1->CCR&=~(1<<1);//禁止传输完成中断 TCIE DMA1_Channel1->CCR&=~(1<<2);//禁止半传输中断 HCIE DMA1_Channel1->CCR&=~(1<<3);//禁止传输错误中断 TEIE DMA1_Channel1->CCR&=~(1<<4);  //从外设读 DMA1_Channel1->CCR&=~(1<<5);//不执行循环 DMA1_Channel1->CCR&=~(1<<6);// DMA1_Channel1->CCR|=1<<7;//存储器地址增量模式 DMA1_Channel1->CCR&=~(1<<9);// DMA1_Channel1->CCR|=(1<<8);// 外设数据宽度16位 DMA1_Channel1->CCR&=~(1<<11);// DMA1_Channel1->CCR|=(1<<10);//存储器数据宽度16位 DMA1_Channel1->CCR|=1<<12; DMA1_Channel1->CCR|=1<<13; //PL优先级最高 DMA1_Channel1->CCR&=~(1<<14);// 非存储器到存储器模式
} void DMA_ADC1_EN(u32 length,u32 cmar) { DMA1_Channel1->CCR&=~(1<<0); DMA1_Channel1->CNDTR=length;//在存储器关闭时修改 0-65536(ffff)   待传输字节数目 DMA1_Channel1->CPAR=(u32)&ADC1->DR;//外设地址 UART_DR数据寄存器地址 DMA1_Channel1->CMAR=cmar;//数据存储器地址 ,数据内存地址例如数组首字节 DMA1_Channel1->CCR|=1<<0;  //打开DMA传输 }

DMA1_Channel1为map文件定义的对应DMA ADC1




再来ADC的
void  Adc_Init(void) {     //先初始化IO口   RCC->APB2ENR|=1<<2;    //使能PORTA口时钟  GPIOA->CRL&=0XFFFF000F;//PA1 PA2 PA3 anolog输入 3路ADC   RCC->APB2ENR|=1<<9;    //ADC1时钟使能   RCC->APB2RSTR|=1<<9;   //ADC1复位 RCC->APB2RSTR&=~(1<<9);//复位结束     RCC->CFGR&=~(3<<14);   //分频因子清零 RCC->CFGR|=2<<14;   //SYSCLK/DIV2=12M ADC时钟设置为12M,ADC最大时钟不能超过14M!   //否则将导致ADC准确度下降!        
ADC1->CR1=0;    //全部清零,需要哪个功能自己配置 ADC1->CR1|=(1<<8);    //扫描模式   ADC1->CR1&=~(0<<16);      //16-19独立工作模式  
ADC1->CR2=0;    //全部清零,需要哪个功能自己配置 ADC1->CR2&=~(1<<1);     //单次转换模式 ADC1->CR2|=1<<8; //DMA模式 ADC1->CR2&=~(1<<11);   //右对齐    ADC1->CR2|=7<<17;   //软件控制转换——SWSTART  ADC1->CR2|=1<<20;      //使用用外部触发 必须使用一个事件来触发 (这个是必要的吗?Y)
ADC2->SMPR2&=~(7<<3);  //通道1采样时间清空      ADC2->SMPR2|=7<<3;     //通道1  239.5周期,提高采样时间可以提高精确度 ADC2->SMPR2&=~(7<<6);  //通道2采样时间清空     ADC2->SMPR2|=7<<6;     //通道2  239.5周期,提高采样时间可以提高精确度 ADC2->SMPR2&=~(7<<9);  //通道3采样时间清空     ADC2->SMPR2|=7<<9;     //通道3  239.5周期,提高采样时间可以提高精确度 
ADC1->SQR1|=1<<21;   //规则序列中三个转换 ADC1->SQR3|=1<<0;   //第一个转换通道1 ADC1->SQR3|=2<<5;   //第二个转换通道2 ADC1->SQR3|=3<<10;   //第三个转换通道3    //设置通道1的采样时间 ADC1->CR2|=1<<0;   //开启AD转换器   ADC1->CR2|=1<<3;       //使能复位校准   while(ADC1->CR2&1<<3); //等待校准结束       //该位由软件设置并由硬件清除。在校准寄存器被初始化后该位将被清除。   ADC1->CR2|=1<<2;        //开启AD校准    while(ADC1->CR2&1<<2);  //等待校准结束 //该位由软件设置以开始校准,并在校准结束时由硬件清除   }

ADC1->CR2|=1<<22; //启动规则转换通道 
运行上面这句即可,启动ADC--->DMA自动转换--->数据存入数组




 




友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
11条回答
正点原子
1楼-- · 2019-07-21 00:42
谢谢分享
雨后晴不晴
2楼-- · 2019-07-21 02:47
 精彩回答 2  元偷偷看……
sun_shine
3楼-- · 2019-07-21 05:17
回复【3楼】雨后晴不晴:
---------------------------------
void DMA_ADC1_EN(u32 length,u32 cmar)    cmar是数组第一个地址   length是长度 

运行这句ADC1->CR2|=1<<22; 然后你看数据内容 就是ADC转换的值。
a2696026
4楼-- · 2019-07-21 08:16
 精彩回答 2  元偷偷看……
ele-madman
5楼-- · 2019-07-21 09:55
回复【5楼】a2696026:
---------------------------------
ADC1->SQR1|=1<<21;==ADC1->SQR1|=2<<20;
菜鸟先飞
6楼-- · 2019-07-21 14:05
MARK!!!!

一周热门 更多>