历史上的今天
今天是:2025年04月12日(星期六)
2019年04月12日 | stm32中ADC初始化程序
2019-04-12 来源:eefocus
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));
若自己只是做代码搬运工,不独立写,就不会发现概念上的误区,看书的时候也不会有那么深的体会。
所以我希望自己能够在学习的时候能够更独立。
史海拾趣
|
目前在做VxWorks的应用程序代码移植,从5.4到6.5,在5.4的代码使用了ifLib库里的函数,如ifunit()、ifAddrGet()等;而在VxWorks6.5中,ifLib库已经没用,请问是用别的库来代替?若是,可否有针对性的对ifunit()做个移植的解释?谢谢!… 查看全部问答> |
|
请问谁有MSG710芯片驱动(最好是linux下面的)的,现在正在做模拟屏的驱动,第一次做芯片驱动又比较急,不知道该怎么下手,想要一份参考一下。谢谢。 luogk@magliving.com … 查看全部问答> |
|
Error: Signal pin number invalid - Pin number 1 already exists on Gate A, Logical pin 1.Error: Signal pin number invalid - Pin number 2 already exists on Gate A, Logical pin 2.Error: Signal pin number invalid - Pin number 3 alread ...… 查看全部问答> |
|
用MSP430 内置传感器测试温度时为什么在串口上显示的数据不对 我想用430内置传感器测试环境温度的变化,但是为什么在串口上现实的数据不变化呢 ?哪位高人给指点下,下面的程序有什么错误啊? #include <msp430x14x.h>#define CPU_F ((double)8000000) #define delay_us(x) __delay_cycle ...… 查看全部问答> |
|
被STM32的RTC搞晕的过来看看本来打算放弃内置的RTC而采用DS1302了,无奈1302的通信太慢,屡次不成功,就把扔在一边的老板子拿来又试了试,这次没用自己原来的程序,在网上又新找了一个,结果程序都不用动的居然就行了··· 芯片是VCT6,晶振是那 ...… 查看全部问答> |




