From 18fc7d21f161ec8d78ca2767ad9e3048e8129c2b Mon Sep 17 00:00:00 2001 From: raphaelcoeffic Date: Mon, 20 Mar 2023 09:54:13 +0100 Subject: [PATCH 1/4] fix: pulse driver with 32bit timers --- radio/src/targets/common/arm/stm32/stm32_pulse_driver.cpp | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/radio/src/targets/common/arm/stm32/stm32_pulse_driver.cpp b/radio/src/targets/common/arm/stm32/stm32_pulse_driver.cpp index b339e09f14e..dbcb470b407 100644 --- a/radio/src/targets/common/arm/stm32/stm32_pulse_driver.cpp +++ b/radio/src/targets/common/arm/stm32/stm32_pulse_driver.cpp @@ -70,7 +70,11 @@ void stm32_pulse_init(const stm32_pulse_timer_t* tim, uint32_t freq) } timInit.Prescaler = __LL_TIM_CALC_PSC(tim->TIM_Freq, freq); - timInit.Autoreload = STM32_DEFAULT_TIMER_AUTORELOAD; + if (IS_TIM_32B_COUNTER_INSTANCE(tim->TIMx)) { + timInit.Autoreload = 0xFFFFFFFFUL; + } else { + timInit.Autoreload = STM32_DEFAULT_TIMER_AUTORELOAD; + } enable_tim_clock(tim->TIMx); LL_TIM_Init(tim->TIMx, &timInit); From 24b20973fb065897aaa19bfe53873624f3d6bd8a Mon Sep 17 00:00:00 2001 From: raphaelcoeffic Date: Mon, 20 Mar 2023 19:50:03 +0100 Subject: [PATCH 2/4] fix(mpm): clear RX buffer before signature --- radio/src/io/multi_firmware_update.cpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/radio/src/io/multi_firmware_update.cpp b/radio/src/io/multi_firmware_update.cpp index 945fbed4edd..d82937672ef 100644 --- a/radio/src/io/multi_firmware_update.cpp +++ b/radio/src/io/multi_firmware_update.cpp @@ -233,6 +233,8 @@ const char * MultiFirmwareUpdateDriver::waitForInitialSync() const char * MultiFirmwareUpdateDriver::getDeviceSignature(uint8_t * signature) const { + clear(); + // Read signature sendByte(STK_READ_SIGN); sendByte(CRC_EOP); From 3e9ba9f7796aa66a217cc5e96e2d85c652cb964c Mon Sep 17 00:00:00 2001 From: raphaelcoeffic Date: Mon, 20 Mar 2023 17:48:17 +0100 Subject: [PATCH 3/4] fix: add some debouncing on soft-serial start bit detection This helps coping with spurious impulses on S.PORT created by payload sent over PPM pin (X10E). --- .../common/arm/stm32/stm32_softserial_driver.cpp | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/radio/src/targets/common/arm/stm32/stm32_softserial_driver.cpp b/radio/src/targets/common/arm/stm32/stm32_softserial_driver.cpp index 5489df0e81a..c6857afa17c 100644 --- a/radio/src/targets/common/arm/stm32/stm32_softserial_driver.cpp +++ b/radio/src/targets/common/arm/stm32/stm32_softserial_driver.cpp @@ -43,14 +43,21 @@ static const stm32_softserial_rx_port* _softserialPort; static void _softserial_exti() { if (rxBitCount == 0) { + auto port = _softserialPort; + + // cheap debouncing... + for (uint8_t i = 0; i < 16; ++i) { + if (LL_GPIO_IsInputPinSet(port->GPIOx, port->GPIO_Pin) == 0) + return; + } // enable timer counter - auto TIMx = _softserialPort->TIMx; + auto TIMx = port->TIMx; LL_TIM_SetAutoReload(TIMx, (BITLEN + BITLEN/2) - 1); LL_TIM_EnableCounter(TIMx); // disable start bit interrupt - LL_EXTI_DisableIT_0_31(_softserialPort->EXTI_Line); + LL_EXTI_DisableIT_0_31(port->EXTI_Line); } } From 61f674acbc569e8acdf3777ec77996415caadbe2 Mon Sep 17 00:00:00 2001 From: raphaelcoeffic Date: Mon, 20 Mar 2023 17:49:30 +0100 Subject: [PATCH 4/4] fix: whenever the RXNE bit is set, read the register ... regardless of errors. That allows for reducing the effect of detected errors. --- .../src/targets/common/arm/stm32/stm32_usart_driver.cpp | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/radio/src/targets/common/arm/stm32/stm32_usart_driver.cpp b/radio/src/targets/common/arm/stm32/stm32_usart_driver.cpp index 42ea30ea29e..5f499172995 100644 --- a/radio/src/targets/common/arm/stm32/stm32_usart_driver.cpp +++ b/radio/src/targets/common/arm/stm32/stm32_usart_driver.cpp @@ -557,14 +557,15 @@ void stm32_usart_isr(const stm32_usart_t* usart, etx_serial_callbacks_t* cb) // Drain RX while (status & (LL_USART_SR_RXNE | USART_FLAG_ERRORS)) { - // This will clear the RXNE bit in USART_DR register - uint8_t data = LL_USART_ReadReg(usart->USARTx, DR); - if (status & USART_FLAG_ERRORS) { if (cb->on_error) cb->on_error(); } - else { + + if (status & LL_USART_SR_RXNE) { + // This will clear the RXNE bit in USART_DR register + uint8_t data = LL_USART_ReadReg(usart->USARTx, DR); + if (cb->on_receive) cb->on_receive(data); }