OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 379|回复: 1

stm32新手求助,外部中断问题。

[复制链接]

2

主题

3

帖子

0

精华

新手入门

积分
8
金钱
8
注册时间
2026-3-17
在线时间
2 小时
发表于 2026-3-20 19:32:25 | 显示全部楼层 |阅读模式
5金钱
我想学习外部中断函数,本来是在主程序里写了一个PA0白色led闪烁。中断触发后PB13蓝色led亮,PA0白色led保持触发时的状态。中断结束后PB13蓝色led灭,PA0白色led继续闪烁。可是发现中断结束后PB13蓝色led灭,PA0白色led仍然保持触发时的状态。debug时发现程序在中断结束后会卡死在Delay()里。我把Delay()注释掉,发现没问题,这是怎么回事?恳请各位大佬出手相救。(PB14控制中断)
#include "stm32f10x.h"
#include "Delay.h"
int main()
{
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);
        GPIO_InitTypeDef gpioa;
        gpioa.GPIO_Mode=GPIO_Mode_Out_PP;
        gpioa.GPIO_Pin=GPIO_Pin_0;
        gpioa.GPIO_Speed=GPIO_Speed_50MHz;
        GPIO_InitTypeDef gpiob;
        gpiob.GPIO_Mode=GPIO_Mode_Out_PP;
        gpiob.GPIO_Pin=GPIO_Pin_13;
        gpiob.GPIO_Speed=GPIO_Speed_50MHz;
        GPIO_Init(GPIOA,&gpioa);
        GPIO_Init(GPIOB,&gpiob);
        GPIO_EXTILineConfig(GPIO_PortSourceGPIOB,GPIO_PinSource14);
        EXTI_InitTypeDef exit;
        exit.EXTI_Line=EXTI_Line14;
        exit.EXTI_LineCmd=ENABLE;
        exit.EXTI_Mode=EXTI_Mode_Interrupt;
        exit.EXTI_Trigger=EXTI_Trigger_Falling;
        EXTI_Init(&exit);
        NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
        NVIC_InitTypeDef nvic;
        nvic.NVIC_IRQChannel=EXTI15_10_IRQn;
        nvic.NVIC_IRQChannelCmd=ENABLE;
        nvic.NVIC_IRQChannelPreemptionPriority=1;
        nvic.NVIC_IRQChannelSubPriority=1;
        NVIC_Init(&nvic);
        GPIO_SetBits(GPIOB,GPIO_Pin_13);
        while(1){
                //GPIO_SetBits(GPIOA,GPIO_Pin_0);
                //Delay_s(2);
                GPIO_ResetBits(GPIOA,GPIO_Pin_0);
                //Delay_s(2);
        }
}
void EXTI15_10_IRQHandler(void)
{
        if(EXTI_GetITStatus(EXTI_Line14)==SET){
                GPIO_SetBits(GPIOA,GPIO_Pin_0);
                GPIO_ResetBits(GPIOB,GPIO_Pin_13);
                Delay_s(10);
                GPIO_SetBits(GPIOB,GPIO_Pin_13);
                EXTI_ClearITPendingBit(EXTI_Line14);
        }
}
//不用Delay
------------------------------------------------------------------------------------
#include "stm32f10x.h"
#include "Delay.h"
int main()
{
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);
        GPIO_InitTypeDef gpioa;
        gpioa.GPIO_Mode=GPIO_Mode_Out_PP;
        gpioa.GPIO_Pin=GPIO_Pin_0;
        gpioa.GPIO_Speed=GPIO_Speed_50MHz;
        GPIO_InitTypeDef gpiob;
        gpiob.GPIO_Mode=GPIO_Mode_Out_PP;
        gpiob.GPIO_Pin=GPIO_Pin_13;
        gpiob.GPIO_Speed=GPIO_Speed_50MHz;
        GPIO_Init(GPIOA,&gpioa);
        GPIO_Init(GPIOB,&gpiob);
        GPIO_EXTILineConfig(GPIO_PortSourceGPIOB,GPIO_PinSource14);
        EXTI_InitTypeDef exit;
        exit.EXTI_Line=EXTI_Line14;
        exit.EXTI_LineCmd=ENABLE;
        exit.EXTI_Mode=EXTI_Mode_Interrupt;
        exit.EXTI_Trigger=EXTI_Trigger_Falling;
        EXTI_Init(&exit);
        NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
        NVIC_InitTypeDef nvic;
        nvic.NVIC_IRQChannel=EXTI15_10_IRQn;
        nvic.NVIC_IRQChannelCmd=ENABLE;
        nvic.NVIC_IRQChannelPreemptionPriority=1;
        nvic.NVIC_IRQChannelSubPriority=1;
        NVIC_Init(&nvic);
        GPIO_SetBits(GPIOB,GPIO_Pin_13);
        while(1){
                GPIO_SetBits(GPIOA,GPIO_Pin_0);
                Delay_s(2);
                GPIO_ResetBits(GPIOA,GPIO_Pin_0);
                Delay_s(2);
        }
}
void EXTI15_10_IRQHandler(void)
{
        if(EXTI_GetITStatus(EXTI_Line14)==SET){
                //GPIO_SetBits(GPIOA,GPIO_Pin_0);
                GPIO_ResetBits(GPIOB,GPIO_Pin_13);
                Delay_s(10);
                GPIO_SetBits(GPIOB,GPIO_Pin_13);
                EXTI_ClearITPendingBit(EXTI_Line14);
        }
}
//用Delay
-------------------------------------------------------------
https://www.bilibili.com/video/BV1yfAJzsE5x/?vd_source=14a517e9b18e30a20f3e5ca9272514c3
https://www.bilibili.com/video/BV1yfAJzsEtN/?vd_source=14a517e9b18e30a20f3e5ca9272514c3
https://www.bilibili.com/video/BV1PfAJzxEBD/?vd_source=14a517e9b18e30a20f3e5ca9272514c3


回复

使用道具 举报

13

主题

3499

帖子

1

精华

论坛元老

Rank: 8Rank: 8

积分
9114
金钱
9114
注册时间
2020-5-11
在线时间
4807 小时
发表于 2026-3-24 10:38:02 | 显示全部楼层
本帖最后由 LcwSwust 于 2026-3-24 10:39 编辑

得看一下Delay_s函数的源代码,主循环与中断调用同一个函数,可能双方都会等待某个标志,如果其中一方将此标志清除,那另一方就得不到这个标志、就陷入死循环。
专治疑难杂症
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /1 下一条

正点原子公众号

如发现本坛存在违规或侵权内容, 请点击这里发送邮件举报 (或致电020-38271790)。请提供侵权说明和联系方式。我们将及时审核依法处理,感谢配合。

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2026-4-2 07:04

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表