编写中断函数及配置中断时,代码没有问题,使用GPIOA PA11作为中断,程序烧录后一直无法运行,追踪了好久,程序一直死在启动文件.s的B.中,搜索大神们关于程序卡死在B.文件中
但是我找了半天,很确信中断函数都进行了处理处理,说明不是这个问题。继续探究,先附上代码,解决方法如下:
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_IRQnHandlerrn”);
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中断优先级配置冲突。