您好,欢迎访问三七文档
当前位置:首页 > 临时分类 > STM8教程-第九章STM8S207中断系统
第九章STM8S207中断系统中断是用于提高计算机工作效率的一种重要技术,最初它只是作为计算机与外设交换信息的一种同步控制方式而提出,但随着计算机技术的发展,特别是CPU速度的迅速提高,对计算机内部机制的要求也越来越高,希望计算机能随时发现各种错误,当系统出现意想不到的事件时,能及时处理。于是,中断的概念得以延伸,除了传统的外部事件引起的中断事件外,还有CPU内部软件中断的概念。所谓中断,是指CPU在正常执行程序的过程中,由于内部、外部事件或者由程序的预先安排,引起了CPU暂时中断当前程序的运行,而转去执行由内部、外部事件或预先安排的时间而所需要执行的中断服务子程序,在中断服务子程序执行完毕后,CPU再重新回来执行当前的程序。利用中断可以大大提高CPU的工作效率。实现中断功能的控制逻辑称为中断机构或者中断系统。尽管单片机或者微控制器中的中断系统各不相同,但中断系统的基本功能是相同的:1、能实现中断响应、中断处理、中断返回和中断屏蔽2、能实现中断优先级排队3、能实现中断嵌套本章介绍STM8S207微控制器的中断系统以及STM8S207微控制器对于中断的处理流程。9.1STM8S207中断系统概述STM8系列单片机的中断属于异常情况处理的一部分,异常情况处理还包括复位,所以本章除论述STM8系列单片机的中断系统,也简要介绍STM8系列单片机的几种复位情况。正常情况下,单片机有序的执行对应程序,按照明确的获取-解码-执行方式顺序处理各种指令。程序计数器记录下一条程序指令位于内存中的位置,即使当程序为了相应分支或跳转指令而偏离了正常的顺序处理,但依然是在顺序事件处理的控制范围之内。可能发生的异常情况会被打破这种事件处理的顺序流,将一个正常程序流的中断归为一个异常情况,异常情况不一定总是和错误相关联的,中断是在一个处理器上运行多个系统的有效方法。通过上面的论述可以知道,STM8程序运行时可能发生的异常可分为两类:复位和中断,而中断又进一步分为可屏蔽和不可屏蔽中断。9.1.1STM8S207的复位STM8S207共有9个复位源:1、NRST引脚产生的外部复位2、上电复位(POR)3、掉电复位(BOR)4、独立看门狗复位5、窗口看门狗复位6、软件复位7、SWIM复位8、非法操作码复位9、EMS复位:当一些关键的寄存器被破坏或错误加载时产生的复位所有的复位源最终都作用于NRST管脚,并在复位过程中保持低电平。复位入口向量在内存映射中位于固定的地址6000h。9.1.2STM8S207单片机的中断STM8S单片机的中断分为可屏蔽中断和不可屏蔽中断。1、不可屏蔽中断不可屏蔽中断包括软件中断、复位中断以及TLI中断,下面简要介绍常用的几个不可屏蔽中断。(1)软件中断TRAP实质上是条指令,但其执行过程与中断相同,即通过中断矢量确定目标地址,中断矢量是8004H~8007H。(2)复位中断复位产生的复位源有前面所说的9个,对应的中断矢量是8000H~8003H(3)TLITLI是非屏蔽中断引脚,无论MCU处于哪种运行状态,当在特定的IO口边缘检测到在相应的TLI输入时将产生硬件中断,MCU执行完当前指令后,就会相应该中断,中断矢量为8008H~800BH。需要注意的是在TLI中断服务子程序中禁止使用TRAP指令。2、可屏蔽中断可屏蔽中断可以在程序控制下由用户开启或者关闭。由于STM8S207的可屏蔽中断数量非常多,这里不详细介绍,在对应功能模块时才分别详细介绍。3、中断堆栈操作顺序因为中断响应过程中,会有隐含的堆栈操作,所以中断响应前,堆栈必须有效,即堆栈指针SP必须指向一个有效的RAM区,而且堆栈的大小必须不少于9字节。入栈操作使堆栈指针值减小,出栈操作使堆栈指针值增加。当堆栈指针值为其被允许的最小值时,继续入栈会使堆栈指针值回卷至其最大值,从而会导致先前存储的数据被覆盖,但此时没有中断或硬件标志位来指示该事件发生。应用程序需确保堆栈被正确的操作,没有溢出。子程序调用会占用2或3字节空间。中断调用会占用9字节空间来存储内部寄存器(除SP之外)。注:WFI/HLAT指令会预先保存CPU上下文。如果CPU处于WFI或HALT状态下有中断发生,则进入中断所需的延时会相应减少。中断响应堆栈入栈操作如下图所示:出栈相反序号堆栈地址入栈内容说明1SP-3PCE:PCH:PCL保存PC值2SP-5YH:YL保存寄存器Y3SP-7XH:XL保存寄存器X4SP-8A保存累加器A5SP-9CC保存程序状态字CC更为详细入栈出栈顺序如下图所示:9.2中断管理模式STM8S207提供2种中断管理模式1、同时发生模式2、嵌套模式9.2.1同时发生中断管理模式在该模式下,所有的中断的中断优先级都是3级,因此它们都是不可以被中断的(除了被TLI,RESET或TRAP中断之外)。硬件的中断优先级按如下顺序排列,从低到高的优先级是:MAIN,IT4,IT3,IT2,IT1,IT0,TRAP/TLI(同等优先级)以及RESET。需要注意的是,通过软件优先级寄存器设定的优先级并不表示当出现中断嵌套时,高优先级中断可以中止低优先级中断的服务程序执行,而转向高优先级中断的服务程序运行。这里高优先级作用只是当多个中断源同时请求中断时才能体现,这时STM8S208将首先响应高优先级的中断,低优先级的中断不会得到相应。STM8S207默认的中断处理机制如下图所示:9.2.2嵌套中断管理模式在该模式下,允许在中断子程序中响应中断。一旦一个中断的优先级被设置低于3级时该模式就立即有效。注意:在中断被响应时如果位I1和I0被修改,那么设备将作如下处理:如果一个中断X仍然处在悬起状态(新的中断或者中断标志没有被清除)同时该新的优先级又比先前的优先级高的话,那么该中断X会被重新响应。否则该中断的软件优先级在下一个中断请求(X中断的IRET之后)来之前保持不变。在中断子程序的执行过程中,执行HALT,POPCC,RIM,SIM和WFI指令会改变当前的软件优先级直到下一条IRET指令被执行或者先前提到的指令之一被执行。9.3中断映射STM8S207的中断映射如下图所示:需要注意的是在IAR开发环境中使用中断矢量的时候要加上2,例如TLI的中断向量号为0,那么在IAR中就是2了,如此类推。9.4中断寄存器设置STM8S207的中断设置寄存器还是比较少的,只有CPUCC寄存器中断位、软件优先级寄存器、外部中断控制寄存器1与2,下面详细讲解STM8S207的中断寄存器设置。9.4.1CPUCC寄存器中断位正如前面介绍的,I1、I0这两位表面当前中断请求的优先级。当一个中断请求发生时,相应的中断向量的软件优先级自动从ITC_SPRx载入I1、I0中注意:不可屏蔽中断可以中断一个级别为3的程序。9.4.2软件优先级寄存器ITC_SPRx通过软件对这8个寄存器的操作,可以定义各个中断向量的软件优先级。注意的是ITC_SPR1位1:0由硬件强制设置(TLI)9.4.3外部中断控制寄存器两个外部中断控制寄存器设置外部中断的触发方式,EXT_CR1、EXT_CR2分别设置了PE、PD、PC、PB、PA以及TLI的触发方式。PxIS[1:0],其中x代表A、B、C、D、E这些位仅仅在CC寄存器的I1、I0都为1时才可以写入。00:下降沿和低电平触发01:仅上升沿触发10:仅下降沿触发11:上升沿和下降沿触发TLIS:高级中断触发位0:下降沿触发1:上升沿触发9.5不可屏蔽外部中断基本实例在这里实现一个外表不可屏蔽中断的实例,也就是TLI中断,由STM8S207引脚可以知道TLI就是PD7口。本实例硬件连接如下图所示:其中PD7是按键,这里还需要LED1也就是PD0作为测试引脚。本实例中关于LED灯的实现已经在前面章节中介绍过,本章介绍中断服务程序的编写。由中断矢量表可以查到TLI的中断号为0,而在IAR下加2就是2。TLI中断编写顺序为:初始化对应IO口中断模式,这里就是PD7口,通过CR1,CR2设置初始化对应中断的方式,例如TLI就是EXTI_CR2的第三位,默认是0,也就是下降沿触发。开全局中断开关,允许中断触发。编写中断服务子程序下面是实例程序代码。#includeiostm8s207rb.hvoiddelay_ms(intvalue);intmain(void){//配置PD0~PD3为输出模式PD_DDR|=0x0F;//00001111,1为输出PD_CR1|=0x0F;//推挽输出PD_CR2=0x00;//配置PD7中断PD_CR1_C17=1;PD_CR2_C27=1;EXTI_CR2_TLIS=1;//开中断允许asm(rim);while(1){PD_ODR=0xff;}}/*********************************************简单延时程序*********************************************/voiddelay_ms(intvalue){inti,j;if(value1)value=1;for(i=0;i!=value;++i)for(j=0;j!=5000;++j);}#pragmavector=0x02__interruptvoidEXTI_PD7_TLI(void){PD_ODR=0;delay_ms(100);}
三七文档所有资源均是用户自行上传分享,仅供网友学习交流,未经上传用户书面授权,请勿作他用。
本文标题:STM8教程-第九章STM8S207中断系统
链接地址:https://www.777doc.com/doc-2860993 .html