STM32 Mbed系列-ADC参考电压设置

stm32l4x5/4x6 Mbed系统ADC内外部参考电压修改

  • ADC参考电压
  • mbed系统ADC驱动

ADC参考电压

ADC采样的参考电压可以分为内部参考电压和外部参考电压,参考电压为VREF+,
参考电压可以是外部或者内部

mbed系统ADC驱动

Mbed系统封装了一层驱动,使得开发简单很多,拿来就用;好用,但确实不利于学习。mbed封装驱动如DigitalOut/AnalogIn/UartSerial等,其中ADC采样的驱动是AnalogIn。

好了,不废话了,直接进入主题。
Mbed系统默认用的是外部参考电压,如果硬件上是内部参考电压的话,ADC采集值是不准的。

查看芯片手册
Voltage reference buffer (VREFBUF)章节

STM32 Mbed系列-ADC参考电压设置_第1张图片
寄存器bit位ENVR和HIZ控制参考电压的选择,0,1为外部参考电压,1,0为内部参考电压。所以我们找到这两个寄存器

STM32 Mbed系列-ADC参考电压设置_第2张图片
在analogin_device.c的analogin_init函数中增加参考电压设置,切换为内部参考电压,HAL库为我们提供了VREFBUF registers相关寄存器的读写操作

void analogin_init(analogin_t *obj, PinName pin)
{
   __HAL_RCC_SYSCFG_CLK_ENABLE(); // 需要打开SYSCFG的操作时钟
	HAL_SYSCFG_VREFBUF_HighImpedanceConfig(SYSCFG_VREFBUF_HIGH_IMPEDANCE_DISABLE);
	HAL_SYSCFG_VREFBUF_VoltageScalingConfig(SYSCFG_VREFBUF_VOLTAGE_SCALE1);
	if (HAL_SYSCFG_EnableVREFBUF() != HAL_OK)
	{
		error("Set failed!\r\n");
	}
}

打开SYSCFG的操作时钟

#define __HAL_RCC_SYSCFG_CLK_ENABLE()          do { \
                                                 __IO uint32_t tmpreg; \
                                                 SET_BIT(RCC->APB2ENR, RCC_APB2ENR_SYSCFGEN); \
                                                 /* Delay after an RCC peripheral clock enabling */ \
                                                 tmpreg = READ_BIT(RCC->APB2ENR, RCC_APB2ENR_SYSCFGEN); \
                                                 UNUSED(tmpreg); \
                                               } while(0)

在芯片手册中找到RCC对应的APB2ENR就清楚了

STM32 Mbed系列-ADC参考电压设置_第3张图片
STM32 Mbed系列-ADC参考电压设置_第4张图片

你可能感兴趣的:(STM32,嵌入式)