由于今天一直STM8S 的程序,关于STM8s的中断一直是处于只知道用,却不理解中断流程,以及关于中断的基本概念。本篇文档主要说明中断的基本概念、机制、流程、处理方法等。
一些问题:
1.什么叫软件中断、什么是硬件中断?对于中断向量表后的GPIO口,定时器,I2C是什么软件还是硬件中断?
2.什么是软件优先级?什么是硬件优先级?
3.STM8S能改变中断的优先级?怎么改变?比如:说PB比PA口的优先级高,但是我怎么设置寄存器改变其使PA口的中断优先级比PB高。
4.在软件优先级相同的情况下,硬件优先级最高的中断响应?在硬件优先级相同的情况下,软件优先级最高的中断响应?这两句话是什么意思?
牛人的解答:
1、软件中断是由程序产生的中断,比如定时器,硬件中断是由硬件接口产生的,比如串口中断。
2、中断优先级是一样的,通过寄存器配置的。没有你说的软件和硬件优先级
3、中断优先级通过中断优先级寄存器配置,不同的芯片级别不一样,有的是0为最高级,有的是7为最高级。
4、中断优先级相同的情况下,先执行向量列表靠前的中断。
STM8 常用中断指令:
1、开中断:
- _asm(“rim”);
2、禁止中断:
- _asm(“sim”);
3、进入停机模式:
- _asm(“halt”);
4、中断返回:
- _asm(“iret”);
5、等待中断:
- _asm(“wfi”);
6、软件中断:
- _asm(“trap”);
STM8 中断控制系统处理2种类型的中断源:
1、不可屏蔽的中断:RESET , TLI 和 TRAP
2、可屏蔽中断: 外部中断 和 内嵌的外设中断。
STM8 的中断处理流程图:
中断处理流程图
注:流程图中说明的点
PENDING interrupt :中断挂起 fetch next instruction : 获取下一条指令 execute instruction : 执行指令
TRAP(不可屏蔽的软件中断)
路线1:中断被响应后,正常操作被悬起,(PC,X,Y,A和CC)被压桟,根据ITC_SPRx寄存器,置CC寄存器的 l1 和 l0 。
中断服务子程序必须以IRET 指令结束,该指令把堆栈中的保存的寄存器内容出桟,同时由于运行IRET指令,位l1和l0被重新恢复,程序也恢复运行。
路线2:中断程序执行完成后,恢复堆栈内容。
路线3:当前中断服务程序正在执行,另外一个中断等级低的中断等待处理,继续被挂起,等当前中断执行完,再响应低等级中断响应。
路线4:当前中断服务程序正在执行,另外一个中断等级高的中断等待处理,当前中断程序被挂起,(PC,X,Y,A和CC)被压桟,执行等级高的中断程序。等等级高中断执行完,再响应当前中断服务程序。
路线5:当前中断服务程序正在执行,不可屏蔽的软件中断产生,直接REST。