//源文件 void ADCPhyConfig() { RCC->APB2ENR |=1 <<8; //使能 ADC1 时钟 RCC->AHB1ENR |=1 <<0; //使能 PORTA 时钟 //PA5 输入模式、下拉、高速 GPIOA->MODER |= (3<<5*2); //输入模式 GPIOA->PUPDR |= (3<<5*2); //下拉 GPIOA->OSPEEDR |= (1<<6*2); //高速 RCC->APB2RSTR|=1<<8; //ADCs 复位 RCC->APB2RSTR&=~(1<<8); //复位结束 ADC->CCR = 1<<16; //ADCCLK=PCLK2/4=90/4=22.5Mhz,不超过 36Mhz ADC1->CR1 = 0; //CR1 设置清零 ADC1->CR2 = 0; //CR2 设置清零 ADC1->CR1 |= 0<<24; //12 位模式 ADC1->CR1 |= 0<<8; //非扫描模式 ADC1->CR2 &= ~(1<<1); //单次转换模式 ADC1->CR2 &= ~(1<<11); //右对齐 ADC1->CR2 |= 0<< 28; //软件触发 ADC1->SQR1 &= ~(0XF<<20); ADC1->SQR1 |= 0<<20; //1 个转换在规则序列中 也就是只转换规则序列 1 //设置通道 5 的采样时间 ADC1->SMPR2 &= ~(7<<(3*5));//通道 5 采样时间清空 ADC1->SMPR2 |= 7<<(3*5); //通道 5 480 个周期,提高采样时间可以提高精确度 ADC1->CR2 |= 1<<0; //开启 AD 转换器 } //获得 ADC 值 //ch:通道值 0~16 //返回值:转换结果 uint16_t Get_Adc(uint8_t ch) { //设置转换序列 ADC1->SQR3&=0XFFFFFFE0;//规则序列 1 通道 ch ADC1->SQR3|=ch; ADC1->CR2|=1<<30; //启动规则转换通道 while(!(ADC1->SR&1<<1));//等待转换结束 return ADC1->DR; //返回 adc 值 } //获取通道 ch 的转换值,取 times 次,然后平均 //ch:通道编号 //times:获取次数 //返回值:通道 ch 的 times 次转换结果平均值 uint16_t Get_Adc_Average(uint8_t ch,uint8_t times) { uint32_t temp_val=0; uint8_t t; for(t=0;t<times;t++) { temp_val+=Get_Adc(ch); DelayPhyMs(5); } return temp_val/times; } //头文件 /*****************************adc**************************************/ #define ADC_CH5 5 //通道 5 void ADCPhyConfig(void); uint16_t Get_Adc(uint8_t ch); uint16_t Get_Adc_Average(uint8_t ch,uint8_t times); /**********************************************************************/
标签:CR2,ch,uint8,times,adc,ADC1,nulceo144,STM32F6xx From: https://www.cnblogs.com/lum0126/p/16883420.html