查看: 3135|回复: 8

[其他] 和讨论 GPIO 中断后程序停止的问题

[复制链接]
  • TA的每日心情
    开心
    2019-2-14 16:49
  • 签到天数: 296 天

    连续签到: 1 天

    [LV.8]以坛为家I

    241

    主题

    2239

    帖子

    6

    金牌会员

    Rank: 6Rank: 6

    积分
    4473
    最后登录
    2020-4-14
    发表于 2016-10-7 17:13:01 | 显示全部楼层 |阅读模式
    MCP为MK60DN512VLQ10
    SDK为2.0.0
    在进行GPIO口中断实验时遇到如下问题:
    IO口为PTE24和PTE25,设置为输入;这两个IO口各外接了按键,默认为高电平,按下后与地短路,形成按键,没有加阻容消抖[也许是问题所在],中断函数为[在GPIO.c中]:
    EXTI_Init(PTE,24,falling_up);
    EXTI_Init(PTE,25,falling_up);

    结果是按下见后确实进入中断,但程序就停止运行了。解决方法试了许多都不管用,其中有意义的是在PORTE_Interupt函数中添加了恢复PTE24,PTE25为1的函数,原中断函数:
    void PORTE_Interrupt(){
    int n;
    n=0;
    if((PORTE_ISFR & (1<<n))){
      PORTE_ISFR |= (1<<n);
    }
    n=1;
    if((PORTE_ISFR & (1<<n))){
      PORTE_ISFR |= (1<<n);
    }
    }

    更改为:
    void PORTE_Interrupt(){
    int n,i;
    n=0;
    if((PORTE_ISFR & (1<<n))){
      PORTE_ISFR |= (1<<n);
       for(i=0;i<50;i++);//相当于延时,下同
      GPIO_Ctrl(PORTE,24,1);GPIO_Ctrl(PORTE,25,1);//恢复24,25为1,下同
    }
    n=1;
    if((PORTE_ISFR & (1<<n))){
      PORTE_ISFR |= (1<<n);
      for(i=0;i<50;i++);
      GPIO_Ctrl(PORTE,24,1);GPIO_Ctrl(PORTE,25,1);
    }
    }

    结果也没有任何反应。也试过重新定义开中断也无果。
    恳请网友们赐教,应该如何解决此问题——实际上是中断响应按键处理后返回继续的问题,先谢谢了

    我知道答案 目前已有8人回答
    回复

    使用道具 举报

  • TA的每日心情
    奋斗
    2025-5-7 09:07
  • 签到天数: 353 天

    连续签到: 1 天

    [LV.8]以坛为家I

    141

    主题

    8056

    帖子

    0

    金牌会员

    Rank: 6Rank: 6

    积分
    5788
    最后登录
    2025-5-7
    发表于 2016-10-7 18:58:44 | 显示全部楼层
    中断函数里的int n,是什么意思
    该会员没有填写今日想说内容.
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2019-2-14 16:49
  • 签到天数: 296 天

    连续签到: 1 天

    [LV.8]以坛为家I

    241

    主题

    2239

    帖子

    6

    金牌会员

    Rank: 6Rank: 6

    积分
    4473
    最后登录
    2020-4-14
     楼主| 发表于 2016-10-7 21:43:11 | 显示全部楼层
    wambob 发表于 2016-10-7 18:58
    中断函数里的int n,是什么意思

    不太清楚,根据分析应该是上升沿或下降沿捕捉的判别。
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    723

    主题

    6382

    帖子

    0

    超级版主

    Rank: 8Rank: 8

    积分
    25494
    最后登录
    2025-9-9
    发表于 2016-10-8 11:20:08 | 显示全部楼层
    楼主你好!
    请问你说的:但程序就停止运行了。
    这个时候程序停止在什么地方?
    其实就算你不加去抖动,也不会影响你的程序运行。
    所以,楼主可以仿真看看,程序停止在什么地方了,然后给我截个图看看。
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2019-2-14 16:49
  • 签到天数: 296 天

    连续签到: 1 天

    [LV.8]以坛为家I

    241

    主题

    2239

    帖子

    6

    金牌会员

    Rank: 6Rank: 6

    积分
    4473
    最后登录
    2020-4-14
     楼主| 发表于 2016-10-8 12:11:49 | 显示全部楼层
    小恩GG 发表于 2016-10-8 11:20
    楼主你好!
    请问你说的:但程序就停止运行了。
    这个时候程序停止在什么地方?

    小恩GG:您好!我不会仿真,没有用过。我用的是IAR7.5[查是7.3]但程序停止时,按同志的手符号,看到多数停在延时程序上,但延时程序仅仅是自加,不应该有影响。但这个程序中有:PIT定时为0.1mS中断一次,lptmr进行IO读取外部脉冲计数,此计数值受PIT的延时控制——有个中间变量控制脉冲计数的周期为0.1秒——这两个没有发挥主程序,主程序控制扫描案件中断和显示计数值。整个程序完成2路ADC,2路PWM,两路按键,以及控制显示结果到LCD上。
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    723

    主题

    6382

    帖子

    0

    超级版主

    Rank: 8Rank: 8

    积分
    25494
    最后登录
    2025-9-9
    发表于 2016-10-8 12:47:15 | 显示全部楼层
    zhjb1 发表于 2016-10-8 12:11
    小恩GG:您好!我不会仿真,没有用过。我用的是IAR7.5[查是7.3]但程序停止时,按同志的手符号,看到多数 ...

    楼主你好!
    感谢你的详细描述。
    在你的代码中,你是这样写的:
    void PORTE_Interrupt(){
    int n,i;
    n=0;
    if((PORTE_ISFR & (1<<n))){
       PORTE_ISFR |= (1<<n);
        for(i=0;i<50;i++);//相当于延时,下同
      GPIO_Ctrl(PORTE,24,1);GPIO_Ctrl(PORTE,25,1);//恢复24,25为1,下同
    }
    n=1;
    if((PORTE_ISFR & (1<<n))){
       PORTE_ISFR |= (1<<n);
       for(i=0;i<50;i++);
       GPIO_Ctrl(PORTE,24,1);GPIO_Ctrl(PORTE,25,1);
    }
    }
    并且,你交代是PTE24,PTE25中断,那么你为什么要清除PORTE0,PORTE1的标志呢?
    请把清除标志改为:
    void PORTE_Interrupt(){
    int n;

    if((PORTE_ISFR & (1<<24))){
       PORTE_PCR24|= PORT_PCR_ISF_MASK;
    }
    if((PORTE_ISFR & (1<<25))){
       PORTE_PCR25|= PORT_PCR_ISF_MASK;
    }
    }
    你目前最大的问题是没有清除掉中断标志位,导致程序一直进入PORTE的中断。
    现在请按照我给你的代码,清除PTE24,PTE25的中断标志位。
    如果还有问题,欢迎继续交流。
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2019-2-14 16:49
  • 签到天数: 296 天

    连续签到: 1 天

    [LV.8]以坛为家I

    241

    主题

    2239

    帖子

    6

    金牌会员

    Rank: 6Rank: 6

    积分
    4473
    最后登录
    2020-4-14
     楼主| 发表于 2016-10-8 17:00:27 | 显示全部楼层
    本帖最后由 zhjb1 于 2016-10-8 17:04 编辑
    小恩GG 发表于 2016-10-8 12:47
    楼主你好!
    感谢你的详细描述。
    在你的代码中,你是这样写的:

    非常感谢,我一直没有理解程序中n的含义,我歪解成0是正沿,1是下沿了,所以没有考虑n,谢谢!就是这个问题,我将n分别设置为24,25则中断也有响应,程序也可以继续,再次感谢小恩GG!真是好版主!排忧解难!
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    723

    主题

    6382

    帖子

    0

    超级版主

    Rank: 8Rank: 8

    积分
    25494
    最后登录
    2025-9-9
    发表于 2016-10-8 17:32:44 | 显示全部楼层
    zhjb1 发表于 2016-10-8 17:00
    非常感谢,我一直没有理解程序中n的含义,我歪解成0是正沿,1是下沿了,所以没有考虑n,谢谢!就是这个问 ...

    不客气,后续有问题,欢迎继续交流!
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2016-12-11 06:45
  • 签到天数: 37 天

    连续签到: 1 天

    [LV.5]常住居民I

    0

    主题

    167

    帖子

    0

    中级会员

    Rank: 3Rank: 3

    积分
    342
    最后登录
    2023-7-19
    发表于 2016-10-20 16:47:42 | 显示全部楼层
    欢迎继续交流!
    回复 支持 反对

    使用道具 举报

    您需要登录后才可以回帖 注册/登录

    本版积分规则

    关闭

    站长推荐上一条 /3 下一条

    Archiver|手机版|小黑屋|恩智浦技术社区

    GMT+8, 2025-9-11 06:39 , Processed in 0.109588 second(s), 29 queries , MemCache On.

    Powered by Discuz! X3.4

    Copyright © 2001-2024, Tencent Cloud.

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