中断的概念

中断是 MCU 强行从正常的主任务切换到由某些内部或外部条件的紧急任务。中断的优先程度远远高于主任务,MCU 会暂时把主任务挂起,转而处理中断任务,之后再执行主任务。

引起中断的外部条件来自于外围设备、硬件断点请求、访问错误和复位等。引起中断的内部条件有指令不对、界错误、违反特权级和跟踪等。

中断服务程序

当一个中断发生之后,如何处理这个中断呢?从软件层面来理解:由一个函数来处理这个中断内容,称之为中断服务程序(Interrupt Service Routine,ISR)。

中断向量号

给 MCU 能够识别的每个中断源编号,就是中断向量号。中断向量表按照中断向量号从小到大的顺序填写中断服务程序的首地址,且不能遗漏。

中断号 IRQ

中断号 IRQ 把内核中断和非内核中断加以区分,对于非中断内核,IRQ 从 0 开始递增;对于内核中断,IRQ 从 -1 开始递减。IRQ 位于 stm32l431xx.h:

中断向量表

基本上每一个中断源都有与之对应的中断服务程序,中断源被 MCU 识别之后,要执行相应的中断服务程序。这些中断服务程序被存储在中断向量表中,中断向量表一般位于工程的启动文件中,startup_stm32l431xp.s:

中断处理过程

中断处理的基本过程分为中断请求、中断检测、中断响应与中断处理灯过程。

中断源 MCU 发起一个中断请求信号(电信号),中断控制器(NVIC)获取中断源对应的中断向量号。MCU 每执行一条指令结束时,会检测系统中是否有中断请求信号。如果有中断请求信号,MCU 将暂停执行任务,转而处理中断(中断响应);如果没有中断请求信号,MCU 继续执行任务。

中断响应过程中,MCU 会检查该中断源是否被允许。如果该中断源被允许,中断被忽略。中断响应过程需要 MCU 把当前的上下文保存到堆栈中,通过中断向量号找到对应的中断服务程序 ISR,转而执行该程序(ISR)。执行完成之后,就回到之前的上下文,继续执行主任务。

  1. 中断源:中断的源头,有外部和内部之分。
  2. 中断服务程序:处理中断源的函数。
  3. 中断向量号:识别中断源的编号。
  4. 中断号:对中断服务程序进行区分,区别内核和非内核。
  5. 中断向量表:一个连续的存储表,存储中断服务程序的首地址。

实验检测理论

实验准备

开发板:STM32L431RCT6(小熊派)

引脚配置:PB2(按键)、PB3(按键)、PC13(LED)

NVIC 模块中开启 EXTI2 和 EXTI3 的中断。找到 SYS 模块,打开 Serial Wire,方便调试。

其余的配置请看02#嵌入式系统基础:GPIO 和轮询控制 LED 的状态 - CubeMX 配置

编写代码

在 main.c 中编写中断回调函数:

/* Private user code ---------------------------------------------------------*/
/* USER CODE BEGIN 0 */
void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
{
if (GPIO_Pin == S4_KEY_Pin) {
HAL_GPIO_WritePin(LED1_GPIO_Port, LED1_Pin, GPIO_PIN_SET);
} else if (GPIO_Pin == S3_KEY_Pin) {
HAL_GPIO_WritePin(LED1_GPIO_Port, LED1_Pin, GPIO_PIN_RESET);
}
}
/* USER CODE END 0 */

效果演示

总结

到目前为止,嵌入式的学习都非常简单,基本上全是点灯,只不过点灯方式有不同。轮询点灯就是一直无限循环判断按键的电平状态,是否有向 MCU 输入电平,判断引脚是哪一个,进而做出相应的处理;中断是 NVIC 管理中断,MCU 对中断请求进行响应,从中断回调函数中处理相应的处理。数模/模数模块会更加有趣,以及之后的知识点。

