实验要求
不停的读取10个ADC的值,用DMA发送
实现过程
想要获取ADC的值,我们要对ADC进行初始化的配置,通过查阅手册要按照以下的方式进行ADC初始化。
- 开启IO口,设置模拟输入。
- 使能ADC1时钟,并设置分频因子。
- 设置ADC1的工作模式。
- 设置ADC1规则序列的相关信息。
- 开启AD转换,并校准。
- 开启规则序列转换ADC值进行读取。
因为要求是获取10个ADC的值,通过比对选择了比较简单的规则序列转换。通过对比将10个序列信息依次配置好。
按照要求通过DMA传输方式将ADC的数值保存下来。根据中文手册传输ADC1的DMA通道是channel1。将DMA和ADC配置好后,开始编译。
DMA配置如下图:
void Adc_Init(void)
{
//先初始化IO口
RCC->APB2ENR|=1<<2; //使能PORTA口时钟
RCC->APB2ENR|=1<<3; //使能PORTB口时钟
RCC->APB2ENR|=1<<4; //使能PORTC口时钟
RCC->APB2ENR|=1<<6; //使能PORTE口时钟 HC4951M 使用
GPIOE->CRL&=0XFF000FFF;
GPIOE->CRL|=0X00222000; //PE. 3/4/5推挽输出
GPIOE->ODR|=7<<3; //PE 3.4.5输出高
GPIOA->CRL&=0Xfffff0f0;//PA0,PA2 anolog输入 ADC0,2
GPIOA->CRL|=0X00000000;//PA0,PA2 anolog输入
GPIOB->CRL&=0Xffffff00;//PB0-PB1 anolog输入 ADC9~10
GPIOB->CRL|=0X00000000;//PB0-PB1 anolog输入
GPIOC->CRL&=0Xff000000;//PC0-PC5 anolog输入 ADC11~16
GPIOC->CRL|=0X00000000;//PC0-PC5 anolog输入
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&=0XF0FFFF; //工作模式清零
ADC1->CR1|=0<<16; //独立工作模式
ADC1->CR1|=1<<8; //扫描模式,1使能,0禁止
ADC1</