From bd5d62e03ee94d2a026adc56ffdbe2a0a1185a8d Mon Sep 17 00:00:00 2001 From: Frederic Pillon Date: Thu, 10 Jul 2025 14:10:17 +0200 Subject: [PATCH] chore: add STM32WB0 support to internal channel examples Signed-off-by: Frederic Pillon --- .../Internal_channels/Internal_channels.ino | 73 ++++++++++++------- 1 file changed, 45 insertions(+), 28 deletions(-) diff --git a/examples/Peripherals/ADC/Internal_channels/Internal_channels.ino b/examples/Peripherals/ADC/Internal_channels/Internal_channels.ino index 35644dc..73df14a 100644 --- a/examples/Peripherals/ADC/Internal_channels/Internal_channels.ino +++ b/examples/Peripherals/ADC/Internal_channels/Internal_channels.ino @@ -27,70 +27,82 @@ #endif #if defined(STM32C0xx) -#define VTEMP 760 +#define VTEMP 760 #define AVG_SLOPE 2530 -#define VREFINT 1212 +#define VREFINT 1212 #elif defined(STM32F1xx) -#define VTEMP 1430 +#define VTEMP 1430 #define AVG_SLOPE 4300 -#define VREFINT 1200 +#define VREFINT 1200 #elif defined(STM32F2xx) || defined(STM32F4xx) -#define VTEMP 760 +#define VTEMP 760 #define AVG_SLOPE 2500 -#define VREFINT 1210 +#define VREFINT 1210 #endif /* Analog read resolution */ +#if defined(LL_ADC_RESOLUTION_12B) #define LL_ADC_RESOLUTION LL_ADC_RESOLUTION_12B +#elif defined(LL_ADC_DS_DATA_WIDTH_12_BIT) +#define LL_ADC_RESOLUTION LL_ADC_DS_DATA_WIDTH_12_BIT +#else +#error "ADC resolution could not be defined!" +#endif #define ADC_RANGE 4096 // the setup routine runs once when you press reset: void setup() { // initialize serial communication at 9600 bits per second: Serial.begin(9600); - while (!Serial); + while (!Serial) + ; analogReadResolution(12); } -static int32_t readVref() -{ +#ifdef AVREF +static uint32_t readVref() { + uint32_t Vref = 3300; #ifdef STM32U0xx /* On some devices Internal voltage reference calibration value not programmed during production and return 0xFFFF. See errata sheet. */ - if ((uint32_t)(*VREFINT_CAL_ADDR) == 0xFFFF) { - return 3300U; - } + if ((uint32_t)(*VREFINT_CAL_ADDR) != 0xFFFF) { #endif #ifdef __LL_ADC_CALC_VREFANALOG_VOLTAGE #ifdef STM32U5xx - return (__LL_ADC_CALC_VREFANALOG_VOLTAGE(ADC1, analogRead(AVREF), LL_ADC_RESOLUTION)); + Vref = __LL_ADC_CALC_VREFANALOG_VOLTAGE(ADC1, analogRead(AVREF), LL_ADC_RESOLUTION); #else - return (__LL_ADC_CALC_VREFANALOG_VOLTAGE(analogRead(AVREF), LL_ADC_RESOLUTION)); + Vref = __LL_ADC_CALC_VREFANALOG_VOLTAGE(analogRead(AVREF), LL_ADC_RESOLUTION); #endif #else - return (VREFINT * ADC_RANGE / analogRead(AVREF)); // ADC sample to mV + Vref = VREFINT * ADC_RANGE / analogRead(AVREF); // ADC sample to mV +#endif +#ifdef STM32U0xx + } #endif + return Vref; } +#endif #ifdef ATEMP -static int32_t readTempSensor(int32_t VRef) -{ +static int32_t readTempSensor(int32_t VRef) { + uint32_t temp = 0; #ifdef __LL_ADC_CALC_TEMPERATURE #ifdef STM32U5xx - return (__LL_ADC_CALC_TEMPERATURE(ADC1, VRef, analogRead(ATEMP), LL_ADC_RESOLUTION)); + temp = __LL_ADC_CALC_TEMPERATURE(ADC1, VRef, analogRead(ATEMP), LL_ADC_RESOLUTION); +#elif defined(STM32WB0x) + (void)VRef; + temp = __LL_ADC_CALC_TEMPERATURE(analogRead(ATEMP), LL_ADC_DS_DATA_WIDTH_12_BIT); #else - return (__LL_ADC_CALC_TEMPERATURE(VRef, analogRead(ATEMP), LL_ADC_RESOLUTION)); + temp = __LL_ADC_CALC_TEMPERATURE(VRef, analogRead(ATEMP), LL_ADC_RESOLUTION); #endif #elif defined(__LL_ADC_CALC_TEMPERATURE_TYP_PARAMS) - return (__LL_ADC_CALC_TEMPERATURE_TYP_PARAMS(AVG_SLOPE, VTEMP, CALX_TEMP, VRef, analogRead(ATEMP), LL_ADC_RESOLUTION)); -#else - return 0; + temp = __LL_ADC_CALC_TEMPERATURE_TYP_PARAMS(AVG_SLOPE, VTEMP, CALX_TEMP, VRef, analogRead(ATEMP), LL_ADC_RESOLUTION); #endif + return temp; } #endif -static int32_t readVoltage(int32_t VRef, uint32_t pin) -{ +static int32_t readVoltage(int32_t VRef, uint32_t pin) { #ifdef STM32U5xx return (__LL_ADC_CALC_DATA_TO_VOLTAGE(ADC1, VRef, analogRead(pin), LL_ADC_RESOLUTION)); #else @@ -100,7 +112,7 @@ static int32_t readVoltage(int32_t VRef, uint32_t pin) // The loop routine runs over and over again forever: void loop() { -#if defined(ICACHE) && defined (HAL_ICACHE_MODULE_ENABLED) && !defined(HAL_ICACHE_MODULE_DISABLED) +#if defined(ICACHE) && defined(HAL_ICACHE_MODULE_ENABLED) && !defined(HAL_ICACHE_MODULE_DISABLED) bool icache_enabled = false; if (HAL_ICACHE_IsEnabled() == 1) { icache_enabled = true; @@ -110,9 +122,15 @@ void loop() { } } #endif /* ICACHE && HAL_ICACHE_MODULE_ENABLED && !HAL_ICACHE_MODULE_DISABLED */ + // Print out the value read +#ifdef AVREF int32_t VRef = readVref(); Serial.printf("VRef(mv)= %i", VRef); +#else + // No Vref fro STM32WB0xx + int32_t VRef = LL_ADC_VIN_RANGE_3V6; +#endif #ifdef ATEMP Serial.printf("\tTemp(°C)= %i", readTempSensor(VRef)); #endif @@ -121,9 +139,8 @@ void loop() { #endif Serial.printf("\tA0(mv)= %i\n", readVoltage(VRef, A0)); delay(200); -#if defined(ICACHE) && defined (HAL_ICACHE_MODULE_ENABLED) && !defined(HAL_ICACHE_MODULE_DISABLED) - if (icache_enabled) - { +#if defined(ICACHE) && defined(HAL_ICACHE_MODULE_ENABLED) && !defined(HAL_ICACHE_MODULE_DISABLED) + if (icache_enabled) { /* Re-enable instruction cache */ if (HAL_ICACHE_Enable() != HAL_OK) { Error_Handler();