cancel
Showing results for 
Search instead for 
Did you mean: 

I make a boot on stm32f103, after I enable __enable_irq(); then hang

sheng yang
Senior

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;

 

1 REPLY 1
sheng yang
Senior

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 0

we can see that the code 

rboot_kprintf("%s %d\r\n", __func__, __LINE__);

after 

    __enable_irq();
not print.