新手入门
- 积分
- 4
- 金钱
- 4
- 注册时间
- 2019-9-10
- 在线时间
- 1 小时
|
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线路挂起位
}
|
|