• 学习笔记|外部中断|INT0|中断列表|STC32G单片机视频开发教程(冲哥)|第十五集:中断系统和外部中断



    上节课我们学完了GPIO的矩阵按键,已经把这个GPIO的一个外设全都已经学完了
    今天开始我们要学习这个单片机新的一些外设

    1.中断和中断系统

    首先看到这个中断,.我们能想到什么?
    想到之前一节课我们学过一个定时器中断,定时一定的时间我们周期性的产生中断.
    不断的去刷新我们的数码管和LED。
    使用了STC-ISP软件上的定时器计算功能(需勾选使能定时器中断):
    在这里插入图片描述

    主函数在运行时,产生一个中断信号以后他会先去执行这个中断函数里的一个功能,再返回到主函数继续执行。

    1.1什么是中断?

    在这里插入图片描述

    12 中断系统
    中断系统是为使CPU具有对外界紧急事件的实时处理能力而设置的。
    当中央处理机CPU正在处理某件事的时候外界发生了紧急事件请求,要求CPU暂停当前的工作,转而去处理这个紧急事件,处理完以后,再回到原来被中断的地方,继续原来的工作,这样的过程称为中断。

    1.2什么是中断系统

    实现这种功能的部件称为中断系统,请示CPU中断的请求源称为中断源。微型机的中断系统一般允许多个中断源,当几个中断源同时向CPU请求中断,要求为它服务的时候,这就存在CPU优先响应哪一个中断源请求的问题。通常根据中断源的轻重缓急排队,优先处理最紧急事件的中断请求源,即规定每一个中断源有一个优先级别。

    1.3中断系统的优点

    优点1:CPU总是先响应优先级别最高的中断请求。
    当CPU正在处理一个中断源请求的时候(执行相应的中断服务程序),发生了另外一个优先级比它还高的中断源请求。如果CPU能够暂停对原来中断源的服务程序,
    优点2:转而去处理优先级更高的中断请求源,处理完以后,再回到原低级中断服务程序,这样的过程称为中断嵌套。
    这样的中断系统称为多级中断系统,没有中断嵌套功能的中断系统称为单级中断系统。
    用户可以用关总中断允许位(EA/IE.7)或相应中断的允许位屏蔽相应的中断请求,也可以用打开相应的中断允许位来使CPU响应相应的中断申请,
    优点3:每一个中断源可以用软件独立地控制为开中断或关中断状态,
    优点4:部分中断的优先级别均可用软件设置。
    高优先级的中断请求可以打断低优先级的中断,反之,低优先级的中断请求不可以打断高优先级的中断。当两个相同优先级的中断同时产生时,将由查询次序来决定系统先响应哪个中断。
    不是所有的中断的优先级都可以设置,只有部分可设置。

    1.4 中断系统包含哪些中断源

    在这里插入图片描述
    在这里插入图片描述

    今天主要关注INT0和INT1。
    用之前应该关注所用单片机的型号,然后再去对应一下他左边的一个功能,对照过来看一下功能有没有。去看一下哪个系列他有哪个中断。

    1.5.中断次序

    哪个优先级高哪个优先级低,这个次序(中断号)的数字越小,那么说明他的优先级越高。
    INT开头的都是外部中断:
    在这里插入图片描述

    2.什么是外部中断

    外部中断就是在单片机的一个引脚上,由于外部因素导致了一个电平的变化(比如由高变低),而通过捕获这个变化,单片机内部自主运行的程序就会被暂时打断,转而去执行相应的中断处理程序,执行完后又回到原来中断的地方继续执行原来的程序。
    总的来说就是引脚上的电平变化,然后他就会进入中断。然后中断完子以后再去执行原来的程序。
    什么引脚能作为外部中断口?‘
    在这里插入图片描述

    中断是只能在这些有标注的这个脚上才能使用。
    翻看STC32G用户手册,查看INT的详细说明。引脚带INTx标识的是外部中断。

    3.外部中断的用法

    在这里插入图片描述
    根据图示,操作顺序为:
    外部中断0:
    IT0:中断请求的不同触发条件设置,可选择上升下降沿或者下降沿。
    IE0:置位
    EX0:中断单独控制开关
    EA:中断总开关
    外部中断1:
    IT1
    IE1
    EX1
    EA
    同理再来推理一下INT2,INT3,INT4,他们这边过来只有一条线,只有一个下降沿的符号,且不可以被切换
    外部中断x:x=2-4
    INTxIF
    EXn
    EA
    寄存器的一个位都已经在这里写好了,我们后面就可以查手册,专门去找这几个位的一个定义

    4.外部中断的用法

    我们这些中断需要用到这些位
    在这里插入图片描述
    14.2 定时器0/1
    14.2.1定时器0/1控制寄存器(TCON)
    IT1:外部中断源1触发控制位。IT1=0,上升沿或下降沿均可触发外部中断1。IT1=1,外部中断1程控为
    下降沿触发方式。
    IT0:外部中断源o触发控制位。IT0=0,上升沿或下降沿均可触发外部中断0。选择这种方式,会在上升沿或者下降沿各触发一次。
    IT0=1,外部中断0程控为下降沿触发方式,下降沿才会处理(按键按下的一瞬间),和IT0差不多。

    TF1:T1溢出中断标志。T1被允许计数以后,从初值开始加1计数。当产生溢出时由硬件将TF1位置“1”,
    并向CPU请求中断,一直保持到CPU响应中断时,才由硬件清“0”(也可由查询软件清“0”)。
    TF0:T0溢出中断标志。TO被允许计数以后,从初值开始加1计数,当产生溢出时,由硬件置“1”TF0,
    向CPU请求中断,一直保持CPU响应该中断时,才由硬件清o(也可由查询软件清0)。
    IE1:外部中断1请求源(INT1/P3.3)标志。IE1=1,外部中断向CPU请求中断,当CPU响应该中断时由
    硬件清“0”IE1。
    IE0:与TF0成对出现,上电的时候最好给TF0手动清0,因为防止他上电以后直接进中断。外部中断0请求源(INT0/P3.2)标志。IE0=1外部中断0向CPU请求中断,当CPU响应外部中断时,
    由硬件清“0”IE0(边沿触发方式)。

    EX0:外部中断0中断允许位。
    0:禁止INT0中断
    1:允许INT0中断
    手册里关于INT0的中断例程如下:
    在这里插入图片描述

    IT0和IT1功能是一样的,只是控制的这个中断不一样,使用了一个下降沿。使能了一个INT0的中断
    复制上节课的程序,重命名为11.外部中断,在HARDWARE子目录下新建EXIT文件夹,存放外部中断相关代码。
    新建exit.c和exit.h,添加include路径,并在demo.c和exit.c中引用。
    在exit.h中新建函数声明:

    //------------------------函数声明-----------------------//
    void INT0_Init(void);						//外部中断0
    
    • 1
    • 2

    在exit.c中实现函数并编写服务函数模板:

    void INT0_Init(void)		//外部中断0的初始化,
    {
    	IT0 = 1; 				//1:下降沿中断,0:上升或下降沿中断
    	EX0 = 1;				//允许中断,请求源(INT0/P3.2)标志。
    	IE0 = 0;				//清除中断标志位
    }
    
    /*			//复制这个文件的时候,记得把这个中断函数复制到主程序
    			//这个是属于用户型的一个文件(用户需要在里面编写自己的功能),建议将其放在主程序main函数之后,方便更好的引用
    void INT0_Isr(void) interrupt 0		//中断号为0,请求源(INT0/P3.2)标志。
    {
    	//编写用户程序,放在这里仅做提醒
    }
    */
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14

    在demo.c中调用:INT0_Init(); //外部中断0初始化
    删除之前的功能,并在中断服务函数中增加执行代码:

    void INT0_Isr(void) interrupt 0		//中断号为0
    {
    	LED0 = !LED0;
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5

    编译测试,按动按键P32,可以实现LED亮灭。

    新的测试场景

    更进一步,构造新的业务场景,比如说在main函数中执行以下操作(main函数开头需增加定义循环变量:u8 i;):

    			for(i=0;i<8;i++)
    			{
    				LED = ~(1<
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18

    延时也好,切换数码管也罢,只要按键按下,这个数码管直接会变化。

    //数码管初始化,显示0-7
    	SEG0 = 0;		//INT0中断测试初始值显示0
    	SEG1 = 0;		//INT0中断测试初始值显示0
    
    • 1
    • 2
    • 3

    执行代码,看一下普通按键和中断按键有什么区别。
    上电正常运行时,SEG0、SEG1数码管显示0,LED灯500ms点亮一个,左移一个,到LED7点亮结束总用时4s。
    板载LED灯从第0第一颗亮到第8颗中间,怎么按P33都没有用。必须等到LED7点亮直到熄灭的瞬间,再按下P33,执行到其后面的if判断语句,SEG1数码管加1(分析下为什么这里按键没有写延时消科?),然后再回来重复执行。长按P33,执行到if语句也可以实现增加1的效果。
    P32但作为外部中断(INT0),按键一旦按下,立刻就能增加。说明外部中断可以及时响应。并且按动P32期间,LED左移亮灭正常进行,无影响。

    完整代码

    请参考:《STC单片机原理-教学视频配套附件-20230731.zip

    总结

    1.熟悉外部中断的作用和使用方式

    课后练习:

    1.课后自己尝试一下外部中断1的程序的编写
    2.可以试着编写一下外部中断2-4的程序
    3.思考下什么时候需要使用到外部中断

  • 相关阅读:
    一文掌握SSD、EMMC、UFS原理与差异
    腾讯云服务器多少钱一年?2023年腾讯云优惠云服务器推荐
    阈值与平滑处理
    带你快速概览MySQL 整体架构
    web 前端 JavaScript 内置对象
    Linux下gdb常规调试
    SpringBoot默认Json框架Jackson解析-基础篇
    程序员该如何理解javascript的单线程?
    一句话概括C#7.3+以后版本的??(俩问号)和??=(俩问号一个等于)的含义
    编译器优化代码研究
  • 原文地址:https://blog.csdn.net/Medlar_CN/article/details/132853108