2727#endif
2828
2929#if defined(STM32C0xx)
30- #define VTEMP 760
30+ #define VTEMP 760
3131#define AVG_SLOPE 2530
32- #define VREFINT 1212
32+ #define VREFINT 1212
3333#elif defined(STM32F1xx)
34- #define VTEMP 1430
34+ #define VTEMP 1430
3535#define AVG_SLOPE 4300
36- #define VREFINT 1200
36+ #define VREFINT 1200
3737#elif defined(STM32F2xx) || defined(STM32F4xx)
38- #define VTEMP 760
38+ #define VTEMP 760
3939#define AVG_SLOPE 2500
40- #define VREFINT 1210
40+ #define VREFINT 1210
4141#endif
4242
4343/* Analog read resolution */
44+ #if defined(LL_ADC_RESOLUTION_12B)
4445#define LL_ADC_RESOLUTION LL_ADC_RESOLUTION_12B
46+ #elif defined(LL_ADC_DS_DATA_WIDTH_12_BIT)
47+ #define LL_ADC_RESOLUTION LL_ADC_DS_DATA_WIDTH_12_BIT
48+ #else
49+ #error "ADC resolution could not be defined!"
50+ #endif
4551#define ADC_RANGE 4096
4652
4753// the setup routine runs once when you press reset:
4854void setup () {
4955 // initialize serial communication at 9600 bits per second:
5056 Serial.begin (9600 );
51- while (!Serial);
57+ while (!Serial)
58+ ;
5259 analogReadResolution (12 );
5360}
5461
55- static int32_t readVref ()
56- {
62+ #ifdef AVREF
63+ static uint32_t readVref () {
64+ uint32_t Vref = 3300 ;
5765#ifdef STM32U0xx
5866 /* On some devices Internal voltage reference calibration value not programmed
5967 during production and return 0xFFFF. See errata sheet. */
60- if ((uint32_t )(*VREFINT_CAL_ADDR) == 0xFFFF ) {
61- return 3300U ;
62- }
68+ if ((uint32_t )(*VREFINT_CAL_ADDR) != 0xFFFF ) {
6369#endif
6470#ifdef __LL_ADC_CALC_VREFANALOG_VOLTAGE
6571#ifdef STM32U5xx
66- return ( __LL_ADC_CALC_VREFANALOG_VOLTAGE (ADC1, analogRead (AVREF), LL_ADC_RESOLUTION) );
72+ Vref = __LL_ADC_CALC_VREFANALOG_VOLTAGE (ADC1, analogRead (AVREF), LL_ADC_RESOLUTION);
6773#else
68- return ( __LL_ADC_CALC_VREFANALOG_VOLTAGE (analogRead (AVREF), LL_ADC_RESOLUTION) );
74+ Vref = __LL_ADC_CALC_VREFANALOG_VOLTAGE (analogRead (AVREF), LL_ADC_RESOLUTION);
6975#endif
7076#else
71- return (VREFINT * ADC_RANGE / analogRead (AVREF)); // ADC sample to mV
77+ Vref = VREFINT * ADC_RANGE / analogRead (AVREF); // ADC sample to mV
78+ #endif
79+ #ifdef STM32U0xx
80+ }
7281#endif
82+ return Vref;
7383}
84+ #endif
7485
7586#ifdef ATEMP
76- static int32_t readTempSensor (int32_t VRef)
77- {
87+ static int32_t readTempSensor (int32_t VRef) {
88+ uint32_t temp = 0 ;
7889#ifdef __LL_ADC_CALC_TEMPERATURE
7990#ifdef STM32U5xx
80- return (__LL_ADC_CALC_TEMPERATURE (ADC1, VRef, analogRead (ATEMP), LL_ADC_RESOLUTION));
91+ temp = __LL_ADC_CALC_TEMPERATURE (ADC1, VRef, analogRead (ATEMP), LL_ADC_RESOLUTION);
92+ #elif defined(STM32WB0x)
93+ (void )VRef;
94+ temp = __LL_ADC_CALC_TEMPERATURE (analogRead (ATEMP), LL_ADC_DS_DATA_WIDTH_12_BIT);
8195#else
82- return ( __LL_ADC_CALC_TEMPERATURE (VRef, analogRead (ATEMP), LL_ADC_RESOLUTION) );
96+ temp = __LL_ADC_CALC_TEMPERATURE (VRef, analogRead (ATEMP), LL_ADC_RESOLUTION);
8397#endif
8498#elif defined(__LL_ADC_CALC_TEMPERATURE_TYP_PARAMS)
85- return (__LL_ADC_CALC_TEMPERATURE_TYP_PARAMS (AVG_SLOPE, VTEMP, CALX_TEMP, VRef, analogRead (ATEMP), LL_ADC_RESOLUTION));
86- #else
87- return 0 ;
99+ temp = __LL_ADC_CALC_TEMPERATURE_TYP_PARAMS (AVG_SLOPE, VTEMP, CALX_TEMP, VRef, analogRead (ATEMP), LL_ADC_RESOLUTION);
88100#endif
101+ return temp;
89102}
90103#endif
91104
92- static int32_t readVoltage (int32_t VRef, uint32_t pin)
93- {
105+ static int32_t readVoltage (int32_t VRef, uint32_t pin) {
94106#ifdef STM32U5xx
95107 return (__LL_ADC_CALC_DATA_TO_VOLTAGE (ADC1, VRef, analogRead (pin), LL_ADC_RESOLUTION));
96108#else
@@ -100,7 +112,7 @@ static int32_t readVoltage(int32_t VRef, uint32_t pin)
100112
101113// The loop routine runs over and over again forever:
102114void loop () {
103- #if defined(ICACHE) && defined (HAL_ICACHE_MODULE_ENABLED) && !defined(HAL_ICACHE_MODULE_DISABLED)
115+ #if defined(ICACHE) && defined(HAL_ICACHE_MODULE_ENABLED) && !defined(HAL_ICACHE_MODULE_DISABLED)
104116 bool icache_enabled = false ;
105117 if (HAL_ICACHE_IsEnabled () == 1 ) {
106118 icache_enabled = true ;
@@ -110,9 +122,15 @@ void loop() {
110122 }
111123 }
112124#endif /* ICACHE && HAL_ICACHE_MODULE_ENABLED && !HAL_ICACHE_MODULE_DISABLED */
125+
113126 // Print out the value read
127+ #ifdef AVREF
114128 int32_t VRef = readVref ();
115129 Serial.printf (" VRef(mv)= %i" , VRef);
130+ #else
131+ // No Vref fro STM32WB0xx
132+ int32_t VRef = LL_ADC_VIN_RANGE_3V6;
133+ #endif
116134#ifdef ATEMP
117135 Serial.printf (" \t Temp(°C)= %i" , readTempSensor (VRef));
118136#endif
@@ -121,9 +139,8 @@ void loop() {
121139#endif
122140 Serial.printf (" \t A0(mv)= %i\n " , readVoltage (VRef, A0));
123141 delay (200 );
124- #if defined(ICACHE) && defined (HAL_ICACHE_MODULE_ENABLED) && !defined(HAL_ICACHE_MODULE_DISABLED)
125- if (icache_enabled)
126- {
142+ #if defined(ICACHE) && defined(HAL_ICACHE_MODULE_ENABLED) && !defined(HAL_ICACHE_MODULE_DISABLED)
143+ if (icache_enabled) {
127144 /* Re-enable instruction cache */
128145 if (HAL_ICACHE_Enable () != HAL_OK) {
129146 Error_Handler ();
0 commit comments