GPIO 和中断控制 LED 的状态的更多相关文章

  1. Beaglebone Black–GPIO 高低电平控制 LED 灯

    上一篇,运用 Linux 的 sysfs,控制本机上的 LED 灯,usr0 至 usr3,这次用 GPIO 控制外部的电路,点亮 LED 灯. 这次的全部材料: BBB 一台 购买 BBB 自带的 ...

  2. 实验 使用 vivado zedboard GPIO 开关 开控制 LED

    前面我做了几个实验 都没有用过 开关,这一次用一用 发现 vivado 真的挺方便 所以 使用 vivado 开发 1.建工程 我使用 vivado 2013.4 创建新工程 –> next – ...

  3. C#与Arduino通过串口通信来控制LED灯的状态

    一.引言 最近摆弄了一段时间的Arduino,发现Arduino做一些电子类项目.监控.机器人.电子玩具比较容易,并且Arduino与.NET程序集成也不难.接下来介绍一个简单的小程序,C#做的一个W ...

  4. 树莓派GPIO控制LED彩灯

    树莓派使用GPIO接口来控制LED灯,自制五彩炫光的节日彩灯. 1.硬件准备 a. 树莓派(Raspberry Pi)一个 b. 彩色RGB二极管 c. 杜邦线 d. 5V电源引脚 以上所有零件均可在 ...

  5. 【iCore4 双核心板_ARM】例程四:USART实验——通过命令控制LED

    实验原理: 开发板上自带一片CH340芯片,完成本实验电脑需要安装CH340驱动, CH340的TXD连接STM32的GPIO(PXC7),CH340的RXD连接STM32的 GPIO(PC6),通过 ...

  6. 【iCore1S 双核心板_ARM】例程四:USART通信实验——通过命令控制LED

    实验原理: 开发板上自带一片CH340芯片,完成本实验电脑需要安装CH340驱动, CH340的TXD连接STM32的GPIO(PB6),CH340的RXD连接STM32的 GPIO(PB7),通过串 ...

  7. 云中树莓派(4):利用声音传感器控制Led灯

    云中树莓派(1):环境准备 云中树莓派(2):将传感器数据上传到AWS IoT 并利用Kibana进行展示 云中树莓派(3):通过 AWS IoT 控制树莓派上的Led 云中树莓派(4):利用声音传感 ...

  8. STM32学习笔记(四)——串口控制LED(中断方式)

    目录: 一.时钟使能,包括GPIO的时钟和串口的时钟使能 二.设置引脚复用映射 三.GPIO的初始化配置,注意要设置为复用模式 四.串口参数初始化配置 五.中断分组和中断优先级配置 六.设置串口中断类 ...

  9. CC2530学习路线-基础实验-GPIO 按键控制LED灯亮灭(2)

    目录 1.前期预备知识 1.1 新大陆Zigbee模块按键电路图 1.2 CC2530相关寄存器 1.3 CC2530中断走向图 1.4 使用C语言为51单片机编写中断程序 1.5 *函数指针 2. ...

  10. 外部按键 控制 LED 中断 (参考 http://www.oschina.net/question/565065_115196?sort=time )

    转帖: http://www.oschina.net/question/565065_115196?sort=time 实验目的: mini2440开发板上有6个按键,将其中的前4个按键设为外部中断方 ...

随机推荐

  1. 在微信上搭建ChatGpt机器人

    在微信上搭建ChatGpt机器人 项目地址:https://gitee.com/shtml/wechatbot?_from=gitee_search 准备 一个服务器:Windos,Centos,Ub ...

  2. Selenium4+Python3系列(十三) - 与docker中的jenkins持续集成

    前言 文章更新到这一篇时,其实我还是很开心的,因为这也正是这系列教程的最后一篇文章,也算是完成了一个阶段性的小目标,也很感谢那些愿意看我文章与我交流学习的同学,感谢有你们的支持和陪伴. Jenkins ...

  3. ORM常用字段与参数(自定义字段)

    目录 一:orm中常用字段及参数 1.说明 2.自定义字段使用 3.ORM字段参数 一:orm中常用字段及参数 1.说明 id字段是自动添加的,如果你想要指定自定义主键,只需在其中一个字段中指定pri ...

  4. 浅谈字节码增强技术系列2-Asm与Cglib

    作者:董子龙 前言 记得那是2022年秋天的第一场雨,比2021年来的稍晚一些,在那个秋雨朦胧的下午,正在工位上奋笔疾书的我突然听到了前面波哥对着手机听筒说出来的"温柔"的话语:说 ...

  5. Python怎么引入不同的库?

    怎么引入不同的库? 在线安装库 1)pip install 模块名 2)国内源: 清华:https://pypi.tuna.tsinghua.edu.cn/simple 阿里云:http://mirr ...

  6. 前缀树(Tire)—Python

    核心思想 空间换时间,是一种用于快速减速的多叉树结构,利用字符串的公共前缀来降低时间 优缺点: 优点:查询效率高,减少字符比较 缺点:内存消耗较大 每次都会从头向下一直到字符串结尾 前缀树 1 单个字 ...

  7. git相关问题解析,你想要的都有🔥

    官网文档: https://git-scm.com/doc 本地克隆远程代码仓库 git clone 地址 本地同步全量历史数据,克隆所有文件的历史记录 git clone 地址 -depth 1 本 ...

  8. 【转载】EXCEL VBA 选取非连续的单元格区域——Areas集合

    出处:http://www.360doc.com/content/21/1113/17/77710807_1004011085.shtml 前面我们讲的大多是**并操作单个的单元格,或者是连续的单元格 ...

  9. 【运维笔录】局域网实现HTTPS访问,只需Nginx + mkcert

    1)下载安装mkcert wget -O mkcert https://github.com/FiloSottile/mkcert/releases/download/v1.4.3/mkcert-v1 ...

  10. P7960 [NOIP2021] 报数

    简要题意 小Z在玩报数游戏,这个游戏有一个规则,就是对于一个正整数 \(x\),如果满足 \(7 \mid x\) 或 \(x\) 的十进制写法中含有 \(7\) 或是十进制写法含有 \(7\) 的倍 ...