ADC配置问题发现ST固件库的奇葩之处

ADC采集内部温度传感器的时候,下载开发板自带例程,读温度正常;移植到ucos后,读温度异常。逐行比对,发现温度传感器使能函数位置引起的。
【正常程序】如下:

    //时钟使能
    RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE);//使能GPIOA时钟
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1, ENABLE); //使能ADC1时钟

    //初始化ADC1通道5IO口---PA5
    GPIO_InitStructure.GPIO_Pin  = GPIO_Pin_5;//PA5 通道5
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AN;//模拟输入
    GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL ;//不带上下拉
    GPIO_Init(GPIOA, &GPIO_InitStructure);//初始化  

    //复位ADC1
    RCC_APB2PeriphResetCmd(RCC_APB2Periph_ADC1,ENABLE);     //复位ADC1
    RCC_APB2PeriphResetCmd(RCC_APB2Periph_ADC1,DISABLE);    //复位结束   

    /* 使能内部温度传感器 */
    ADC_TempSensorVrefintCmd(ENABLE);

【异常程序】如下:

    //时钟使能
    RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE);//使能GPIOA时钟
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1, ENABLE); //使能ADC1时钟

    /* 使能内部温度传感器 */
    ADC_TempSensorVrefintCmd(ENABLE);

    //初始化ADC1通道5IO口---PA5
    GPIO_InitStructure.GPIO_Pin  = GPIO_Pin_5;//PA5 通道5
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AN;//模拟输入
    GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL ;//不带上下拉
    GPIO_Init(GPIOA, &GPIO_InitStructure);//初始化  

    //复位ADC1
    RCC_APB2PeriphResetCmd(RCC_APB2Periph_ADC1,ENABLE);     //复位ADC1
    RCC_APB2PeriphResetCmd(RCC_APB2Periph_ADC1,DISABLE);    //复位结束   

问题就出在:温度传感器使能函数放在了ADC复位函数之前
为什么放在它之前不可以?
因为即便使能了,但是一旦复位后,使能也就没用了,除非再次使能。不过应该不会有人这么做,除非他蛋疼。


为什么复位这么函数这么牛逼?如果我想复位ADC2/3是不是也可以直接在参数里填上就可以了?
于是我goto了,发现……

#define RCC_APB2Periph_ADC               ((uint32_t)0x00000100)
#define RCC_APB2Periph_ADC1              ((uint32_t)0x00000100)
#define RCC_APB2Periph_ADC2              ((uint32_t)0x00000200)
#define RCC_APB2Periph_ADC3              ((uint32_t)0x00000400)

看来确实是,想复位谁,直接把形参换成对应的ADC选项就可以了。


不过,既然都看到了Hex了,不如再看下寄存器位吧,于是打开了datasheet

10:9 保留,必须保持复位值。
位 8 ADCRST:ADC 接口复位(所有 ADC 共用)(ADC interface reset (common to all ADCs))
由软件置 1 和清零。
0:不复位 ADC 接口
1:复位 ADC 接口

这就日了狗了
所以,想复位ADC2/3,只能选择“RCC_APB2Periph_ADC”或者“RCC_APB2Periph_ADC1”,但是,这样的话所有的ADC都会复位。


若有错误之处,还请诸位不吝赐教!多谢!(jnfxx)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值