进入一次中断然后会hardfault

void Encoder_Init(void)

{

     RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO | RCC_APB2Periph_GPIOC, ENABLE);

     GPIO_InitTypeDef GPIO_InitStructure;

     EXTI_InitTypeDef EXTI_InitStructure = {0};

     NVIC_InitTypeDef NVIC_InitStructure = {0};

     GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_3;

     GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; // 上拉输入模式

     GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; // 配置引脚速率为50MHz

     GPIO_Init(GPIOC, &GPIO_InitStructure);


     GPIO_EXTILineConfig(GPIO_PortSourceGPIOC, GPIO_PinSource3);


         // 配置EXTI Line0

     EXTI_InitStructure.EXTI_Line = EXTI_Line3;

     EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;

     EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling; // 触发下降沿中断

     EXTI_InitStructure.EXTI_LineCmd = ENABLE;

     EXTI_Init(&EXTI_InitStructure);

         // 配置并使能EXTI 1 2 3 中断

     NVIC_InitStructure.NVIC_IRQChannel = EXTI3_IRQn;

     NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;

     NVIC_InitStructure.NVIC_IRQChannelSubPriority = 2;

     NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;

     NVIC_Init(&NVIC_InitStructure);

}

这里配置GPIOC_Pin_3中断。

void New_Encoder_Init(void)

{

         RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO | RCC_APB2Periph_GPIOA, ENABLE);

         GPIO_InitTypeDef GPIO_InitStructure;

         EXTI_InitTypeDef EXTI_InitStructure = {0};

         NVIC_InitTypeDef NVIC_InitStructure = {0};

         GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4 | GPIO_Pin_5 | GPIO_Pin_0;

         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; // 上拉输入模式

         GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; // 配置引脚速率为50MHz

         GPIO_Init(GPIOA, &GPIO_InitStructure);


         GPIO_EXTILineConfig(GPIO_PortSourceGPIOA, GPIO_PinSource0);


             // 配置EXTI Line0

         EXTI_InitStructure.EXTI_Line = EXTI_Line0;

         EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;

         EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling; // 触发下降沿中断

         EXTI_InitStructure.EXTI_LineCmd = ENABLE;

         EXTI_Init(&EXTI_InitStructure);

             // 配置并使能EXTI 1 2 3 中断

         NVIC_InitStructure.NVIC_IRQChannel = EXTI0_IRQn;

         NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 2;

         NVIC_InitStructure.NVIC_IRQChannelSubPriority = 2;

         NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;

         NVIC_Init(&NVIC_InitStructure);

}

这里是GPIOA_Pin_0的中断

image.png1720716550774789.png



    



上面是gpioa的中断处理函数


image.png

这个是GPIOC_3的中断处理函数。(上面有一个错误,把while循环写入到if里面,其实不和下面一样也行,这里改成一样)。然后EXTIO0的中断进入一次,再按下按键,会进入hardfault错误,然后exti3没有问题啊。然后然后新建一个工程,exti3和exti0,反正不管怎么怎么测,都只能进入一次。然后两个都整合一次,有一个没有反应。

image.pngimage.png又开一个新的,然后也是只能进入一次,然后程序会reset好像是的,我再最开始按键初始化打了一个断点,我发现进入中断,再次运行,还会重复进入这个按键初始化的函数(原本打了一个端点)。这什么原因啊???

求求大佬帮俺分析分析。

您好,中断函数有没有加中断声明,若没有注意加上中断声明,参考下图。后续若有问题,可邮箱(lzs@wch.cn)沟通。

image.png


只有登录才能回复,可以选择微信账号登录