打印
[KungFu8位 MCU]

单片机中断的基本概念

[复制链接]
2930|10
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
单片机中断系统的优点:
  1、实现实时处理。
  2、实现分时操作。
  3、进行故障处理。
  4、待机状态的唤醒。单片机嵌入式系统的应用中,为了减少电源的功耗,当系统不处理任何事物,处于待机状态时,可以让单片机工作在休眠的低功耗方式。通常,恢复到正常工作方式往往也是利用中断信号来唤醒。

沙发
magicoctoy|  楼主 | 2019-2-26 16:21 | 只看该作者
中断处理过程:
   中断系统中,MCU正常情况下运行的程序称为主程序,把产生申请中断信号的单元和事件称为中断源,由中断源向MCU所发出的申请中断信号称为中断请求,MCU接受中断申请并停止现行程序的运行而转向为中断服务称为中断响应,为中断服务的程序称为中断服务程序,现行程序打断的地方称为断点,执行完中断处理程序后返回断点处继续执行主程序称为中断返回。

  其中K就是断点,由于中断服务程序执行完后仍要返回主程序,因此,在执行中断处理程序之前,要将主程序中断点处的地址保存,即中断返回后要执行的命令地址,这个地址就是程序计数器PC的值。这个过程称为保护断点。又由于MCU在执行中断处理程序时,可能会使用和改变主程序使用过的寄存器、标志位、甚至内存单元,因此,在执行中断服务程序前,还要把有关的数据保护起来,称为中断现场保护。在MCU执行完中断处理程序后,又要恢复原来的数据,并返回主程序的断点处继续执行,称为恢复现场。
中断过程中,断点的保护和恢复操作是由单片机内部硬件自动实现,即保存和恢复计数器PC。
中断现场的保护和恢复,需要自己设计中断处理程序时编程实现。在使用中断时,要认真和仔细考虑中断现场的保护和恢复。

使用特权

评论回复
板凳
magicoctoy|  楼主 | 2019-2-26 16:21 | 只看该作者
中断的三个概念:中断源、中断信号、中断向量(中断入口地址);系统有若干个中断源,每个中断源对应一个中断向量,中断向量只是中断服务程序的一个入口地址,所有中断向量连续存放在固定区域,构成了中断向量区。

使用特权

评论回复
地板
magicoctoy|  楼主 | 2019-2-26 16:21 | 只看该作者
中断优先级和中断嵌套:
  中断优先级的概念是针对有多个中断源同时申请中断时,MCU如何响应中断,以及响应哪个中断而提出来的。
中断优先级的确定:
  ▋某中断对应的中断向量地址越小,其中断优先级越高(硬件确定方式)
  ▋通过软件对中断控制器的设定,改变中断的优先级(用户可设置方式,但是AVR不支持)
  一些单片机(如8051)的硬件能够自动实现中断嵌套的处理,即单片机内部的硬件电路能够识别中断的优先级,并根据优先级的高低,自动完成对高优先级中断的优先响应,实现中断的嵌套处理。
** AVR单片机,硬件系统不支持自动实现中断嵌套的处理。如果在系统设计中,必须使用中断嵌套处理,则需要由用户编写相应的程序,通过软件设置来实现中断嵌套的功能。

使用特权

评论回复
5
magicoctoy|  楼主 | 2019-2-26 16:21 | 只看该作者
中断的响应条件与中断控制:
  1)、中断的屏蔽:通常存在一些特殊的标志位用于控制开放或关闭(屏蔽)MCU对中断响应处理,这些标志称为中断屏蔽标志位或中断允许控制位。注意,屏蔽中断信号,不是取消。
  中断源分为:非屏蔽中断、可屏蔽中断、软件中断。**软件中断是指CPU具有相应的软件中断指令,当MCU执行这条指令时能进入软件中断服务,以完成特定的功能(通常用于调试),但是一般的单片机不具备软件中断的指令。
  2)、中断控制与终端响应条件:单片机中,对应每一个中断源都有一个相应的中断标志位,该中断标志位将占据中断控制器中的一位。当单片机检测到某一中断源产生符合条件的中断信号时,其硬件会自动将该中断源对应的中断标志位置“1”,这就意味着有中断信号产生了,向MCU申请中断。
      中断标志位置“1”,并不代表MCU一定响应该中断。为了合理控制中断响应,在单片机内部还有相关的用于中断控制的中断允许标志位。 最重要的一个中断允许标志位是全局中断允许标志位。当该标志位为“0”,表示禁止MCU响应所有的可屏蔽中断的响应。此时不管是否有中断产生,MCU不会响应任何中断请求。只有全局中断允许标志位为“1”,MCU才响应。
      全局中断标志位为“1”,MCU响应可屏蔽中断,每个中断源对应一个各自独立的中断允许标志位。当某个中断允许标志位为“0”时,表示MCU不响应该中断的中断申请。
   MCU响应一个可屏蔽中断源的中断请求的条件是:响应A中断 = 全局中断允许标志位 AND 中断A允许标志 AND 中断A标志;这些标志位全部要置“1”。
   所以,只有当全局中断允许标志位为“1”(由用户软件设置),中断A允许标志位为“1”(由用户软件设置),中断A标志位为“1”(符合中断条件时由硬件自动设置或由用户软件设置)时,MCU才会响应中断A的请求信号(如果有多个中断请求信号同时存在的情况下,还要根据中断A的优先级来确定)。

