本文目的是主要解释如何用stm32F103核心板的GPIOA端一管脚接一个LED,GPIOB端口一引脚接一个开关;并采用中断模式编程,当开关接高电平时,LED亮灯;接低电平时,LED灭灯。
文章目录
前言
※ 中断即打断,实至CPU再执行当前程序时,由于系统出现了某种需要处理的紧急情况,CPU暂停正在执行的程序,转而去执行另一段特殊程序来处理的出现的紧急事务,处理结束后CPU自动返回到原先暂停的程序中去继续执行,这种执行过程由于外界的的原因被中间打断的情况成为中断。
※ 通俗一点,当生活中你正在专注于某事的时候,却因为某些原因,你需要放下手中的事,去做另外一件事情。就好比C/C++语言中的if语句。
(一)中断技术详解
1.什么是中断?
● 在单片机系统中,如果遇到需要紧急处理的突发事件时,CPU需要迅速的作出反应,暂停正在运行的程序来处理突发事件,这时就需要中断
● 中断是指单片机正在执行程序的时,发生突发事件从而打断当前程序,转而去处理这一事件,当处理完成后再回到原来被打断出继续执行原程序的过程。
● 意义:中断能提高CPU的效率,同事能够对突发事件做出实时处理。实现程序的并行化,实现嵌入式系统进程之间的切换。
中断分为同步中断
和异步中断
。
● 同步中断——同步中断是当指令执行时由 控制单元产生的,之所以称为同步,是因为只有在一条指令终止执行后 CPU 才会发出中断。
● 异步中断——异步中断是由其他硬件设备依照 CPU 时钟信号随机 产生的。
※ 通常我们所说的中断指的是异步中断,我们将同步中断称为异常。
(异常是由程序的错误产生的,或者是由内核必须处理的异常条件产生的)
2.中断源
● 任何能够引发中断的事件都称为中断源。
● 分类:中断源可分为硬件中断源和软件中断源。
硬件中断源:外设,数据通道,时钟电路和故障源(如电源掉电)。
软件中断源: 为调试程序设置的中断,中断指令,执行过程出错。
3.中断处理的基本过程
● 中断处理分为如下几个步骤:中断请求,中断响应,保护断点,处理中断,中断返回。
3.1中断请求阶段
● 发生在CPU内部的中断(内部中断),不需要中断请求,CPU内部的中断控制逻辑直接接收处理。
● 外部中断请求由中断源提出。外部中断源利用CPU的中断输入引脚 输入中断请求信号。一般CPU设有两个中断请求输入引脚:可屏蔽中断请求输入引脚和不可屏蔽中断请求输入引脚。
3.1.1中断请求触发器
● 每个中断源发中断请求信号的时间是不确定的,而CPU在何时响应中断也 是不确定的。所以,每个中断源都有一个中断请求触发器,锁存自己的中断请求信号,并保持到CPU响应这个中断请求之后才将其清除。
3.1.2中断允许触发器
● 在CPU内部有一个中断允许触发器,当其为“1”时,允许CPU响应中断, 称为开中断。若其为“0”,不允许CPU响应中断,中断被屏蔽,称为关中断。
● 通常,当CPU复位时,中断允许触发器也复位为“0”,即关中断。当 CPU中断响应时,CPU自动关闭中断,禁止接受另一个新的中断。
● 中断允许触发器的状态可以用开中断或关中断指令来设置。
3.2中断判优阶段
● CPU一次只能接受一个中断源的请求,当多个中断源同时向CPU提出中断请求时,CPU必须找出中断优先级最高的中断源,这一过程称为中断判优。
● 中断判优可以采用硬件方法,也可采用软件方法。
3.2.1软件判优
● CPU检测到中断请求后,首先读取中断请求寄存器的内容,逐位检测它们的状态,检测到某一位为1,就确定对应的中断源有中断请求,转去执行它的中断服务程序。
● 先检测哪一个,哪一个的优先级就高,后检测哪一个,哪一个优先级就低,检测的顺序就是各中断源的优先级顺序。
假设上图中输入端口地址为87FFH。有如下查询程序:
MOV DX, 87FFH
IN AL, DX ;读中断请求寄存器内容
SHR AL, 1
JC IR0 ;IRQ0有请求,转IR0
SHR AL,1
JC IR1 ;IRQ1有请求,转IR1
SHR AL,1
JC IR2 ;IRQ2有请求,转IR2
… …
※ 软件判优耗时较长。如果中断源很多,中断的实时性就很差,但是软件判优优先权安排灵活。
3.2.2硬件判优
● 利用专门的硬件电路确定中断源的优先级,有两种常见的方式:菊花链判优电路和中断控制器判优。
❀菊花链判优电路
设计思想:
每个中断源都有一个中断逻辑电路,所有的中断逻辑电路形成一个链,犹如菊花链。排在链前端的中断源优先级最高,越靠后的设备优先级越低。
实现过程:
CPU收到中断请求,如果允许中断,CPU发出中断响应信号。中断响应信号首先到达菊花链的前端,如果中断源1提出了中断请求,它就会截获中断响应信号,封锁它,使它不能向下一个中断源传送。不论下面的中断源有没有提出中断请求,都不可能接收到中断响应信号,因此它们的中断请求也不能被响应。
❀中断控制器判优
● 中断控制器,如Intel8259A,可以以多种方式设置中断源的中断优先级。 中断控制器中有一个中断优先级判别器,它自动判别出目前提出中断请求的优先级最高的中断源,并将它的中断向量码送到数据总线,CPU接收中断向量码并据此找到它的中断服务程序。
3.3中断响应阶段
● 经过中断判优,中断处理就进入中断响应阶段。中断响应时,CPU向中断源发出中断响应信号,同时:
① 保护硬件现场;
② 关中断;
③ 保护断点;
④ 获得中断服务程序的入口地址。
3.4中断服务阶段
中断服务程序的一般结构为:
1)保护现场。 在中断服务程序的起始部分安排若干条入栈指令,将各寄存器的内容压入堆栈保存。
2)开中断。 在中断服务程序执行期间允许级别更高的中断请求中断现 行的中断服务程序,实现中断嵌套。
3)中断服务。 完成中断源的具体要求。
4)恢复现场。 中断服务程序结束前,必须恢复主程序的中断现场。通常是将保存在堆栈中的现场信息弹出到原来的寄存器中。
5)中断返回。 返回到原程序的断点处,继续执行原程序。
3.5中断返回阶段
返回到原程序的断点处,恢复硬件现场,继续执行原程序。
中断返回操作是中断响应操作的逆过程。
3.6中断过程总结
● 若中断事件发生,中断源向CPU发出有效的INT-REQ
● CPU结束当前指令的执行,进入对中断源请求信号的检测
● 如果CPU检测到有效的中断请求信号并满足响应条件,则向提出请求的中断源发送INT-ACK信号。
● CPU进行断点保护,即将现行程序被打断的标志寄存器状态内容以及CS和IP寄存器内容入栈(断点地址)入栈保存。同时获得有效INT-ACK信号的中断源撤销发出的中断请求信号,并为CPU提供中断处理程序的入口地址相关信息。
● 如果有多个中断源,CPU要先识别高优先级的中断源,然后根据中断源提供的中断程序入口地址转去执行中断服务程序。
● CPU执行中断处理程序,对获得响应的中断源进行服务,例如对IO设备进行IO操作,系统掉电时进行重要数据保护等。
● 中断处理完成时,恢复被保存在堆栈中的断点信息。
● CPU执行断点返回指令,是CPU回到之前被中断的程序断点处继续执行原程序。
4.中断优先级
8086/8088中断优先级:
软件中断(除单步中断)>非屏蔽中断NMI>可屏蔽中断INTR>单步中断
不同优先级中断的处理原则:
不同优先级的多个中断源同时发出中断请求,按照优先级高低依次处理。
低优先级中断正在处理,出现高优先级请求,应转去执行高优先级请求,服务结束后返回原低优先级中断服务程序继续执行。
高优先级中断正在处理,出现低优先级请求,可咋不响应。 中断处理时,出现同级别请求,应在当前中断处理结束后再处理新的请求。
(二)工程新建
1.硬件准备
● 硬件准备如下图:
2.中断工程新创
● 选择STM32F103C8T6。
3.外设设置
● 设置指示灯LED引脚PB5,设置引脚模式为输出模式GPIO_Output
● 设置按键引脚PA1,设置引脚为外部中断功能,PA1与外部中断线EXIT1连接GPIO_EXIT1
3.GPIO设置
● 对于开关对应管脚PA1,设置其触发方式为上升沿触发。
● 使能对应的外部中断线,点击Enabled。
4.配置中断优先级
● 大多数情况下不必设置中断优先级,直接使用中断编号设置的默认中断优先级。
5.时钟设置
● 设置32MHZ。
6.工程生成
● 命名与选择MDK-ARM。
(三)“小试牛刀”——中断控LED亮灭
1.代码编写
● 在Keil文件中的gpio.c文件可以找到中断服务函数(void HAL_GPIO_EXTI_IRQHandler(uint16_t GPIO_Pin)
)。
● 当捕获到上升沿,触发中断,就会进入到这个函数里面。
● 在main.c文件中找个地方重新写一下,因为前面的 __weak 表示此函数为虚函数,需要用户重写的
。
void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
{
if( GPIO_Pin == A1_EXTI_Pin)//判断外部中断源
{
HAL_GPIO_TogglePin(LED_GPIO_Port, LED_Pin);//翻转LED状态
}
}
2.代码编译
● 发现没有错误。
3.烧录实现
❀ 最终实现效果如下:
(四)总结
本文目的是主要解释如何用stm32F103核心板的GPIOA端一管脚接一个LED,GPIOB端口一引脚接一个开关;并采用中断模式编程,当开关接高电平时,LED亮灯;接低电平时,LED灭灯。苦心人,天不负。艰难困苦,玉汝于成!
寄语:少年的梦想是什么
是他日金榜题名,身披荣耀,腰缠万贯,衣锦换乡
不,是成长,是独当一面,是能给家人遮风挡雨,为家人提笔而战!
(五)参考文献
[1]https://blog.csdn.net/weixin_45989401/article/details/119464355
[2]https://blog.csdn.net/weixin_45863060/article/details/123121438
[3]https://blog.csdn.net/windeal3203/article/details/44588205
[4]https://blog.csdn.net/weixin_42240667/article/details/105071373