|
本帖最后由 正是河豚 于 2019-6-20 09:31 编辑
1、STC15W4K32S4系列单片机中断嵌套: 中断优先级高的中断请求可以中断CPU正在处理的优先级低的中断服务程序,待完成了中断优先级高的中断服务程序后,再继续被打断的低优先级的中断服务程序。
2、下图描述了主程序和中断服务程序的示意图,也诠释了中断嵌套的含义。
3、下面以艾克姆科技进取者STC15开发板在多个外部中断同时被触发的案例,来验证下中断优先级原理。下面是实验连接图。
4、本实验会配置外部中断0和外部中断1的中断优先级。
1)外部中断0的初始化函数如下:
- /***********************************************************
- 功能描述:外部中断0初始化
- 入口参数:无
- 返回值:无
- ************************************************************/
- void INT0_Init(void)
- {
- IE0 = 0; //将INT0中断请求标志位清"0"
- EX0 = 1; //使能INT0中断允许位
- IT0 = 1; //选择INT0为下降沿触发方式
- PX0 = 0; //将INT0优先级设置为低优先级
- }
2)外部中断1的初始化函数如下:
- /***********************************************************
- 功能描述:外部中断1初始化
- 入口参数:无
- 返回值:无
- ************************************************************/
- void INT1_Init(void)
- {
- IE1 = 0; //将INT1中断请求标志位清"0"
- EX1 = 1; //使能INT1中断允许位
- IT1 = 1; //选择INT1为下降沿触发方式
- PX1 = 1; //将INT1优先级设置为高优先级
- }
3)外部中断0的中断服务函数如下:
- /***********************************************************
- 功能描述:外部中断服务程序
- 入口参数:无
- 返回值:无
- ************************************************************/
- void INT0_Isr (void) interrupt INT0_VECTOR
- {
- uint8 i;
- for(i=0;i<5;i++)
- {
- led_toggle(LED_1); //翻转蓝色指示灯DS1
- delay_ms(200);
- }
- }
4)外部中断1的中断服务函数如下:
- /***********************************************************
- 功能描述:外部中断服务程序
- 入口参数:无
- 返回值:无
- ************************************************************/
- void INT1_Isr (void) interrupt INT1_VECTOR
- {
- led_on(LED_2); //点亮红色指示灯DS2
- delay_ms(200);
- led_off(LED_2); //熄灭红色指示灯DS2
- delay_ms(200);
- led_on(LED_2); //点亮红色指示灯DS2
- delay_ms(200);
- led_off(LED_2); //熄灭红色指示灯DS2
- delay_ms(200);
- led_on(LED_2); //点亮红色指示灯DS2
- delay_ms(200);
- led_off(LED_2); //熄灭红色指示灯DS2
- delay_ms(200);
- led_on(LED_2); //点亮红色指示灯DS2
- delay_ms(200);
- led_off(LED_2); //熄灭红色指示灯DS2
- delay_ms(200);
- }
5)本实验main函数主循环没有任务,代码如下:
- int main(void)
- {
- ///////////////////////////////////////////////////////////
- //注意: STC15W4K32S4系列的芯片,上电后所有与PWM相关的IO口均为
- // 高阻态,需将这些口设置为准双向口或强推挽模式方可正常使用
- //相关IO: P0.6/P0.7/P1.6/P1.7/P2.1/P2.2
- // P2.3/P2.7/P3.7/P4.2/P4.4/P4.5
- ///////////////////////////////////////////////////////////
- P0M1 &= 0x3F; P0M0 &= 0x3F; //设置P0.6、P0.7为准双向口
-
- INT0_Init(); //外部中断0的初始化配置
- INT1_Init(); //外部中断1的初始化配置
- EA = 1; //允许总中断
-
- while (1)
- {
- ; //无任务,说明LED亮灭来自于中断
- }
- }
6)特别特别强调一点:本实验中断服务函数里面中断任务写的太多,尤其执行了很多延时函数。这样设计主要是考虑初学者能够比较直观的学习中断嵌套的知识点。实际中断服务函数以简洁高效为准则。可以参考这一帖:STC15W4K32S4系列中断之中断优先级。
5、有条件的小伙伴可以做下这个实验,实验操作步骤及现象是:
1)按下用户按键S3,可观察蓝色指示灯DS1闪烁5次;
2)按下触摸按键S4,可观察红色指示灯DS2闪烁4次;
3)按下用户按键S3,在蓝色指示灯DS1闪烁1次时按下触摸按键S4,可观察蓝色指示灯DS1停止闪烁,待红色指示灯DS2闪烁4次后蓝色指示灯DS1接着闪烁4次。
4)按下触摸按键S4,在红色指示灯DS2闪烁1次时按下用户按键S3,可观察待红色指示灯DS2接着闪烁3次后蓝色指示灯DS1才开始闪烁5次。
注:上面的第3步操作说明高优先级的外部中断1打断了正在执行的低优先级外部中断0。
|
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有账号?立即注册
x
|