Procházet zdrojové kódy

Api hal timebase: fix lptim lockups caused by flag clear outside of interrupt (#332)

あく před 5 roky
rodič
revize
928bca4eaa

+ 12 - 3
firmware/targets/f4/api-hal/api-hal-timebase.c

@@ -11,6 +11,12 @@
 #define API_HAL_TIMEBASE_TICK_PER_EPOCH (API_HAL_TIMEBASE_TIMER_MAX / API_HAL_TIMEBASE_CLK_PER_TICK)
 #define API_HAL_TIMEBASE_MAX_SLEEP (API_HAL_TIMEBASE_TICK_PER_EPOCH - 1)
 
+#ifdef API_HAL_TIMEBASE_DEBUG
+#include <stm32wbxx_ll_gpio.h>
+#define LED_GREEN_PORT GPIOA
+#define LED_GREEN_PIN LL_GPIO_PIN_2
+#endif
+
 typedef struct {
     // Sleep control
     volatile uint16_t insomnia;
@@ -98,7 +104,13 @@ static inline uint32_t api_hal_timebase_sleep(TickType_t expected_idle_ticks) {
 
     HAL_SuspendTick();
     // Go to stop2 mode
+#ifdef API_HAL_TIMEBASE_DEBUG
+    LL_GPIO_SetOutputPin(LED_GREEN_PORT, LED_GREEN_PIN);
+#endif
     api_hal_power_deep_sleep();
+#ifdef API_HAL_TIMEBASE_DEBUG
+    LL_GPIO_ResetOutputPin(LED_GREEN_PORT, LED_GREEN_PIN);
+#endif
 
     HAL_ResumeTick();
 
@@ -111,10 +123,7 @@ static inline uint32_t api_hal_timebase_sleep(TickType_t expected_idle_ticks) {
 
     // Store and clear interrupt flags
     // we don't want handler to be called after renabling IRQ
-    bool cmpm_flag = LL_LPTIM_IsActiveFlag_CMPM(API_HAL_TIMEBASE_TIMER);
-    if (cmpm_flag) LL_LPTIM_ClearFLAG_CMPM(API_HAL_TIMEBASE_TIMER);
     bool arrm_flag = LL_LPTIM_IsActiveFlag_ARRM(API_HAL_TIMEBASE_TIMER);
-    if (arrm_flag) LL_LPTIM_ClearFLAG_ARRM(API_HAL_TIMEBASE_TIMER);
 
     // Calculate and set next wakeup compare value
     const uint16_t next_cmp = (after_tick + 1) * API_HAL_TIMEBASE_CLK_PER_TICK;

+ 5 - 0
firmware/targets/f4/target.mk

@@ -14,6 +14,11 @@ FLASH_ADDRESS	= 0x08000000
 CFLAGS			+= -DNO_BOOTLOADER
 endif
 
+API_HAL_TIMEBASE_DEBUG ?= 0
+ifeq ($(API_HAL_TIMEBASE_DEBUG), 1)
+CFLAGS			+= -DAPI_HAL_TIMEBASE_DEBUG
+endif
+
 OPENOCD_OPTS	= -f interface/stlink.cfg -c "transport select hla_swd" -f ../debug/stm32wbx.cfg -c "stm32wbx.cpu configure -rtos auto" -c "init"
 BOOT_CFLAGS		= -DBOOT_ADDRESS=$(BOOT_ADDRESS) -DFW_ADDRESS=$(FW_ADDRESS) -DOS_OFFSET=$(OS_OFFSET)
 MCU_FLAGS		= -mcpu=cortex-m4 -mthumb -mfpu=fpv4-sp-d16 -mfloat-abi=hard