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;
Solved! Go to Solution.
2025-11-25 5:11 AM
Why are you messing with WWDG at all in there?
Sounds like it's in the default interrupt handler. Read the VECTACTIVE bits to see which interrupt the chip is in. Probably it's in an interrupt you haven't defined. Possibly due to a typo.
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.
2025-11-25 5:11 AM
Why are you messing with WWDG at all in there?
Sounds like it's in the default interrupt handler. Read the VECTACTIVE bits to see which interrupt the chip is in. Probably it's in an interrupt you haven't defined. Possibly due to a typo.
2025-11-25 10:09 PM
thanks for your patient replay. after I check VECTACTIVE bits , I found the value is 0XF, It's systick handler. I do not defined the systick hander before, after I define a SysTick_Handler function , it's ok now.