930电子网

 找回密码
 立即注册
艾克姆科技推出最新产品STC32G12K128开发板
查看: 10156|回复: 0

STC15W4K32S4系列中断之中断优先级案例分析

[复制链接]

101

主题

333

帖子

7428

积分

版主

Rank: 7Rank: 7Rank: 7

积分
7428
发表于 2019-6-20 09:29:06 | 显示全部楼层 |阅读模式
本帖最后由 正是河豚 于 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
回复

使用道具 举报

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

本版积分规则

QQ|手机版|官方淘宝店|930电子网 ( 皖ICP备16000695号-2 )

Copyright © 合肥艾克姆电子科技有限公司
快速回复 返回顶部 返回列表