【STM32F103笔记】4、中断之外部中断——喂~烧水啦

本文深入探讨STM32单片机外部中断处理机制,通过生动的比喻解释中断原理,介绍如何配置GPIO引脚和NVIC控制器实现按键触发外部中断,改变LED状态,提升处理器运行效率。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

这一篇来说一下单片机或者说所有处理器提高运行效率的方法——中断处理,为什么这么说呢,记得我以前看到过一个十分形象的例子,这里我“修饰”一下和大家分享:

小明看着电影突然想喝水,但是水壶里没水了,要烧开一壶水(他不喝冷水的),于是把壶装满水放在炉子上(当然也可以用电热水壶嘛),然后突然精神分裂了:

  • 一个小明每隔10秒就去揭开壶盖看看水有没有开,终于他在第100次揭盖的时候发现,水终于开了,并且也错过了电影的精彩片段,而且他还发现在这段时间他啥也没干;
  • 另一个小明把壶放炉子上就继续看电影去了,然后发现电影不好看,又换了好几部电影,终于找到了想看的;正看着电影,炉子那边传来哨声(现在的话就是热水壶咔哒一下断电的声音),——于是小明暂停电影,赶快去关炉子。

这里的小明相当于处理器,需要不停地处理很多操作,而烧水可以类比一个事件,当事件来临时需要处理器进行处理,但又不需要处理器一直关注这个事件,因为不知道这个事件什么时候会来;

而第一个小明类比于处理器使用不断查询的方法,一旦发现事件来临就采取对应的处理方法,这样处理器大半时间都用在查询事件是否来临上,极大地降低了处理器的效率(干了很多无用功——揭盖子);

但第二个小明相当于处理器使用了中断进行处理,也就是处理器先设置好相关的中断(把炉子放水上——啊呸,把水壶放炉子上),然后就可以不再操心这个事件,放开了手去处理别的事件;等到事件来领,触发中断,这样就告诉处理器,事件来临需要处理了(水开了去关炉子);这样一来,在等到事件来临的间隙,就能处理很多事情,大大提高了处理器的效率

有人要说了,烧水不是大概10分钟嘛,到时候去看一眼就好了;好嘛,今天小明家把原来烧煤球的炉子换成了天然气的炉子,火力猛得很,5分钟不到就烧开了,等到小明10分钟去看的时候,水壶都快烧干了。

也就是说,当处理器不知道事件具体会什么时候来,那么使用定时去查询的话,就可能错过事件,或者事件还没来,需要继续查询。

因此,如果是处理器外部事件的发生,比如引脚电平的变化,或者一个触发信号等等,墙裂推荐使用中断处理。

按键触发外部中断

STM32的每个GPIO引脚都可以配置为外部中断引脚,因此,本篇用笔者的黑色最小系统板来进行说明,因为它自带一个按键,通过这个按键触发引脚的外部中断,并改变LED的亮灭状态。

电路

和上一篇中按键的电路一模一样,PA0为按键输入,按下接地为低电平;同样利用PC13控制的LED来展示按键触发外部中断的效果。
在这里插入图片描述

中断配置

STM32F103系列使用的Cortex-M3内核,有一个强大的异常(Exception)处理系统,在Cortex-M3的编程手册中(ST官网可以下载,搜索文档编号PM0056,或者名称STM32F10xxx/20xxx/21xxx/L1xxxx Cortex®-M3 programming manual)可以了解其异常处理系统,这里的异常包括复位Reset)、不可屏蔽中断NMI: NonMaskable Interrupt)、硬件错误Hard fault)、…,以及用户可以定义使用的中断Interrupt (IRQ))。

中断向量

从Cortex-M3内核的异常向量(Exception Vector)表中可以看出:
在这里插入图片描述
从0x0000地址开始,首先是Initial SP,初始化栈指针的值,然后0x0004地址为Reset,也就是第二篇说明启动方式时对应启动文件中的标号Reset,有兴趣的话可以对照启动文件中的标号去看看,了解下其他异常向量是怎么处理的;

从第16个异常向量IRQ0开始,是通常用户可以定义使用的中断请求向量,也就是说,当某个中断被触发后,程序运行指针会被导向相应的中断向量地址,比如IRQ0触发,PC指针就将指向0x0040这个地址,而这个地址一般会用来存储IRQ0的中断服务程序,这样,PC指针就能进入IRQ0的中服程序,处理中断;

什么,中断服务程序为什么不就放在这个地址?
留给每个中断请求向量的地址空间只有4个字节,写不下一个中服程序的哈哈哈。

中断优先级

那么,既然有这么多中断请求向量,而每个中断向量又将对应各种中断情况,那肯定需要有一个先后顺序了;

Cortex-M3内核的中断优先级又分为两种:

  • preemption priority抢占优先级设置值越小级别越高,即当两个不同的中断同时发生时,抢占优先级高的中断优先进行处理;并且,当有中断T1正在处理时,若发生了中断T2,且T2的抢占优先级高于T1的,那么T1的中断处理将被打断,转而执行T2的中断处理程序,等T2的中断处理程序执行完后,再继续执行T1的中断处理程序;
  • subpriority响应优先级设置值越小级别越高,当两个抢占优先级相同的中断同时发生时,响应优先级高的中断先进行处理。

Cortex-M3内核通过一个叫做内嵌中断控制器(NVIC: Nested Vectored Interrupt Controller)的东西来控制中断进行控制,在库中提供了响应的操作函数与数据类型,包括NVIC初始化优先级设置等:
在这里插入图片描述
上述的异常向量、中断优先级、NVIC等都是Cortex-M3内核的东西,不要与STM32混淆,STM32是因为使用了Cortex-M3内核才具有这些。

外部中断External Interrupt(EXTI:不是exit!)

STM32的每个GPIO都可以配置为外部中断,不同引脚通过不同的中断路径进入中断处理器:
在这里插入图片描述
可以看到这里使用的PA0,位于EXTI0路径上;需要注意的是,只有EXTI0-EXTI4是单独的中断路径,而EXTI9_5和EXTI15_10都是共用一个路径。同样,在库函数中也提供了外部中断EXTI的相关操作函数。

程序

同样,和用于控制LED的引脚一样,外部中断EXTI0和NVIC控制器也需要进行初始化。

NVIC初始化

库函数中,XX初始化都伴随着XX_InitTypeDef,即提供一个初始化结构体用于设置,然后调用XX_Init()函数将初始化结构体中的设置写入寄存器,完成功能的设置。

NVIC初始化程序:


                
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值