OpenEdv-开源电子网

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

STM32F407外部中断无法触发

[复制链接]

2

主题

11

帖子

0

精华

新手上路

积分
40
金钱
40
注册时间
2020-7-20
在线时间
14 小时
发表于 2023-6-6 19:33:08 | 显示全部楼层 |阅读模式
5金钱
本帖最后由 丹丹 于 2023-6-6 19:34 编辑

各位大神帮忙看一下这个程序哪里有问题,为什么无法触发外部中断。


void my_exti_init(void)
{
                //使能外部中断,外部中断 EXTI 在APB2总线上
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_SYSCFG, ENABLE);
        
        //配置EXTI,告诉外部中断,哪些端口要开启中断
        
        SYSCFG_EXTILineConfig(EXTI_PortSourceGPIOB, EXTI_PinSource9);
        SYSCFG_EXTILineConfig(EXTI_PortSourceGPIOB, EXTI_PinSource8);
        SYSCFG_EXTILineConfig(EXTI_PortSourceGPIOF, EXTI_PinSource7);
        SYSCFG_EXTILineConfig(EXTI_PortSourceGPIOE, EXTI_PinSource6);
        
        //配置 F9 F8 F7 E6,这四个按键所在的GPIO口的中断,这样按下按键就会触发中断
        
        //配置NVIC 中断相关的参数
        
        //1)配置NVIC的分组方式
        NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
        
        //2)调用NVIC的初始化函数        
        NVIC_InitTypeDef Nvic_Value;
        Nvic_Value.NVIC_IRQChannel = EXTI9_5_IRQn;//选择中断号
        Nvic_Value.NVIC_IRQChannelCmd = ENABLE;//使能该中断
        Nvic_Value.NVIC_IRQChannelPreemptionPriority = 2;//配置组优先级的级别
        Nvic_Value.NVIC_IRQChannelSubPriority = 2;//配置子优先级的级别
        NVIC_Init(&Nvic_Value);//按照上述配置初始化NVIC控制器
        
        
        //配置EXTI相关的初始化参数
        EXTI_InitTypeDef Exti_Value;
        Exti_Value.EXTI_Line = EXTI_Line9 | EXTI_Line8 | EXTI_Line7 | EXTI_Line6;//选择外部中断号
        Exti_Value.EXTI_LineCmd = ENABLE;//使能外部中断
        Exti_Value.EXTI_Mode = EXTI_Mode_Interrupt;//选择中断模式
        Exti_Value.EXTI_Trigger = EXTI_Trigger_Falling;//选择下降沿触发
        EXTI_Init(&Exti_Value);        
}

uint8_t flag = 0;

void EXTI9_5_IRQHandler(void)
{
        //判断具体是哪个端口触发了中断,读取每个中断标志位;处理完之后要手动清除中断标志位
        
        if(EXTI_GetITStatus(EXTI_Line9) == SET)//判断是否是由EXTI9触发的中断
        {
                //handler0();//调用处理函数
                EXTI_ClearITPendingBit(EXTI_Line9);//清除EXTI9的中断标志位
                //printf("-----------------------------\r\n");
                flag = 9;
        }
        if(EXTI_GetITStatus(EXTI_Line8) == SET)
        {
                //handler1();
                EXTI_ClearITPendingBit(EXTI_Line8);
                //printf("-----------------------------\r\n");
                flag = 8;
        }
        if(EXTI_GetITStatus(EXTI_Line7) == SET)
        {
                //handler2();
                EXTI_ClearITPendingBit(EXTI_Line7);
                flag = 7;
        }
        if(EXTI_GetITStatus(EXTI_Line6) == SET)
        {
                //handler3();
                EXTI_ClearITPendingBit(EXTI_Line6);
                flag = 6;
        }
               
}


正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

12

主题

3344

帖子

1

精华

论坛元老

Rank: 8Rank: 8

积分
8462
金钱
8462
注册时间
2020-5-11
在线时间
3904 小时
发表于 2023-6-7 10:25:42 | 显示全部楼层
没看出来"无法触发外部中断"有什么表现,这段代码没看出问题,也许问题不在这段代码里,可能在别的代码里,比如main,或者引脚的模式,或者硬件电路有问题.
专治疑难杂症
回复

使用道具 举报

2

主题

11

帖子

0

精华

新手上路

积分
40
金钱
40
注册时间
2020-7-20
在线时间
14 小时
 楼主| 发表于 2023-6-7 11:29:49 | 显示全部楼层
本帖最后由 丹丹 于 2023-6-7 11:31 编辑
LcwSwust 发表于 2023-6-7 10:25
没看出来"无法触发外部中断"有什么表现,这段代码没看出问题,也许问题不在这段代码里,可能在别的代码里,比如 ...
程序如下,不管怎么配都无法进入外部中断,配置的引脚我这边也尝试调整到别的IO口测试了(硬件为开发板)
int main(void)
{
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//设置系统中断优先级分组2
        delay_init(168);      //初始化延时函数
        uart_init(115200);                //初始化串口波特率为115200        

        ADC_Config();
        DianGang_Init();
        USART3_Init(115200);
        printf("Usart Init OK \r\n");
        while(MPU9250_Init())//初始化MPU9250
        {
                delay_ms(200);
                printf("MPU9250 Init ERROR \r\n");
        }   
        delay_ms(200);
        while(mpu_dmp_init())//初始化MPU9250 DMP
        {
                printf("MPU9250 DMP Init ERROR \r\n");
                delay_ms(200);
        }
           printf("MPU9250 DMP Init finish \r\n");
        
//        Exti_init();
        my_exti_init();
  while(1){
//                DianGang_1_UP();
//                delay_ms(1000);
//                DianGang_1_DOWN();
//      distance = get_distance_mm(ADC1_TEST_CHANNEL);

         
          if(flag!=0){
              flag = 0;
              printf("-----------------------------------------------------\r\n");
         
          }
}
}
回复

使用道具 举报

12

主题

3344

帖子

1

精华

论坛元老

Rank: 8Rank: 8

积分
8462
金钱
8462
注册时间
2020-5-11
在线时间
3904 小时
发表于 2023-6-7 11:56:59 | 显示全部楼层
本帖最后由 LcwSwust 于 2023-6-7 12:02 编辑
丹丹 发表于 2023-6-7 11:29
程序如下,不管怎么配都无法进入外部中断,配置的引脚我这边也尝试调整到别的IO口测试了(硬件为开发板)
...

串口助手显示 MPU9250 DMP Init finish 吗?
有没有LED?有的话在外中断里让LED取反看看.
GPIO的配置在哪里?

专治疑难杂症
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-2-24 10:55

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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