初级会员

- 积分
- 86
- 金钱
- 86
- 注册时间
- 2020-12-11
- 在线时间
- 7 小时
|

楼主 |
发表于 2021-6-10 17:54:32
|
显示全部楼层
初始化
void Adc_Init(void)
{
//先初始化 IO 口
RCC->AHB1ENR|=1<<5; //使能 ADC1/2 时钟
RCC->AHB4ENR|=1<<0; //使能 PORTA 时钟
GPIO_Set(GPIOA,PIN5,GPIO_MODE_AIN,0,0,GPIO_PUPD_NONE);
//PA5,模拟输入,不带上下拉
RCC->AHB1RSTR|=1<<5; //ADC1/2 复位
RCC->AHB1RSTR&=~(1<<5); //复位结束
RCC->D3CCIPR&=~(3<<16); //ADCSEL[1:0]清零
RCC->D3CCIPR|=2<<16; //ADCSEL[1:0]=2,per_ck 作为 ADC 时钟源,
//默认选择 hsi_ker_ck 作为 per_ck,频率:64Mhz
ADC12_COMMON->CCR|=1<<18;
//PRESC[3:0]=1,输入时钟2分频,即adc_ker_ck=per_ck/2=64/2=32Mhz(不能超过36Mhz)
ADC1->CR=0; //CR 寄存器清零,DEEPPWD 清零,从深度睡眠唤醒.
ADC1->CR|=1<<28; //ADVREGEN=1,使能 ADC 稳压器
delay_ms(10); //等待稳压器启动完成,约 10us,延时大一点,没关系.
ADC1->CR|=1<<8;
//BOOST=1,ADC 工作在 boost 模式(ADC 频率大于 20M 的时候,必须设置 boost 位)
ADC1->CFGR&=~(1<<13); //CONT=0,单次转换模式
ADC1->CFGR|=1<<12; //OVRMOD=1,复写模式(DR 寄存器可被复写)
ADC1->CFGR&=~(3<<10); //EXTEN[1:0]=0,软件触发
ADC1->CFGR&=~(7<<2); //RES[2:0]位清零
ADC1->CFGR|=0<<2; //RES[2:0]=0,16 位分辨率(0,16 位;1,14 位;2,12 位;3,10 位;4,8 位.)
ADC1->CFGR2&=~((u32)15<<28);//LSHIFT[3:0]=0,不左移,数据右对齐.
ADC1->CFGR2&=~((u32)0X3FF<<16);//OSR[9:0]=0,不使用过采样
ADC1->CR&=~((u32)1<<30); //ADCALDIF=0,校准单端转换通道
ADC1->CR|=1<<16; //ADCALLIN=1,线性校准
ADC1->CR|=(u32)1<<31; //开启校准
while(ADC1->CR&((u32)1<<31));//等待校准完成
ADC1->SQR1&=~(0XF<<0); //L[3:0]清零
ADC1->SQR1|=0<<0; //L[3:0]=0,1 个转换在规则序列中也就是只转换规则序列 1
//设置通道 19 的采样时间
ADC1->SMPR2&=~(7<<(3*9)); //通道 19 采样时间清空
ADC1->SMPR2|=7<<(3*9); //通道 19 810.5 个周期,提高采样时间可以提高精确度
ADC1->CR|=1<<0; //开启 AD 转换器
} |
|