STM32F7xx外设驱动6-adc(寄存器)

//源文件
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);
/**********************************************************************/

  

热门相关:超武穿梭   薄先生,情不由己   第一神算:纨绔大小姐   网游之逆天飞扬   天启预报