Skip to content

chore: add STM32WB0 support to internal channel examples #64

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 1 commit into from
Jul 10, 2025
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
73 changes: 45 additions & 28 deletions examples/Peripherals/ADC/Internal_channels/Internal_channels.ino
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand All @@ -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;
Expand All @@ -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
Expand All @@ -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();
Expand Down