OpenEdv-开源电子网

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

为什么我的EXTI4_IRQHandler这个中断进不去呢

[复制链接]

4

主题

8

帖子

0

精华

初级会员

Rank: 2

积分
91
金钱
91
注册时间
2017-3-1
在线时间
13 小时
发表于 2017-6-29 15:13:04 | 显示全部楼层 |阅读模式
1金钱
为什么我的中断程序就是进不去呢?我对照原子发的样板《外部中断实验》和视频好几遍,怎么也找不到问题。希望能帮我解决一下。
在main函数中我也设置了中断分组。

int main(void)
{       
   NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); //设置NVIC中断分组2:2位抢占优先级,2位响应优先级
   
   LedInit();
   KeyInterrupt_Init();
   
   LED0=0;
   while(1);      
}


下面是KEY0的中断设置
#include "stm32f10x.h"
#include "delay.h"
#include "led.h"
#include "KeyInterrupt.h"

void KeyInterrupt_Init(void)
{
   GPIO_InitTypeDef GPIO_InitStr;
   EXTI_InitTypeDef EXTI_InitStr;
   NVIC_InitTypeDef NVIC_InitStr;
   
   //        ① 按键PE端口初始化
   RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOE,ENABLE);//使能PORTE时钟
   GPIO_InitStr.GPIO_Mode=GPIO_Mode_IPU;                                 //上拉输入
   GPIO_InitStr.GPIO_Pin= GPIO_Pin_4;                                               //PE4(key0)
   //GPIO_InitStr.GPIO_Speed=GPIO_Speed_50MHz;
   GPIO_Init(GPIOE,&GPIO_InitStr);
   
   //② 开启IO口复用时钟,这个是中断设置必须要的
   RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);
   
   //③ 设置IO口与中断线的映射关系
   GPIO_EXTILineConfig(GPIO_PortSourceGPIOE,GPIO_PinSource4);
   
   //④ GPIOE.4          中断线以及中断初始化配置  下降沿触发        //KEY0
   EXTI_InitStr.EXTI_Line=EXTI_Line4;                              //PE4对应中断线4         
   EXTI_InitStr.EXTI_Mode=EXTI_Mode_Interrupt;       //中断模式是event or interrupt
   EXTI_InitStr.EXTI_Trigger=EXTI_Trigger_Falling;      //下降沿触发中断
   EXTI_InitStr.EXTI_LineCmd=ENABLE;                          //中断线使能
   EXTI_Init(&EXTI_InitStr);
   
   //⑤ 配置中断分组 针对中断设置抢占优先级和响应优先级
   NVIC_InitStr.NVIC_IRQChannel=EXTI4_IRQn;                     //使能按键KEY0所在的外部中断通道
   NVIC_InitStr.NVIC_IRQChannelPreemptionPriority=2;    //抢占优先级2
   NVIC_InitStr.NVIC_IRQChannelSubPriority=2;                  //子优先级2
   NVIC_InitStr.NVIC_IRQChannelCmd=ENABLE;
   NVIC_Init(&NVIC_InitStr);
}

   //⑥ 写当前中断处理程序
void EXTI4_IRQHandler(void)
{
   delay_ms(10);      //消抖
        if(KEY0==0)          //按键KEY0
        {
                LED0=!LED0;
        }       

   //⑦ 手动清除中断标志位   
        EXTI_ClearITPendingBit(EXTI_Line4);  //清除LINE4上的中断标志位  
}

最佳答案

查看完整内容[请看2#楼]

终于找到原因了,原来是delay_init()没有在主函数中定义。
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

4

主题

8

帖子

0

精华

初级会员

Rank: 2

积分
91
金钱
91
注册时间
2017-3-1
在线时间
13 小时
 楼主| 发表于 2017-6-29 15:13:05 | 显示全部楼层
终于找到原因了,原来是delay_init()没有在主函数中定义。
回复

使用道具 举报

14

主题

1592

帖子

0

精华

资深版主

Rank: 8Rank: 8

积分
2622
金钱
2622
注册时间
2014-7-17
在线时间
350 小时
发表于 2017-6-29 21:05:54 | 显示全部楼层
halsl 发表于 2017-6-29 15:13
终于找到原因了,原来是delay_init()没有在主函数中定义。

回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-8-17 12:11

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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