STM32 АЦП инициализация без HAL - PullRequest
1 голос
/ 07 ноября 2019

Я пытаюсь написать некоторый базовый код без HAL для инициализации и чтения с АЦП, но я не могу заставить его правильно реагировать. Я использую STM32F103C8T6 на плате разработчика синих таблеток. Функция следующая:

  • Контакт B1 (ADC9) подключен к сигналу 0-3,3 В (напряжение питания 12 В через делитель напряжения)

  • Когда сигнал опускается ниже константы, которую я назвал SUPP_V_MIN_VAL, вывод B9 устанавливается. Если сигнал превышает это значение, вывод B9 очищается.

  • Я определил SUPP_V_MIN_VAL как 2606.0. Я преобразую все как число с плавающей точкой, потому что в отдельном разделе моего кода мне нужно отобразить текущее значение АЦП как число с плавающей точкой).

Проблема заключается в том, что яНеправильная инициализация моего АЦП или неправильное приведение типов. Я обнаружил, что значение АЦП всегда равно 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 находится на АЦП1, но я предполагаю, что это так, потому что у синей таблетки только один АЦП ??) или ссылаюсь на неправильный бит взарегистрируйтесь.

Может кто-нибудь помочь мне определить мою ошибку? Заранее спасибо !!

...