fix(radio): microsecond timer (#6544)

Co-authored-by: raphaelcoeffic <1050031+raphaelcoeffic@users.noreply.github.com>
This commit is contained in:
Raphael Coeffic
2025-08-24 08:31:24 +02:00
committed by GitHub
co-authored by raphaelcoeffic
parent 95a41789f4
commit d1d59b5cb2
2 changed files with 11 additions and 19 deletions
@@ -40,7 +40,7 @@
#define OVERSAMPLING 4
#endif
#define SAMPLING_TIMEOUT_US 500
#define SAMPLING_TIMEOUT_US 200
// Please note that we use the same prio for DMA TC and ADC IRQs
// to avoid issues with preemption between these 2
@@ -83,7 +83,7 @@ static uint8_t _adc_oversampling_disabled;
static uint16_t _adc_oversampling[MAX_ADC_INPUTS];
// Indicates ADC timeout has occured
static bool _adc_timeout_error;
static volatile bool _adc_timeout_error;
void stm32_hal_set_inputs_mask(uint32_t inputs)
{
@@ -271,18 +271,8 @@ static void adc_setup_scan_mode(ADC_TypeDef* ADCx, uint8_t nconv)
}
#if defined(STM32H7RS) || defined(STM32H7) || defined(STM32H5)
#if defined(ADC3)
#define _SUPPORTS_OVS(adc) (adc != ADC3)
#else
#define _SUPPORTS_OVS(adc) (true)
#endif
// set hardware oversampling
if (!_adc_oversampling_disabled && _SUPPORTS_OVS(ADCx)) {
// LL_ADC_OVS_RATIO_x in stm32h7xx_ll_adc.h is broken
// so actual oversampling count need to be used
// ADC3 oversampling is disabled because of issues in LL libs
if (!_adc_oversampling_disabled) {
LL_ADC_ConfigOverSamplingRatioShift(ADCx, 16, LL_ADC_OVS_SHIFT_RIGHT_4);
LL_ADC_SetOverSamplingScope(ADCx, LL_ADC_OVS_GRP_REGULAR_CONTINUED);
}
@@ -731,6 +721,7 @@ static void adc_start_read(const stm32_adc_t* ADCs, uint8_t n_ADC)
bool stm32_hal_adc_start_read(const stm32_adc_t* ADCs, uint8_t n_ADC,
const stm32_adc_input_t* inputs, uint8_t n_inputs)
{
_adc_timeout_error = false;
_adc_completed = 0;
_adc_run = 0;
@@ -790,13 +781,9 @@ void stm32_hal_adc_wait_completion(const stm32_adc_t* ADCs, uint8_t n_ADC,
while(!_adc_completed) {
// busy wait
if ((uint32_t)(timersGetUsTick() - timeout) >= SAMPLING_TIMEOUT_US) {
TRACE("ADC timeout");
_adc_timeout_error = true;
_adc_started_mask = 0;
return;
}
}
_adc_timeout_error = false;
}
void stm32_hal_adc_disable_oversampling()
@@ -813,7 +800,9 @@ static void _adc_mark_completed(const stm32_adc_t* adc)
static void _adc_chain_conversions(const stm32_adc_t* adc)
{
_adc_mark_completed(adc);
if (_adc_started_mask != 0) return;
if (_adc_timeout_error) return;
if (!_adc_oversampling_disabled && (++_adc_run < OVERSAMPLING)) {
adc_start_read(_adc_ADCs, _adc_n_ADC);
@@ -824,7 +813,7 @@ static void _adc_chain_conversions(const stm32_adc_t* adc)
for (uint8_t i = 0; i < _adc_n_inputs; i++) {
if (~_adc_input_mask & (1 << i)) continue;
if (_adc_inhibit_mask & (1 << i)) continue;
if (!_adc_timeout_error) adcValues[i] = _adc_oversampling[i] / OVERSAMPLING;
adcValues[i] = _adc_oversampling[i] / OVERSAMPLING;
}
// we're done!
@@ -43,7 +43,7 @@ static void _init_1ms_timer()
MS_TIMER->DIER = TIM_DIER_UIE;
NVIC_EnableIRQ(MS_TIMER_IRQn);
NVIC_SetPriority(MS_TIMER_IRQn, 4);
NVIC_SetPriority(MS_TIMER_IRQn, 0);
}
void timersInit()
@@ -85,6 +85,9 @@ static inline void _interrupt_1ms()
++pre_scale;
++_ms_ticks;
__DSB();
__ISB();
// 5ms loop
if(pre_scale == 5 || pre_scale == 10) {
per5ms();