【嵌入式系统开发12】在stm32F103C8T6环境下,用HAL库,采用中断模式编程,控制LED的高亮与熄灭

本文目的是主要解释如何用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

  • 1
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值