void Adc_Init(void)
{
uint32_t tmpreg1 = 0;
ADC_InitTypeDef ADC_InitStructure;
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC |RCC_APB2Periph_ADC1 , ENABLE ); //使能ADC1通道时钟
RCC_ADCCLKConfig(RCC_PCLK2_Div6); //设置ADC分频因子6 72M/6=12,ADC最大时钟不能超过14M
/* PC0 作为模拟通道输入引脚 ->ADC_IN10 */
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN; //模拟输入引脚
GPIO_Init(GPIOC, &GPIO_InitStructure);
/* ADC初始化*/
//CR1寄存器设置
tmpreg1 = ADC1->CR1;
tmpreg1 &= 0xfff0feff; //adc的DUALMOD和SCAN位清零
tmpreg1 |= ((uint32_t)0x00000000); //位19:16 0000:独立模式
tmpreg1 |= ((uint32_t)0x00000000); //扫描模式设置
ADC1->CR1 = tmpreg1;
//CR2寄存器设置
tmpreg1 = ADC1->CR2;
tmpreg1 &= 0xfff1f7fd; //CONT、EXTSEL[2:0]清零
tmpreg1 |= (1<<20); //使用外部事件启动转换
tmpreg1 |= ((uint32_t)0x000E0000); //外部事件设置为软件触发
tmpreg1 |= ((uint32_t)0x00000000); //数据右对齐
tmpreg1 &= ~(1<<1); //单次转换模式
ADC1->CR2 = tmpreg1;
//规则通道数量设置 1个
tmpreg1 = ADC1->SQR1;
tmpreg1 &= 0xff0fffff;
tmpreg1 |= 0x00000000; //位19~位23 0000 代表规则转换组中只有一个通道
ADC1->SQR1 = tmpreg1;
//规则通道转换顺序 转换AD通道10
tmpreg1 = ADC1->SQR3;
tmpreg1 &= 0xffffffe0;
tmpreg1 |= 0x0000000a;
ADC1->SQR3 = tmpreg1;
//采样时间设置
ADC1->SMPR1 &= ~(7<<0); //通道10采样时间设置,239.5周期,提高采样时间可以提高精确度
ADC1->SMPR1 |= 7<<0;
//开启AD
ADC1->CR2 |= (1<<0); //开AD转换器
//AD校准
ADC1->CR2 |= (1<<3); //复位校准
while( ADC1->CR2 & (1<<3) );
ADC1->CR2 |= (1<<2); //AD校准
while( ADC1->CR2 & (1<<2) );
}
自己以前都是库函数操作,没有独立对着参考手册在寄存器层面上编写代码。所以自己写的很艰难,中间还是参考了封装的库函数的定义。现在还只能写的代码还只是一个通道可以转换,多开了几个通道设置还是有问题。明日再继续。
自己独立写代码和做代码搬运工区别真的很大,虽然过程艰难,但是只要能做好,还是能学到很多东西。对概念的理解也会更深。
比如自己对 ! 和 ~的理解不到位。就想当然的写出了下面的程序
//等待AD转换结束
while( !(ADC1->SR) & (1<<1) );
而这种显然更合理 while(!(ADC1->SR&1<<1));
若自己只是做代码搬运工,不独立写,就不会发现概念上的误区,看书的时候也不会有那么深的体会。
所以我希望自己能够在学习的时候能够更独立。
上一篇:STM32F0 ADC学习
下一篇:4*4键盘程序代码 基于STM32
推荐阅读最新更新时间:2024-11-08 17:12
设计资源 培训 开发板 精华推荐
- 使用 Analog Devices 的 24LC025-I/ST 的参考设计
- MC78M15ACTG 15V 电流调节器的典型应用
- 12V DC 至 DC 单路输出电源
- AD8302-EVAL,基于 AD8302 2.7 GHz RF/IF 增益和鉴相器的评估板
- #第六届立创电赛#蓝牙5.0桌面功
- DEMO9S08QG8: MC9S08QG8 Demo Board
- 用于开/关控制应用的 AM2G-2412DZ ±12V 2 瓦 DC-DC 转换器的典型应用
- 专业充电器的典型应用电路采用多个LT3420电路并联为大型闪光灯电容器快速充电
- LTC3897HFE 高效两相 24V 升压转换器的典型应用电路,具有浪涌电流控制、过流保护、输入 V
- 使用 Infineon Technologies AG 的 OM7620ST 的参考设计