精华内容
下载资源
问答
  • 以下我总结了几个外设关于中断标志位的清除问题。 定时器: 1、在程序使用到中断的情况下,定时器在使能之前需要先清除中断标志位,否则会出现定时器一开就进入中断的现象。 2、常规情况下,在进入中断服务函数...

    在使用中断函数的时候,我们往往忘记在中断服务函数内清除中断标志位而导致一些未知错误。
    以下我总结了几个外设关于中断标志位的清除问题。
    定时器:
    1、在程序有使用到中断的情况下,定时器在使能之前需要先清除更新中断标志位,否则会出现定时器一使能就进入中断的现象。
    2、常规情况下,在进入中断服务函数以后,需要软件清除标志位。
    3、如果使用HAL库的话,并且有使用到回调函数的话,不需要用户自己清除中断标志位,因为中断服务函数调用的HAL_TIM_IRQHandler这个函数里面已经包含了清除中断标志位,以及回调函数。
    调用过程:ADVANCE_TIM_IRQHandler ()—>HAL_TIM_IRQHandler()
    —>void HAL_TIM_PeriodElapsedCallback()     


    串口:
    1、串口中断标志位,既可以通过软件清除标志位,也可以通过读写DR寄存器硬件清除寄存器。

    展开全文
  • 对8086CPU的标志寄存器中的OF、DF、IF、TF、SF、ZF、AF、PF、CF标志位进行了相关的介绍!

    一、基本介绍:

    CPU的内部的寄存器中,有一类特殊的寄存器(对于不同的处理机,其个数和结构都可能不同);它具有以下三种作用!

     这种特殊的寄存器在8086CPU中,被称为标志寄存器flag。8086CPU的标志寄存器有16位,其中存储的信息通常又被称为程序状态字PSW)。

    flag和其他寄存器不一样,其他寄存器是用来存储数据的,都是一个寄存器作为一个整体具有一个含义的。但是flag寄存器是每一位都有专门的含义的,记录着特定的信息!

    flag寄存器各位示意图

    flag寄存器在上图中显示空白的位,在8086CPU中没有被使用,因此不具有任何的含义;其他被标识的位都具有特殊的含义。

    二、各个标志位介绍:

    OF标志:溢出标志位(有符号数)

    flag的第11位是OF,溢出标记位;一般情况下,OF记录了有符号数运算的结果是否发生了溢出;如果发生了溢出,则OF=1;如果没有,则OF=0。

    CF和OF之间的区别:CF是针对于无符号数运算,OF位是针对于有符号数运算。

    代码举例:

    mov al,0F0H
    
    add al,88H

    指令执行之后,CF=1,OF=1。如果把该运算看作无符号数运算,则0F0H+88H产生了进位,故CF=1;如果把该运算看作有符号数运算,则0F0H+88H发生溢出,OF=1。

    mov al,0F0H
    
    add al,78H

    指令执行之后,CF=1,OF=0。如果把该运算看作无符号数运算,则0F0H+78H产生了进位,故CF=1;如果把该运算看作有符号数运算,则0F0H+78H不发生溢出,OF=0。

    因此,CF和OF所表示的进位和溢出,是分别对于无符号数和有符号数运算而言的彼此之间没有任何的关系。


    DF标志:方向标志位

    flag的第10位是DF,方向标志位;仅仅用于串处理指令中,控制着地址的变化方向

    DF=0;每次操作之后地址递增;即从低地址向高地址处理数据串。

    DF=1,每次操作之后地址递减,即从高地址向低地址处理数据串。

    由于flag寄存器中的DF位决定着串传送指令执行之后,SI、DI的改变方向;因此8086CPU也提供了相应的指令来对于DF位进行设置:

    CLD指令:将标志寄存器的DF位,置为0

    STD指令:将标志寄存器的DF位,置为1


    IF标志:中断允许标志位

    flag的第9位是IF,IF置为0,禁止其他的可屏蔽中断;如果允许处理可屏蔽中断,则将IF置为1。

    ——相关操作指令:

    STI指令:将IF设置为1,允许可屏蔽中断。

    CLI指令:将IF设置为0,禁止可屏蔽中断。


    TF标志:跟踪标志位

    flag的第8位是TF,跟踪标志位用于标识CPU是否允许单步中断,以进行程序调试。TF=0时,8086CPU处于正常状态;TF=1时,8086CPU处于单步状态,每执行一条指令就自动产生一次单步中断。

      8086的debug功能依赖于8086CPU的单步调试功能。


    SF位:符号标志位(有符号数)

    flag的第7位是SF,符号标志位。它记录着相关指令执行后其结果是否为负;如果结果为负,则SF=1;如果结果非负,则SF=0。

    在计算机里面,通常使用补码来表示有符号数据。计算机的一个数据既可以看作有符号数,亦可以看作无符号数。譬如:

    0000 0001B,可以看作为无符号数1,也可看做有符号数+1。

    1000 0001B,可以看作为无符号数129,也可以看作有符号数-127。

    这就说明计算机在计算相关的数据时,即可以看作有符号数的运算,亦可以看作无符号数的运算,关键在于使用者需要哪一个!例如:

    mov al,1000 0001B
    
    add al,1

    计算的结果就是:al=1000 0010B

    对于该运算,如果你把它看作无符号数的运算,那么就是129+1=130(1000 0010B);也可以将其看作有符号数的运算,那么就是-127+1=-126(1000 0010B)。

    SF标志,就是8086CPU对于有符号运算结果的一种记录,它记录了运算结果的正负无论你把运算看作有符号运算还是无符号运算,SF的值都会改变,不同的是,当你看作有符号运算时,它是有意义的;当你看作无符号运算时它是无意义的!

    mov al,1000 0001B
    
    add al,1

    运算结果为1000 0010B,SF=1;如果你把这个运算看作有符号数运算,那么结果为负。

    mov al,1000 0001B
    
    add al,0111 1111B

    运算结果是0,SF=1;如果你把这个运算看作有符号数运算,那么结果为正。


    ZF位:零标志位

    flag寄存器的第6位是ZF,零标志位;它记录着相关指令执行之后,其结果是否为零;如果结果为零,那么ZF=1,如果结果不为零,那么ZF=0。

    例如:

    mov ax,1
    
    sub ax,1

    执行之后,结果为零,则ZF=1。

    mov ax,2
    
    sub ax,1

    执行之后,结果为1,则ZF=0。


    AF位:调整标志位

    flag的第4位是AF,调整标志位;反映加减运算时最低半字节有无进位或者借位。最低半字节有进位或借位时,AF=1,否则AF=0。

    这个标志位主要由处理器内部使用,用于十进制算术运算的调整指令,用户一般不必关心。

    例如:8位二进制数运算0011 1010+0111 1100 = 1011 0110,低四位有进位,所以此时的AF=1。


    PF位:奇偶标志位

    flag寄存器的第2位是PF,奇偶标志位;它记录着相关指令执行之后,其结果的所有bit位中1的个数是否为偶数;如果1的个数为偶数,则PF=1,如果1的个数为奇数,则PF=0。

    例如:

    mov al,1
    
    add al,10

    执行之后,结果是0000 1011B;其中有3个1;因此PF=0。

    mov al,2
    
    or al,2

    执行之后,结果是0000 0010B;其中有1个1;因此PF=0。

    sub al,al

    执行之后,结果为0000 0000B;其中有0(偶数)个1;因此PF=1。


    CF标志:进位标志位(无符号数)

    flag的第0位是CF,进位标志位。一般情况下,在进行无符号数运算时,它记录了运算结果的最高有效位向更高位的进位值,或者从最高位的借位值

    以8位为例:

    ——进位举例:

    mov al,98H

    add al,al;执行之后,al的值变为30H,CF=1;此时CF记录了最高有效位向更高位的进位值。

    add al,al;执行之后,al的值变为60H,CF=0;此时CF记录了最高有效位向更高位的进位值。

    ——借位举例:

    mov al,97H

    sub al,98H;执行之后,al的值变为FFH,CF=1;此时CF记录了向更高位的借位值。

    sub al,al;执行之后,al的值变为0,CF=0;此时CF记录了向更高位的借位值。

    ——相关操作指令:

    CLC指令:将CF置为0。

    STC指令:将CF置为1。

    CMC指令:原来是0变为1,原来是1变为0。

    Ending... ...

    展开全文
  • 4.2 51单片机-中断

    2021-10-28 16:49:20
    4.2 中断 4.2.1 中断介绍 中断系统是为使CPU具有对...微型机的中断系统一般允许多个中断源,当几个中断源同时向CPU请求中断,要求为它服务的时候,这就存在CPU优先响应哪一个中断源请求的问题。通常根据中断源的轻

    4.2 中断

    4.2.1 中断介绍

    中断系统是为使CPU具有对外界紧急事件的实时处理能力而设置的

    当中央处理机CPU正在处理某件事的时候外界发生了紧急事件请求,要求CPU暂停当前的工作,转而去处理这个紧急事件,处理完完后,再回到原来被中断的地方,继续原来的工作,这样的过程称为中断,实现这种功的部件称为中断系统,请示CPU中断的请求源称为中断源。

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

    当CPU正在处理一个中断源请求的时候(执行相应的中断服务程序),发生了另外一个优先级比它还高的中断源请求;如果CPU能够暂停对原来中断源的服务程序,转而去处理优先级更高的中断请求源,处理完以后再回到原来低级中断服务程序,这样的过程称为中断嵌套。这样的中断系统称为多级中断系统,没有中断嵌套功能的中断系统称为单级中断系统。

    4.2.2 STC90C51RD系统中断源介绍

    STC90C51RC/RD+系列单片机提供了8个中断请源,它们分别是:外部中断0(INT0)、定时器0中断、外部中断1(INT1)、定时器1中断、定时器2中断、串口(UART)中断、外部中断2(INT2)、外部中断3(INT3)

    所有的中断都具有4个中断优先级,用户可以用关总中断允许位(EA/IE.7)或相应中断的允许位,屏蔽所有的中断请求,也可以打开相应的中断允许位使CPU响应相应的中断申请;每一个中断源可以用软件独立地控制开中断或关中断状态;每一个中断的优先级别均可用软件设置。高优先级的中断请求可以打断低优先级的中断,反之,低优先级的中断请求不可以打断高优先级及同优先级的中断。当两个相同优先级的中断同时产生时,将由查询次序来决定系统先响应哪个中断。

    4.2.3 中断的优先级与中断结构图

    图4-2-1 中断优先级表

    通过设置新增加的特殊功能寄存器IPH中的相应位,可将中断优先级设为四级,如果设置IP或XICON,那么中断优先级就只有两级,与传统8051单片机两级中断优先级完全兼容。

    图4-2-2 中断结构图 

     

    图4-2-3 中断相关寄存器

    4.2.4 中断服务函数

    中断服务函数的名字只要符合C语言标识符的命名规则,可以随意取,需要注意的地方是: 中断服务函数没有返回值,没有形参,也不需要单独去声明,并且函数名称体的右边需要使用interrupt关键字声明,interrupt是中断特有的关键字,在interrupt关键字后面可以增加数字,这个数字是根据中断优先级编号来的(可以看4.2.3小节的中断优先级表)。

    使用C语言编程,中断查询次序号就是中断号,C51所有的中断服务函数编写如下:

    void EXTI0_IRQHandler(void) interrupt 0 //外部中断0
    {
        /*code block*/
    }
    void TIM0_IRQHandler(void) interrupt 1  //定时器0
    {
        /*code block*/
    }
    void EXTI1_IRQHandler(void) interrupt 2 //外部中断1
    {
        /*code block*/
    }
    void TIM1_IRQHandler(void) interrupt 3  //定时器1
    {
        /*code block*/
    }
    void UART_IRQHandler(void) interrupt 4  //串口
    {
        /*code block*/
    }
    void TIM2_IRQHandler(void) interrupt 5  //定时器2
    {
        /*code block*/
    }
    void EXTI2_IRQHandler(void) interrupt 6 //外部中断2
    {
        /*code block*/
    }
    void EXTI3_IRQHandler(void) interrupt 7 //外部中断3
    {
        /*code block*/
    }

    4.2.5 中断控制寄存器介绍

    51单片机CPU对中断源的开放或者屏蔽,每一个中断源是否被允许中断,是由内部的中断允许寄存器IE(地址为A8H)和XICON(地址为C0H)控制的,寄存器IE的格式如下:

    图4-2-4

    EA : CPU的总中断允许控制位, EA=1,CPU开放中断, EA=0, CPU屏蔽所有的中断申请。EA的作用是使中断允许形成两级控制。即各中断源首先受EA控制;其次还受各中断源自己的中断允许控制位控制。

    ET2: 定时/计数器T2的溢出中断允许位,ET2=1,允许T2中断; ET2=0,禁止T2中断。

    ES : 串行口1中断允许位。ES=1,允许串行口1中断; ES=0,禁止串行口1中断。

    ET1: 定时/计数器T1的溢出中断允许位。ET1=1,允许T1中断; ET1=0,禁止T1中断。

    EX1 : 外部中断1中断允许位。EX1=1,允许外部中断1中断; EX1=0,禁止外部中断1中断。

    ET0 : T0的溢出中断允许位。ET0=1,允许T0中断; ET0=0禁止T0中断。

    EX0 : 外部中断0中断允许位。 EX0=1,允许中断; EX0=0禁止中断。

    4.2.6 配置定时器0使用中断(8位模式)

    下面代码里配置51单片机的定时器0工作在8位定时器自动重装载模式,并开启了溢出中断,在自动重装载模式下,每次定时器溢出之后,会自动重装载,就省去了手动赋重装值的过程,比较方便,但是定时器的每次最大定时时间变短了,计数器到达255就会溢出。

    程序里封装了计算重装值的函数,方便调用,程序开启了溢出中断,定时器时间到达后会进入到中断服务函数,中断服务函数里使用了一个计数变量,用于记录定时器的超时次数,时间到达500毫秒时,就改变一次LED灯的状态。

    (硬件平台说明:CPU是STC90C516RD 、晶振频率12MHZ 、工作在12T模式下、一个机器周期为1us时间)

    示例代码:

    #include <reg51.h>
    int main()
    {
        Timer0_8bit_Init(100);  //配置定时器超时的时间为100us
        LED=0x00; //关闭所有灯
        while(1)
        {
            
        }
    }
    /*
    配置定时器0工作在8位自动重装载模式
    注意,时间不能超过定时器最大时间
    255*(12/11.059200)=276us
    */
    void Timer0_8bit_Init(u16 us)
    {   
        //当前实验板上的晶振实际频率为: 11.956MHZ
        u16 val=us/(12/11.956); //得到计数的时间,只要整数部分
        TMOD&=0xF0;     //清除配置
        TMOD|=0x02;     //配置定时器0工作在8位自动重载模式
        TL0=TH0=255-val;//得到重装载值;
        EA=1;           //开启总中断
        ET0=1;          //开启定时器0溢出中断
        TR0=1;          //启动定时器0
    }
    
    /*
    定时器0的中断服务函数
    */
    u32 cnt=0;
    void TIM0_IRQHandler(void) interrupt 1
    {
        //使用了中断,就不需要手动清除标志位,硬件会自动清除
        cnt++;//记录超时次数
        if(cnt==10*500) //500ms
        {
            cnt=0;
            LED=~LED;
    }
    }

    4.2.7 配置定时器1使用中断(16位模式)

    下面代码里配置51单片机的定时器1工作在16位定时器模式。程序封装了计算重装值的函数,方便调用,程序里开启了溢出中断,在中断服务函数里使用了一个计数变量,记录定时器超时的次数,时间到达1秒钟,就是改变一次LED灯的状态。

    (硬件平台说明:CPU是STC90C516RD 、晶振频率12MHZ 、工作在12T模式下、一个机器周期为1us时间)

    示例代码:

    #include <reg51.h>
    u16 T1_Update_data;//定时器1的初始值
    void Timer1_16bit_Init(u16 us)
    {   
        //当前实验板上的晶振实际频率为: 11.956MHZ
        u16 val=us/(12/11.956); //得到计数的时间,只要整数部分
        T1_Update_data=65535-val; //得到重装载值
        TMOD&=0x0F;            //清除配置
        TMOD|=0x10;            //配置定时器1工作在16位定时器模式
        TH1=T1_Update_data>>8; //定时器1高位重装值
        TL1=T1_Update_data;    //定时器1低位重装值
        EA=1;                   //开启总中断
        ET1=1;                  //开启定时器1溢出中断
        TR1=1;                 //启动定时器1
    }
    
    //定时器1的重装值更新函数
    void Timer1_Update(void)
    {
        TH1=T1_Update_data>>8; //定时器1高位重装值
        TL1=T1_Update_data;    //定时器1低位重装值
    }
    
    /*
    定时器1的中断服务函数
    */
    void TIM1_IRQHandler(void) interrupt 3  //定时器1
    {
        //使用了中断,就不需要手动清除标志位,硬件会自动清除
        Timer1_Update(); //更新重装载值
        //使用了中断,就需要手动清除标志位,硬件会自动清除
        cnt++;//记录超时次数
        if(cnt==1000) //1000ms
        {
            cnt=0;
            LED=~LED;
        }
    }
    int main()
    {
        Timer1_16bit_Init(1000);  //配置定时器超时的时间为1000us
        LED=0x00; //关闭所有灯
        while(1)
        {
            
        }
    }

    4.2.8 外部中断(EXTI)配置寄存器介绍

    STC90C51有4个外部中断源,分别是:外部中断0(P3.2),外部中断1(P3.3),外部中断2(P4.3),外部中断3(P4.2)。

    图4-2-5 外部中断1和0的IO口

    图4-2-6 外部中断2和3的IO口

    外部中断0和外部中断1的相关配置位在TCON寄存器里,TCON寄存器位如下表所示:

    图4-2-7 外部中断0和1的配置寄存器

    IE1外部中断1请求源(INT1/P3.3)标志。 当发生外部中断请求时 ,IE1会被CPU置1,在中断服务函数里需要将IE1清0。

    IT1外部中断1源中断源类型选位。IT1=0,INT1/P3.3引脚上的低电平信号可触发外部中断1;IT1=1,外部中断1为下降沿触发方式。

    IE0外部中断0请求源(INT0/P3.2)标志。 当发生外部中断请求时 ,IE0会被CPU置1,在中断服务函数里需要将IE0清0。

    IT0外部中断0中断源类型选择位。IT0=0,INT0/P3.2引脚上的低电平可触发外部中断0;IT0=1,外部中断0为下降沿触发方式。

    外部中断2和外部中断3的相关配置为在XICON寄存器里,XICON寄存器位如下表所示:

    图4-2-8 外部中断2和3的配置寄存器

    IE3 : 外部中断3中断请求标志位,中断条件成立后,IE3=1,可由硬件自动清零。

    IT3 : 当此位由软件置位时(IT3=1),外部中断3为下降沿触发中断;当此位由软件清零时(IT3=0),为低电平触发中断。

    IE2 : 外部中断2中断请求标志位,中断条件成立后,IE2=1,可由硬件自动清零。

    IT2 : 当此位由软件置位时(IT2=1),外部中断2为下降沿触发中断;当此位由软件清零时(IT2=0),为低电平触发中断。

    EX3 : 如被设置成1,允许外部中断3中断;如被清成0,禁止外部中断3中断。

    EX2 : 如被设置成1,允许外部中断2中断;如被清成0,禁止外部中断2中断。

    4.2.9 配置外部中断0下降沿触发示例

    下面代码配置外部中断0采用下降沿触发,在外部中断0的服务函数里改变LED灯的状态。

    外部中断0的复用IO是P3.2,在实验板上实验时,需要使用杜邦线把按键的一个引脚接在P3.2上,可以使用按键测试外部中断0的触发效果,由于实验板上的红外线遥控也是接的P3.2,为了不产生干扰,需要先将红外线遥控的跳线帽拔掉,再使用按键测试。

     图4-2-5

    (硬件平台说明:CPU是STC90C516RD 、晶振频率12MHZ 、工作在12T模式下、一个机器周期为1us时间)

    示例代码:

    #include <reg51.h>
    int main()
    {
        LED=0x00;
        EXTI0_Init();
        while(1)
        {
            
        }
    }
    /*
    配置外部中断0下降沿触发中断
    IO口: P3.2
    */
    void EXTI0_Init(void)
    {
       EA=1;  //开启总中断
       IT0=1; //外部中断0下降沿触发
       EX0=1; //允许外部中断0产生中断
    }
    /*
    外部中断0中断服务函数
    */
    void EXTI0_IRQHandler(void) interrupt 0
    {
        LED=~LED; //改变LED灯的状态
        IE0=0; //清除外部中断0的标志位
    }

    4.2.10 中断优先级配置

    传统8051单片机具有两个中断优先级,即高优先级和低优先级,可以实现两级中断嵌套。

    STC90C51RC/RD+系列单片机通过设置新增加的特殊功能寄存器(IPH)中的相应位,可将中断优先级设置为4个中断优先级;如果设置IP,那么中断优先级只有两级,与传统8051单片机两级中断优先级完全兼容。

    一个正在执行的低优先级中断能被高优先级中断所中断,但不能被另一个低优先级中断所中断。

    上所述可归纳为下面两条基本规则:

    1. 低优先级中断可被高优先级中断所中断,反之不能。

    2. 任何一种中断(不管是高级还是低级),一旦得到响应,不会再被它的同级中断所中断

    中断优先级的配置寄存器如下表所示:

    图4-2-6

    PX3H,PX3: 外部中断3优先级控制位:

    当PX3H=0且PX3=0时,外部中断3为最低优先级中断(优先级0)

    当PX3H=0且PX3=1时,外部中断3为较低优先级中断(优先级1)

    当PX3H=1且PX3=0时,外部中断3为较高优先级中断(优先级2)

    当PX3H=1且PX3=1时,外部中断3为最高优先级中断(优先级3)

    PX2H, PX2: 外部中断2优先级控制位:

    当PX2H=0且PX2=0时,外部中断2为最低优先级中断(优先级0)

    当PX2H=0且PX2=1时,外部中断2为较低优先级中断(优先级1)

    当PX2H=1且PX2=0时,外部中断2为较高优先级中断(优先级2)

    当PX2H=1且PX2=1时,外部中断2为最高优先级中断(优先级3)

    PT2H, PT2: 定时器2中断优先级控制位:

    当PT2H=0且PT2=0时,定时器2中断为最低优先级中断(优先级0)

    当PT2H=0且PT2=1时,定时器2中断为较低优先级中断(优先级1)

    当PT2H=1且PT2=0时,定时器2中断为较高优先级中断(优先级2)

    当PT2H=1且PT2=1时,定时器2中断为最高优先级中断(优先级3)

    PSH,PS: 串口1中断优先级控制位:

    当PSH=0且PS=0时,串口1中断为最低优先级中断(优先级0)

    当PSH=0且PS=1时,串口1中断为较低优先级中断(优先级1)

    当PSH=1且PS=0时,串口1中断为较高优先级中断(优先级2)

    当PSH=1且PS=1时,串口1中断为最高优先级中断(优先级3)

    PT1H, PT1: 定时器1中断优先级控制位:

    当PT1H=0且PT1=0时,定时器1中断为最低优先级中断(优先级0)

    当PT1H=0且PT1=1时,定时器1中断为较低优先级中断(优先级1)

    当PT1H=1且PT1=0时,定时器1中断为较高优先级中断(优先级2)

    当PT1H=1且PT1=1时,定时器1中断为最高优先级中断(优先级3)

    PX1H, PX1: 外部中断1优先级控制位:

    当PX1H=0且PX1=0时,外部中断1为最低优先级中断(优先级0)

    当PX1H=0且PX1=1时,外部中断1为较低优先级中断(优先级1)

    当PX1H=1且PX1=0时,外部中断1为较高优先级中断(优先级2)

    当PX1H=1且PX1=1时,外部中断1为最高优先级中断(优先级3)

    PT0H, PT0: 定时器0中断优先级控制位:

    当PT0H=0且PT0=0时,定时器0中断为最低优先级中断(优先级0)

    当PT0H=0且PT0=1时,定时器0中断为较低优先级中断(优先级1)

    当PT0H=1且PT0=0时,定时器0中断为较高优先级中断(优先级2)

    当PT0H=1且PT0=1时,定时器0中断为最高优先级中断(优先级3)

    PX0H, PX0: 外部中断0优先级控制位:

    当PX0H=0且PX0=0时,外部中断0为最低优先级中断(优先级0)

    当PX0H=0且PX0=1时,外部中断0为较低优先级中断(优先级1)

    当PX0H=1且PX0=0时,外部中断0为较高优先级中断(优先级2)

    当PX0H=1且PX0=1时,外部中断0为最高优先级中断(优先级3)

    中断优先级控制寄存器IP和IPH的各位都由可用户程序置“1”和清“0” 。但IP寄存器可位操作,所以可用位操作指令或字节操作指令更新IP的内容。而IPH寄存器的内容只能用字节操作指令来更新。

    STC90C51RC/RD+系列单片机复位后IPIPH均为00H,各个中断源均为低优先级中断

    4.2.11 配置外部中断0的优先级示例

    下面代码初始化了外部中断0和外部中断1,在外部中断0 的初始化代码里,配置外部中断0的优先级为最高,在外部中断1的中断服务函数里写了一个死循环。

    当外部中断1产生中断后,会卡死在中断服务函数里,这时可以触发外部中断0 ,测试外部中断0的中断服务函数是否可以执行(结果是可以执行的,因为外部中断0的优先级高于外部中断1的优先级,可以打断外部中断1的服务函数)。

    实验上的测试过程说明:

    外部中断0的复用IO是P3.2, 外部中断q的复用IO是P3.3,在实验板上实验时,需要使用杜邦线把按键1的引脚接在P3.2上,把按键2的引脚接在P3.3上,这样可以使用按键测试外部中断的触发效果,由于实验板上的红外线遥控接的是P3.2,为了不产生干扰,需要先将红外线遥控的跳线帽拔掉,再测试。

    (硬件平台说明:CPU是STC90C516RD 、晶振频率12MHZ 、工作在12T模式下、一个机器周期为1us时间)

    示例代码:

    #include <reg51.h>
    int main()
    {
        LED=0x00;
        EXTI0_Init();
        EXTI1_Init();
        while(1)
        {
            
        }
    }
    /*
    配置外部中断0下降沿触发中断
    IO口: P3.2
    */
    sfr IPH=0xB7; //定义特殊功能寄存器
    void EXTI0_Init(void)
    {
       IPH|=1<<0; //配置PX0H=1 
       PX0=1;     //当PX0H=1且PX0=1时,外部中断0为最高优先级中断(优先级3)
       EA=1;  //开启总中断
       IT0=1; //外部中断0下降沿触发
       EX0=1; //允许外部中断0产生中断
    }
    /*
    外部中断0中断服务函数
    */
    void EXTI0_IRQHandler(void) interrupt 0
    {
        LED=~LED; //改变LED灯的状态
        IE0=0; //清除外部中断0的标志位
    }
    
    /*
    配置外部中断1下降沿触发中断
    IO口: P3.2
    */
    void EXTI1_Init(void)
    {
       EA=1;  //开启总中断
       IT1=1; //外部中断1下降沿触发
       EX1=1; //允许外部中断1产生中断
    }
    /*
    外部中断1中断服务函数
    IO口: P3.3
    */
    void EXTI1_IRQHandler(void) interrupt 2
    {
        while(1){}  //死循环
        LED=~LED; //改变LED灯的状态
    IE1=0; //清除外部中断1的标志位
    }
    展开全文
  • demi 发布于:周三, 10/16/2019 - 15:15 ,关键词:51单片机包含五个中断源,两级中断优先级,优先级可编程设置,通过IP进行设置。● PX0(IP.0),外部中断0优先级设定位;● PT0(IP.1),定时/计数器T0优先级设定位;...

    15e8e2b0e444c50bf7a52fe89f4c4617.png

    demi 发布于:周三, 10/16/2019 - 15:15 ,关键词:

    51单片机包含五个中断源,两级中断优先级,优先级可编程设置,通过IP进行设置。

    8d80a8458dd82bd247777ce2990b8a4f.png

    ● PX0(IP.0),外部中断0优先级设定位;

    ● PT0(IP.1),定时/计数器T0优先级设定位;

    ● PX1(IP.2),外部中断0优先级设定位;

    ● PT1(IP.3),定时/计数器T1优先级设定位;

    ● PS (IP.4),串行口优先级设定位;

    ● PT2 (IP.5) ,定时/计数器T2优先级设定位。

    a6ece081860dec90f8da3ceb24d0626a.png

    从上图里我们可以看出:

    EA是中断控制位。EA=1,开放中断;EA=0,屏蔽所用中断(编程时人为设定)。

    那EA是在哪里进行设置的呢?它就是在IE(中断允许寄存器)里进行设定的。

    38804947241dec9e14cecca246674b44.png

    第七位就是EA,剩下的还有第四位的ES,第三位的ET1,第二位的EX1,第一位的ET0和第零位的EX0。

    是不是在上图中都能看到他们的影子?没错,要不IE能称为中断允许寄存器嘛。它先设定总允许中断,然后再设定其它中断是否允许。

    接下来我们再来看其它中断允许位。

    ES是串行口中断开放控制位。ES=1,响应串行口中断;ES=0,禁止串行口中断。

    ET1是T1溢出中断开放控制位。ET1=1,响应T1溢出产生的中断;ET1=0,禁止T1溢出产生的中断。

    EX1是外部中断1开放控制位。EX1=1,响应外部中断;EX1=0,禁止外部中断。

    ET0的功能同ET1,对应T0。

    EX0的功能同EX1,对应外部中断0。

    这样,中断是否开启就由你说了算了,你要用什么直接就可以控制对应的中断和总中断EA就可以了。

    现在我们开启了中断,cpu就会检测对应的中断是否到来,那如何检测的呢?接下来我们就要用到另外几个有用的位了。

    6fd4201342459b5bff235c341b4d809b.png

    TCON的第七位TF1,第五位TF0,第三位IE1,第一位IE0。

    760f445f85a7f6d6c23f35910ca75ead.png

    SCON的第一位TI,第零位RI。

    RI(SCON.0),串行口接收中断标志位。当允许串行口接收数据时,每接收完一个串行帧,由硬件置位RI。注意,RI必须由软件清除。

    TI(SCON.1),串行口发送中断标志位。当CPU将一个发送数据写入串行口发送缓冲器时,就启动了发送过程。每发送完一个串行帧,由硬件置位TI。CPU响应中断时,不能自动清除TI,TI必须由软件清除。

    TF1:T1当定时时间到或是当计数个数到的时候,会触发TF1位,然后CPU检测TF1位,执行对应的中断,响应中断后,硬件清零。

    TF0:对应于TF1。

    IE1:外部中断请求标志,外部中断执行,请求中断,对应IE1=1,CPU响应中断,硬件对IE1清零。

    IE0:对应IE1。

    但是对于外部中断,却有两种中断触发方式:

    一种是低电平触发;

    一种是下降沿触发。

    对于不同情况要进行不同的控制,如何在两种方式间进行选择呢?

    我们看TCON的第二位和第零位是没有用的,就是他们两个,第二位IT1对应外部中断1,第零位IT0对应外部中断0,给他们高电平就为下降沿触发,给他们低电平就为低电平触发。

    文章到这里就结束啦~附上“中断优先权图”供大家参考。

    *附 | 中断优先权图

    6934804aa95789266d6871dcf5e2dd45.png

    围观 138

    展开全文
  • MCS-51单片机的中断系统

    千次阅读 2021-01-05 22:44:03
    单片机中断技术概述 在任何一款事件驱动型的CPU里面都应该会有中断系统,因为中断就是为响应某种事件而存在的。...单片机的中断系统5个中断源、2个中断优先级,可实现两级中断服务程序嵌套。 如果单片机没有中
  • C51中断讲解

    2021-06-01 23:28:10
    中断系统 一、中断的概念 CPU在处理某一事件A时,发生了另一事件B请求CPU迅速去处理(中断发生);CPU暂时中断当前的工作,转去处理事件B(中断响应和中断服务);待CPU将事件B处理完毕后,再回到原来事件A被中断...
  • 说最基本的,老的51单片机(80C51系列)5个中断源,2优先级,可以实现二级中断服务嵌套。现在很多扩展的51单片机已经4优先级(或更多)和更多的中断源了。在说到中断之前,我先来定义一下优先级,明白了什么是...
  • FreeRTOS事件标志

    2021-10-28 13:46:08
    当收到一条消息并且把这条消息处理掉以后就可以将某个位(标志)置1,当队列中没有消息需要处理的时候就可以将这个位标志)置0。 当把队列中的消息通过网络发送输出以后就可以将某个位(标志)置1,当没有
  • 中断系统6个中断请求源(简称中断源)(80c51单片机5个中断源),两个中断优先级,可实现两级中断服务程序嵌套。 每一中断源可用软件独立控制为允许中断或关中断状态,中断优先级均可用软件来设置。 图4-2 AT...
  • 本词条缺少概述图,补充相关内容使词条更完整,还能快速升级,赶紧来编辑吧...中文名中断外文名Interrupt Request分类中断装置和中断处理程序相关概念程序状态字和向量中断等系统功能实现中断响应和中断返回等中断定...
  • 中断优先级

    千次阅读 2021-07-25 04:32:43
    为使系统能及时响应并处理发生的所有中断,系统根据引起中断事件的重要性和紧迫程度,硬件将中断源分为若干级别,称作中断优先级。在实际系统中,常常遇到多个中断源同时请求中断的情况,这时CPU必须确定首先为哪...
  • F28335中断系统

    2021-04-09 19:34:14
    一、中断介绍 1.1 中断概念 中断:是当CPU执行原来程序时,由于发生某种随机的事件(内部或外部),引起CPU暂时中断正在运行程序,转去执行一段特殊的服务程序(中断服务子...两不可屏蔽中断(RESET及NMI)与14可屏蔽中
  • 汇编 逻辑运算对标志位的影响

    千次阅读 2021-04-27 19:12:16
    中断标志位IF(Interrupt flag) EI(1) DI(0) 符号标志SF(Sign flag) NG(1) PL(0) 零标志ZF(Zero flag) ZR(1) NZ(0) 辅助进位标志AF(Auxiliary carry flag) AC(1) NA(0) 奇偶标志PF(Parity flag) PE(1) PO(0)
  • 例如1000 1111这么一字节,在计算机里面他实际上就是晶体管的打开和关闭状态而已,并没有任何其他含义,但是我们在解释这字节的时候,却要考虑好种情况,比如它是符号的还是无符号的呢? 对于CPU而言它并不...
  • 6.STC15W408AS单片机外部中断

    千次阅读 2021-07-15 09:29:24
    STC15W408AS单片机4外部中断,它们分别是:外部中断0(INT0)、外部中断1(INT1)、外部中断2(INT2)、外部中断3(INT3)。 外部中断0(INT0)和外部中断1(INT1)触发两种触发方式,上升沿或下降沿均可触发方式 和仅...
  • 51单片机中断系统程序实例 (STC89C52RC)51单片机中断,在程序设计中就可以做到,在做某件事的过程中,停下来先去响应中断,做别的事情,做好别的事情再继续原来的事情。中断优先级是可以给要做的事情排序。...
  • 五、CC2530的中断

    2021-05-23 10:17:45
    1. CC2530的中断 在执行CPU当前程序时,由于系统中出现了某种急需处理的情况,CPU暂停正在执行的程序,转而去执行另外一段特殊程序来处理出现的紧急事务,处理结束后,CPU自动返回到原来暂停的程序中去继续执行。...
  • 中断是指一突发事件,中止了CPU当前的工作,转而处理突发事件,处理完成后 ​ 再回到当前的工作继续执行。 ​ STM32允许多种多样的中断,如外部IO、ADC、USART、I2C、RTC、USB、PVD等 (1).中断基础知识: ...
  • 包括两项:中断标志位清0和外中断信号的撤销。 中断标志位清0是在中断响应后由硬件自动完成的。 外中断请求信号的撤销,由于跳沿信号过后也就消失了,自动撤销。 (2)电平方式外部中断请求的撤销 电平方式外中断...
  • :)1) 介绍一下java线程一共有几个状态;此图来之core java顺便说下,new一个线程出来后,调用start 方法才是处于runnable ,而不是的run()方法线;值得注意的是: 线程的可运行状态并不代表线程一定在运行(runnable...
  • 那么没有一种方法可以让单片机不用一直检测按键的状态,而只在按键动作时才去响应呢?当然!单片机中除了具有基本输入输出功能的作用外,还有专门检测外界信号并作出响应的中断系统。在本例中,通过利用外部...
  • Linux中断子系统(四)之中断申请注册 备注:   1. Kernel版本:5.4 ...  中断的处理主要以下几个功能模块:硬件中断号到Linux irq中断号的映射,并创建好irq_desc中断描述符;中断注册时,先获取设备的
  • Java中出现线程中断的原因哪些发布时间:2021-02-19 15:31:06来源:亿速云阅读:59作者:Leah这篇文章将为大家详细讲解有关Java中出现线程中断的原因哪些,文章内容质量较高,因此小编分享给大家做参考,希望...
  • STC51单片机中断介绍

    2021-05-22 18:25:01
    该系列单片机的始祖是Intel的8004单片机,后来随着Flash rom技术的发展,8004单片机取得了长足的进展,成为应用最广泛的8单片机之一,其代表型号是ATMEL公司的AT89系列,它广泛应用于工业测控系统之中。...
  • 过程称为中断中断实例图示: 中断可以分为 外部中断 定时器中断 串口中断 中断源: 引起中断的原因即发送中断请求的来源。中断源具体可参考下面这图片: 中断优先级以及相对应的寄存器: 图中从上到下依次代表...
  • 2、几个方法 ①、public void interrupt(); 实例方法,实例方法interrupt() 仅仅是设置线程的中断状态为true,不会停止线程; ②、public static boolean interrupted(); 静态方法; 作用: 判断线程是..
  • 执行结果: 由结果可以看出,sleep()方法抛出线程中断异常,但我的轮询并未能检测到线程中断标志,从而导致线程未能结束。 但是如果将sleep()方法注释掉后线程就能正常结束 后来经实验发现,原来JDK中sleep()、...
  • STM32时钟和中断

    2021-05-20 12:46:16
    STM32F427IIH6外设时钟总结及中断理解一、STM32F427IIH6基本信息二、STM...正确理解时钟树助于我们从一整体的角度把握芯片的工作时钟,对代码的编写是十分有用的。 对于 SYSCLK、 HCLK(AHB总线时钟)、 PCLK2(APB
  • 中断优先级寄存器IPPS——串行口中断优先级控制PT1——定时器/计数器1中断优先级控制PX1——外部中断1中断优先级控制PT0——定时器/计数器0中断优先级控制PX0——外部中断0中断优先级控制

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 96,001
精华内容 38,400
关键字:

中断标志位有几个