stm32l4x5/4x6 Mbed系統ADC內外部參考電壓修改
ADC參考電壓
ADC採樣的參考電壓可以分爲內部參考電壓和外部參考電壓,參考電壓爲VREF+,
mbed系統ADC驅動
Mbed系統封裝了一層驅動,使得開發簡單很多,拿來就用;好用,但確實不利於學習。mbed封裝驅動如DigitalOut/AnalogIn/UartSerial等,其中ADC採樣的驅動是AnalogIn。
好了,不廢話了,直接進入主題。
Mbed系統默認用的是外部參考電壓,如果硬件上是內部參考電壓的話,ADC採集值是不準的。
查看芯片手冊
Voltage reference buffer (VREFBUF)章節
寄存器bit位ENVR和HIZ控制參考電壓的選擇,0,1爲外部參考電壓,1,0爲內部參考電壓。所以我們找到這兩個寄存器
在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就清楚了