2025-11-25 2:48 AM
I want to make a project on stm32f103, I write some code. When I want to add sd card support, I need to use spi interrrupt enable.
But after I enable the global irq then the code is hang. Besides I debug the code with gdb, then I do ctrl + c , then I found the code hang in some nvic irq handler like WWDG_IRQHandler, UsageFault_Handler, USB_LP_CAN1_RX0_IRQHandler randomly.
I try to disable all nvic irq and clear the pendings , But I found it's useless, the code as below
int ret;
LL_SPI_InitTypeDef spi_init;
LL_GPIO_InitTypeDef gpio_instance = {0};
LL_GPIO_AF_Remap_SWJ_NOJTAG();
__HAL_RCC_SPI3_CLK_ENABLE();
__HAL_RCC_GPIOB_CLK_ENABLE();
__HAL_RCC_GPIOA_CLK_ENABLE();
/**SPI GPIO Configuration
PA15 ------> SPI3_NSS
PB3 ------> SPI3_CLK
PB4 ------> SPI3_MISO
PB5 ------> SPI3_MOSI
*/
gpio_instance.Pin = LL_GPIO_PIN_15;
gpio_instance.Mode = LL_GPIO_MODE_ALTERNATE;
gpio_instance.Speed = LL_GPIO_SPEED_FREQ_HIGH;
LL_GPIO_Init(GPIOA, &gpio_instance);
gpio_instance.Pin = LL_GPIO_PIN_3;
LL_GPIO_Init(GPIOB, &gpio_instance);
gpio_instance.Pin = LL_GPIO_PIN_4;
LL_GPIO_Init(GPIOB, &gpio_instance);
gpio_instance.Pin = LL_GPIO_PIN_5;
LL_GPIO_Init(GPIOB, &gpio_instance);
__HAL_RCC_SPI3_CLK_ENABLE();
LL_SPI_StructInit(&spi_init);
spi_init.Mode = LL_SPI_MODE_MASTER;
spi_init.NSS = LL_SPI_NSS_HARD_OUTPUT;
ret = LL_SPI_Init(SPI3, &spi_init);
LL_SPI_EnableIT_ERR(SPI3);
LL_SPI_EnableIT_RXNE(SPI3);
/* LL_SPI_EnableIT_TXE(SPI3); */
NVIC_DisableIRQ(WWDG_IRQn);
HAL_NVIC_SetPriority(SPI3_IRQn, 6U, 0U);
/* HAL_NVIC_EnableIRQ(SPI3_IRQn); */
LL_SPI_Enable(SPI3);
WWDG->CR &= ~WWDG_CR_WDGA;
WWDG->CFR &= ~WWDG_CFR_EWI;
WWDG->SR = 0x00;
NVIC_ClearPendingIRQ(WWDG_IRQn);
__HAL_RCC_WWDG_CLK_DISABLE();
__HAL_RCC_WWDG_CLK_ENABLE(); // 确保外设有时钟
WWDG->CR &= ~WWDG_CR_WDGA; // 停止 WWDG
WWDG->CFR &= ~WWDG_CFR_EWI; // 关闭早期唤醒
WWDG->SR = 0x00; // 清 EWIF
NVIC_ClearPendingIRQ(WWDG_IRQn); // 清 NVIC pending
__HAL_RCC_WWDG_CLK_DISABLE(); // 如需彻底关掉再关时钟
rboot_kprintf("%s %d\r\n", __func__, __LINE__);
int i = 0;
for (i = 0; i < sizeof(NVIC->ICER); i++)
{
NVIC->ICER[i] = 0XFFFFFFFF;
rboot_kprintf("%s %d %x\r\n", __func__, __LINE__, NVIC->ICER[i]);
NVIC->ICPR[i] = 0XFFFFFFFF;
rboot_kprintf("%s %d %x\r\n", __func__, __LINE__, NVIC->ICPR[i]);
}
for (i = 0; i < sizeof(NVIC->IABR); i++)
{
rboot_kprintf("%s %d %x\r\n", __func__, __LINE__, NVIC->IABR[i]);
}
__enable_irq();
rboot_kprintf("%s %d\r\n", __func__, __LINE__);
return ret;
2025-11-25 2:53 AM
the debug console as below:
clock freq=36000000
sdcard_port_init 201
sdcard_port_init 206 0
sdcard_port_init 208 0
sdcard_port_init 206 0
sdcard_port_init 208 0
sdcard_port_init 206 0
sdcard_port_init 208 0
sdcard_port_init 206 0
sdcard_port_init 208 0
sdcard_port_init 206 0
sdcard_port_init 208 0
sdcard_port_init 206 0
sdcard_port_init 208 0
sdcard_port_init 206 0
sdcard_port_init 208 0
sdcard_port_init 206 0
sdcard_port_init 208 0
sdcard_port_init 206 0
sdcard_port_init 208 0
sdcard_port_init 206 0
sdcard_port_init 208 0
sdcard_port_init 206 0
sdcard_port_init 208 0
sdcard_port_init 206 0
sdcard_port_init 208 0
sdcard_port_init 206 0
sdcard_port_init 208 0
sdcard_port_init 206 0
sdcard_port_init 208 0
sdcard_port_init 206 0
sdcard_port_init 208 0
sdcard_port_init 206 0
sdcard_port_init 208 0
sdcard_port_init 206 0
sdcard_port_init 208 0
sdcard_port_init 206 0
sdcard_port_init 208 0
sdcard_port_init 206 0
sdcard_port_init 208 0
sdcard_port_init 206 0
sdcard_port_init 208 0
sdcard_port_init 206 0
sdcard_port_init 208 0
sdcard_port_init 206 0
sdcard_port_init 208 0
sdcard_port_init 206 0
sdcard_port_init 208 0
sdcard_port_init 206 0
sdcard_port_init 208 0
sdcard_port_init 206 0
sdcard_port_init 208 0
sdcard_port_init 206 0
sdcard_port_init 208 0
sdcard_port_init 206 0
sdcard_port_init 208 0
sdcard_port_init 206 0
sdcard_port_init 208 0
sdcard_port_init 206 0
sdcard_port_init 208 0
sdcard_port_init 206 0
sdcard_port_init 208 0
sdcard_port_init 206 0
sdcard_port_init 208 0
sdcard_port_init 206 0
sdcard_port_init 208 0
sdcard_port_init 213 0
sdcard_port_init 213 0
sdcard_port_init 213 0
sdcard_port_init 213 0
sdcard_port_init 213 0
sdcard_port_init 213 0
sdcard_port_init 213 0
sdcard_port_init 213 0
sdcard_port_init 213 0
sdcard_port_init 213 0
sdcard_port_init 213 0
sdcard_port_init 213 0
sdcard_port_init 213 0
sdcard_port_init 213 0
sdcard_port_init 213 0
sdcard_port_init 213 0
sdcard_port_init 213 0
sdcard_port_init 213 0
sdcard_port_init 213 0
sdcard_port_init 213 0
sdcard_port_init 213 0
sdcard_port_init 213 0
sdcard_port_init 213 0
sdcard_port_init 213 0
sdcard_port_init 213 0
sdcard_port_init 213 0
sdcard_port_init 213 0
sdcard_port_init 213 0
sdcard_port_init 213 0
sdcard_port_init 213 0
sdcard_port_init 213 0
sdcard_port_init 213 0we can see that the code
rboot_kprintf("%s %d\r\n", __func__, __LINE__);after
__enable_irq();not print.