From 58361589d819c542be005744b80d24b6022b901f Mon Sep 17 00:00:00 2001 From: xiao Date: Wed, 29 Apr 2026 06:06:26 +0800 Subject: [PATCH] fix: defer ch390 exti until rtos is ready --- Core/Src/gpio.c | 10 ++++++++-- Core/Src/stm32f1xx_it.c | 8 ++++++-- Drivers/CH390/CH390_Interface.c | 2 ++ 3 files changed, 16 insertions(+), 4 deletions(-) diff --git a/Core/Src/gpio.c b/Core/Src/gpio.c index b53bd1f..c351fac 100644 --- a/Core/Src/gpio.c +++ b/Core/Src/gpio.c @@ -76,9 +76,15 @@ void MX_GPIO_Init(void) GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW; HAL_GPIO_Init(GPIOB, &GPIO_InitStruct); - /* EXTI interrupt init*/ + /* EXTI interrupt init + * Keep CH390 INT masked during early boot. PB0 may already be asserted at + * power-on, while the FreeRTOS semaphore is not created until + * MX_FREERTOS_Init(). The network driver enables EXTI0 after CH390 and the + * RTOS objects are ready. + */ + HAL_NVIC_DisableIRQ(EXTI0_IRQn); + __HAL_GPIO_EXTI_CLEAR_IT(GPIO_PIN_0); HAL_NVIC_SetPriority(EXTI0_IRQn, 6, 0); - HAL_NVIC_EnableIRQ(EXTI0_IRQn); } diff --git a/Core/Src/stm32f1xx_it.c b/Core/Src/stm32f1xx_it.c index 5a83181..697aef5 100644 --- a/Core/Src/stm32f1xx_it.c +++ b/Core/Src/stm32f1xx_it.c @@ -2,6 +2,7 @@ #include "stm32f1xx_it.h" #include "FreeRTOS.h" +#include "semphr.h" #include "task.h" #include "app_runtime.h" @@ -101,8 +102,11 @@ void EXTI0_IRQHandler(void) if (__HAL_GPIO_EXTI_GET_IT(GPIO_PIN_0) != RESET) { __HAL_GPIO_EXTI_CLEAR_IT(GPIO_PIN_0); - xSemaphoreGiveFromISR(xNetSemaphore, &xHigherPriorityTaskWoken); - portYIELD_FROM_ISR(xHigherPriorityTaskWoken); + if ((xNetSemaphore != NULL) && + (xTaskGetSchedulerState() == taskSCHEDULER_RUNNING)) { + xSemaphoreGiveFromISR(xNetSemaphore, &xHigherPriorityTaskWoken); + portYIELD_FROM_ISR(xHigherPriorityTaskWoken); + } } } diff --git a/Drivers/CH390/CH390_Interface.c b/Drivers/CH390/CH390_Interface.c index 6e65e67..88ed4d5 100644 --- a/Drivers/CH390/CH390_Interface.c +++ b/Drivers/CH390/CH390_Interface.c @@ -188,6 +188,8 @@ void ch390_interrupt_init(void) /* EXTI0 is configured in CubeMX for PB0 */ /* NVIC priority should be >= configLIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY */ /* for FreeRTOS compatibility */ + HAL_NVIC_DisableIRQ(EXTI0_IRQn); + __HAL_GPIO_EXTI_CLEAR_IT(CH390_INT_PIN); HAL_NVIC_SetPriority(EXTI0_IRQn, 6, 0); HAL_NVIC_EnableIRQ(EXTI0_IRQn); }