cancel
Showing results for 
Search instead for 
Did you mean: 

STM32WLE5C8U6 ADC wont start

Nando
Associate

I've been stuck trying setting up an ADC pin on an STM32WLE5C8U6 MCU for several days. Although I'm new to the ST environment, I have experience setting up ADC pins on other F series chips without any issues. Am I possibly overlooking something? According to the documentation, it appears that setting up the ADC should be even simpler on the STM32WLE5. Any guidance would be greatly appreciated.

#include "stm32wle5xx.h"

void ADC_Init(void) {
    // Enable GPIOB clock
    RCC->AHB2ENR |= (1U<<1);

    // Enable ADC clock
    RCC->APB2ENR |= (1U<<9);

    // Breakpoint here to check if ADC clock is enabled


    // Configure PB4 as an analog input
    GPIOB->MODER &= ~(3U << (2 * 4));   // Clear mode for PB4
    GPIOB->MODER |= (3U << (2 * 4));    // Set PB4 to analog mode

    // Ensure ADC is disabled before starting configuration
    if (ADC->CR & (1U<<0)) {
        ADC->CR |= (1U<<1);
        while (ADC->CR & (1U<<1));
    }

    // Breakpoint here to check if ADC is disabled

    // Enable the ADC voltage regulator
    ADC->CR |= (1U<<28);
    for (volatile uint32_t i = 0; i < 10000; i++); // Delay for voltage regulator

    // Breakpoint here to check if voltage regulator is enabled

    // Calibrate the ADC
    //ADC->CR |= (1U<<31);             // Start calibration
    //while (ADC->CR & (1U<<31));      // Wait for calibration to complete
    //execution gets stuck here. If I skip calibration, execution gets stuck in the next while()
    // Breakpoint here to check if calibration is complete

    // Configure the ADC
    ADC->CFGR1 |= (1U<<3);        // 10-bit resolution
    ADC->CHSELR = (1U<<4);    // Select channel for PB4

    // Enable the ADC
    ADC->CR |= (1U<<0);              // Enable ADC
    while (!(ADC->ISR & (1U<<0))); // Wait until ADC is ready

    // Breakpoint here to check if ADC is ready
}

uint16_t ADC_Read(void) {
	 ADC->CR |= ADC_CR_ADEN;
    ADC->CR |= ADC_CR_ADSTART;           // Start conversion
    while (!(ADC->ISR & ADC_ISR_EOC));   // Wait for conversion to complete
    return ADC->DR;                      // Read the ADC value
}
uint16_t adcValue = 0;
int main(void) {
    ADC_Init();
   adcValue = ADC_Read();
    // Use adc_value as needed
    while (1);
}

 

1 REPLY 1
STTwo-32
ST Employee

Hello @Nando 

I suggest you follow the configurations of this examples to implement an ADC configuration on your STM32WL MCU.

Best Regards.

STTwo-32 

To give better visibility on the answered topics, please click on Accept as Solution on the reply which solved your issue or answered your question.