使用特权

评论回复
6
wakayi| | 2019-3-3 13:56 | 只看该作者
恩 扩展的很详细

使用特权

评论回复
7
wowu| | 2019-3-3 14:17 | 只看该作者
讲解的很详细

使用特权

评论回复
8
木木guainv| | 2019-3-3 14:33 | 只看该作者
很基础的介绍

使用特权

评论回复
9
千岁寒| | 2019-3-18 10:08 | 只看该作者
magicoctoy 发表于 2019-2-26 16:21
中断处理过程:
   中断系统中,MCU正常情况下运行的程序称为主程序,把产生申请中断信号的单元和事件称为 ...

对于 非向量中断 高阶单片机是如何支持的? 可否通过外接功能芯片扩展中断支持数目呢? 谢谢:)

使用特权

评论回复
10
nbnhnjnm| | 2019-3-29 16:18 | 只看该作者
感谢分享!很有用的讲解。

使用特权

评论回复
11
Liuqian0722| | 2022-2-25 09:46 | 只看该作者
/****************************************************************************************
* KF8A系列单片机        KF8A100GQT_DEMO        开发板演示程序
* 标    题: 外部边沿触发中断实验
* 项目名: 02- INT_Sample
* 开发环境:ChipON IDE
* 版          本     :V1.0 (2019/08/10)
* 作 者: 上海芯旺微电子有限公司
* 功能简述:用户按键按下触发下降沿INT1,触发翻转LED_R
* 硬件说明:连接用户按键调帽
****************************************************************************************/
#include<KF8A100GQT.h>
#include "includes.h"

volatile uchar INT1_flag;

void delay_ms(uint16 num)
{
        uint16 i,j;
        for(i=0;i<num;i++)
        {
                j=1000;
                while(j--);
        }
}

void SYS_Init(void)
{

        SCLKCTL = SYSCLK_SCLK_SEL_INTHF|SYSCLK_FREQ_DIV1;        //INTHF作为主时钟
        _NOP();_NOP();        //内部高低速时钟稳定
        PLLEN=0;
        PLLCTL = PLL_SEL_DIV1|PLL_SEL_INTHF|PLLBIAS_CUR_MIN|PLLPMUL_4;
        PLLEN=1;
        delay_ms(200);
        SCLKCTL|=SYSYCLK_SEL_SCKS|SYSCLK_SCLK_SEL_UPCK;                //UPCK作为主时钟        64M
        SCLKOE = 0;                //机器周期禁能输出,输出波形与IO翻转速率相关
        CLKOUTSEL = 0;
        HFCKCTL = 0xCE;        //外设时钟开启

        TR0 = 0;        TR1        = 0;        TR2        = 0;        TR3 = 0;
        TR4 = 0;        TR5 = 0;        TR6 = 0;        TR7 = 0;
        TR9 = 0;        TRA = 0;        TRB = 0;
        P0LR = 0;        P1LR = 0;        P2LR = 0;        P3LR = 0;
        P4LR = 0;        P5LR = 0;        P6LR = 0;        P7LR = 0;
        P9LR = 0;        PALR = 0;        PBLR = 0;
}


//主函数
void main()
{
        uchar i=0;
        SYS_Init();

        //INT1配置
        TR07=1;
        ANS07=0;
        INT1IF=0;  //INT1中断标志位初始化位0
        INT1IE=1;  //INT1中断使能
        INT1SE=0;                //INT1中断下降沿触发
        //总中断开启
        AIE=1;     //使能所有未屏蔽的中断
        PUIE=1;    //使能所有未屏蔽的外设中断

        while(1)
        {
                if(INT1_flag)
                {
                        INT1_flag=0;
                        delay_ms(20);
                        if(P07 == 0)
                        {
                                LED_R=!LED_R;
                        }
                }
        }
}
//中断函数0:0X04入口地址
void int_fun0() __interrupt (0)
{
        if(INT1IE && INT1IF)
        {
                INT1IF=0;
                INT1_flag=1;
        }

}


//中断函数1:0x14入口地址
void int_fun1() __interrupt (1)
{

}
以上是KF8A100GQT_DEMO        开发板演示程序,烧录在芯片中实现不了中断,请大神帮忙看看代码有什么问题?

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

25

主题

236

帖子

1

粉丝