OpenEdv-开源电子网

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

STM32F103 中断挂起的实验结果和原理分析不一致

[复制链接]

1

主题

1

帖子

0

精华

新手入门

积分
4
金钱
4
注册时间
2019-9-10
在线时间
1 小时
发表于 2019-9-10 21:44:39 | 显示全部楼层 |阅读模式
3金钱
看了很多对 STM32 中断优先级概念诠释的帖子,然后自己做了一个简单地实验测试,结果却并不符合预期
1、测试环境:STM32F103RC mini 开发板
2、测试例程:标准例程-V3.5库函数版本\ALIENTEK MINISTM32 实验4 外部中断实验
3、修改部分:\HARDWARE\EXTI\exti.c ,在每个中断 ISR 中 delay 2s 的时间
4、实验方案:快速(2s 内)分别按下 3 个按键,等待 LED0 反应和串口打印输出
5、运行结果预期:按照中断优先级和挂起的原理预测
        a) 在按下 KEY0 后进入  EXTI0_IRQHandler(), LED0 发光 2s 后   EXTI0_IRQHandler() 执行结束
        b) 在 EXTI0_IRQHandler() 运行的这 2s 中按下 KEY1 和 KEY_WKUP ,由于上一个中断没有执行完毕,EXTI9_5_IRQHandler() 和 EXTI15_10_IRQHandler() 被挂起
        c) EXTI9_5_IRQHandler() 和 EXTI15_10_IRQHandler()  分别继续执行,LED0 熄灭 2s 后重新发光
6、运行结果: EXTI0_IRQHandler() 执行结束后并没进入 EXTI9_5_IRQHandler() 和 EXTI15_10_IRQHandler()  执行。说明挂起的中断并不会在上一个中断执行完毕后接着执行,中断会丢失

希望同样遇到过这个问题的大神们解惑!!!

【修改部分代码如下】
void EXTI0_IRQHandler(void)
{
  delay_ms(10);    //消抖
        if(WK_UP==1)
        {          
                printf("ENTER EXTI0_IRQHandler\n");       
                LED0=!LED0;
                delay_ms(1000);
                delay_ms(1000);
                printf("EXIT EXTI0_IRQHandler\n");       
                //LED1=!LED1;       
        }
        EXTI_ClearITPendingBit(EXTI_Line0);  //清除EXTI0线路挂起位
}
void EXTI9_5_IRQHandler(void)
{                       
        delay_ms(10);   //消抖                         
        if(KEY0==0)        {
                printf("ENTER EXTI9_5_IRQHandler\n");       
                LED0=!LED0;
                delay_ms(1000);
                delay_ms(1000);
                printf("EXIT EXTI9_5_IRQHandler\n");       
        }
         EXTI_ClearITPendingBit(EXTI_Line5);    //清除LINE5上的中断标志位  
}


void EXTI15_10_IRQHandler(void)
{
  delay_ms(10);    //消抖                         
  if(KEY1==0)        {
                printf("ENTER EXTI15_10_IRQHandler\n");       
                LED0=!LED0;
                delay_ms(1000);
                delay_ms(1000);
                printf("EXIT EXTI15_10_IRQHandler\n");       
                //LED1=!LED1;
        }
         EXTI_ClearITPendingBit(EXTI_Line15);  //清除LINE15线路挂起位
}


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

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165536
金钱
165536
注册时间
2010-12-1
在线时间
2117 小时
发表于 2019-9-13 02:19:44 | 显示全部楼层
回复

使用道具 举报

0

主题

4

帖子

0

精华

新手入门

积分
5
金钱
5
注册时间
2019-9-21
在线时间
0 小时
发表于 2019-9-21 16:08:51 | 显示全部楼层
新手学习
回复

使用道具 举报

8

主题

185

帖子

0

精华

新手上路

积分
47
金钱
47
注册时间
2019-7-15
在线时间
47 小时
发表于 2019-9-22 15:28:54 | 显示全部楼层
我是这样理解的:
1)第一点看看初始配置是否正确:EXTI9_5_IRQHandler() 和 EXTI15_10_IRQHandler()  这两进不去中断到底是不是配置出问题了;
2)第二点:到底有没有触发这两个中断,用示波器看一下这两个IO电平变化;
3)如果单独测试1)2)两点没问题,再说你这个事情;
循序渐进,逐步推导,这样的思路在工作中逐渐建立起来
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-8 23:03

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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