我正在尝试编写一些没有 HAL 的基本代码来初始化和读取 ADC,但我无法让它正确响应。我在蓝色药丸开发板上使用 STM32F103C8T6。功能如下:
引脚 B1 (ADC9) 连接到 0-3.3V 信号(通过分压器提供 12V 电源电压)
当信号低于我称为 SUPP_V_MIN_VAL 的常数时,设置引脚 B9。如果信号高于该值,则引脚 B9 被清除。
我将 SUPP_V_MIN_VAL 定义为 2606.0。我将所有内容都转换为浮点数,因为在我的代码的单独部分中,我需要将当前的 ADC 值显示为浮点数)。
问题是我认为我没有正确初始化我的 ADC,或者没有正确地转换我的类型。我发现 ADC 读数始终为 0。我的初始化如下:
RCC->APB2ENR |= 0x1UL << 3; //Initialize clock for GPIOB (bit 3), if it hasn't been initialized yet
RCC->APB2ENR |= 0x1UL << 9; //Initialize clock for ADC1 (bit 9), if it hasn't been initialized yet
GPIOB->CRL &= ~(0xF0UL); //SetBar pin PB1 to analog input
//ADC1->CR1 |= 0x0UL; //Default settings are correct - ignore
ADC1->CR2 |= 0x2UL; //Enable ADC1_CR2_CONT for continuous conversion
//ADC1->SMPR1; //ADC channels in SMPR1 are not used - ignore
ADC1->SMPR2 |= 0x38000000UL; // Set SMP9 to 239.5 cycles (set bits 27-29 to 1)
ADC1->CR2 |= 0x1UL; //Set CR2_ADON to wake up ADC from sleep mode
ADC1->CR2 |= 0x1UL << 3; //Initialize calibration register
while ((ADC1->CR2 >> 3) & 0x1UL); //Wait until calibration register is initialized
ADC1->CR2 |= 0x1UL << 2; //Enable calibration
while ((ADC1->CR2 >> 2) & 0x1UL); //Wait until calibration completed
ADC1->CR2 |= 0x1UL; //Set CR2_ADON again to turn on ADC and start converting
我正在阅读别针:
void pollSUPP(void)
{
uint16_t ADC_Reading = ADC1->DR;
suppVolt.float_var = (float) ADC_Reading;
if( suppVolt.float_var < SUPP_V_MIN_VAL)
{
// digitalWrite(SUPP_LOW, HIGH); PB9
GPIOB->BSRR = 0X1 << 9;
}
else {
GPIOB->BRR = 0X1 << 9;
}
}
SuppVolt 定义为
union {
float float_var;
uint8_t chars[4];
} suppVolt; //ADC reading for supply voltage
我也可能在做一些愚蠢的事情(我实际上还没有确认引脚 B9 在 ADC1 上,但我假设这是因为蓝色药丸只有一个 ADC??)或引用寄存器中的错误位。
谁能帮我发现我的错误?先感谢您!!