STM32F103 库函数写外部中断时程序卡死,追踪运行卡死在启动文件.s的 B.中解决办法,实测OK,供参考

编写中断函数及配置中断时,代码没有问题,使用GPIOA PA11作为中断,程序烧录后一直无法运行,追踪了好久,程序一直死在启动文件.s的B.中,搜索大神们关于程序卡死在B.文件中,说如下:(在此谢谢大神https://blog.csdn.net/u014470361/article/details/78780444),继续下文

STM32F103 库函数写外部中断时程序卡死,追踪运行卡死在启动文件.s的 B.中解决办法,实测OK,供参考

但是我找了半天,很确信中断函数都进行了处理处理,说明不是这个问题。继续探究,先附上代码,解决方法如下:

void GPIO_InterFuntionInit(void)
{
    GPIO_InitTypeDef  GPIO_InitStructure;
    NVIC_InitTypeDef NVIC_InitStructure;
    EXTI_InitTypeDef EXTI_InitStructure;

    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);     //使能端口时钟
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);

    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11|GPIO_Pin_12;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPD;    //
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;    //IO口速度为2MHz
    GPIO_Init(GPIOA, &GPIO_InitStructure);              //

    EXTI_DeInit();
    EXTI_StructInit(&EXTI_InitStructure);
    GPIO_EXTILineConfig(GPIO_PortSourceGPIOA,GPIO_PinSource11);
    EXTI_InitStructure.EXTI_Line=EXTI_Line11; //配置EXTI中断线
    EXTI_InitStructure.EXTI_Mode=EXTI_Mode_Interrupt; //配置EXTI模式为中断
    EXTI_InitStructure.EXTI_Trigger=EXTI_Trigger_Rising; //配置EXTI触发方式
    EXTI_InitStructure.EXTI_LineCmd=ENABLE; //使能EXTI中断线
    EXTI_Init(&EXTI_InitStructure); //根据指定的参数初始化EXTI寄存器

    NVIC_InitStructure.NVIC_IRQChannel = EXTI15_10_IRQn; //EXTIx 中断通道
    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=2; //抢占优先级
    NVIC_InitStructure.NVIC_IRQChannelSubPriority = 2; //响应优先级
    NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //IRQ通道使能
    NVIC_Init(&NVIC_InitStructure); //根据指定的参数初始化NVIC寄存器
    
    //EXTI_GenerateSWInterrupt(EXTI_Line12);
}

void EXTI15_10_IRQHandler(void)
{
    if(EXTI_GetITStatus(EXTI_Line11)!=RESET)
    {
        EXTI_ClearITPendingBit(EXTI_Line11);

        SendData(USE_USART1,(u8*)"EXTI15_10_IRQnHandler\r\n");
        MCU_RUN_LED(1);
        delay_ms(1000);

    }
}

 

解决方法:

原来除了我在主函数中声明了

GPIO_InterFuntionInit();外,还声明了一个函数DeviceInfo_Read();,这个函数是用来读取STM32的唯一标识符的,问题就出在这个函数,函数内容如下:

u32 DeviceInfo_Read(void)
{
    u8 iTempStr[512];
    u16 tt1,tt2;

    STMFLASH_Read(DEVICE_INFO_ADD,(u16*)iTempStr,64);
    //delay_ms(50);
    tt1 = Str_PosLtoR((char*)iTempStr,"startid:",1);
    tt2 = Str_PosRtoL((char*)iTempStr,":end",1);
    if((tt1==0) || (tt2==0)){
        return 0;
    }
    else{
        tt1 = Str_Pos((char*)iTempStr,"startid:");
        tt2 = Str_Pos((char*)iTempStr,":end");
        Str_SubString((char*)iTempStr,tt1,tt2-tt1);
        DEVICE_NUMBER = Str_StrToNum((char*)iTempStr,1);
    }
    if(DEVICE_NUMBER) return DEVICE_NUMBER;
    return 0;
}

函数会读取STM32 FLASH上的内容,同时也会读取stm32的唯一标识符。这个与中断冲突了,屏蔽这个函数就OK了。

 

另一种可能:NVIC中断优先级配置冲突

总结:

BUG好烦