中断的概念

中断是 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. VSCode解决Python中空格和制表符混用报错

    Python对缩进的要求非常严格,缩进控制不正确可能会造成代码执行不正确甚至报错. 遇到报错"TabError: inconsistent use of tabs and spaces in ...

  2. linux常用命令精讲

    一.虚拟机三种网卡模式 1 桥接 相当于虚拟机和真机之间架了一座桥 2 NAT 虚拟系统借助 NAT(网络地址转换)功能,通过宿主机器所在的网络来访问公网(常用vm8) 3 仅主机 虚拟机和物理机在一 ...

  3. 4、PageHelper分页查询

    1.MyBatis的分页方式: 逻辑分页与物理分页 1.逻辑分页:使用MyBatis自带的RowBounds进行分页,是一次性查询很多数据,然后再在结果中检索分页的数据.这样做弊端是需要消耗大量的内存 ...

  4. JUC并发编程详解(通俗易懂)

    一.JUC简介 在Java5.0提供了java.util.concurrent包,简称JUC,即Java并发编程工具包.JUC更好的支持高并发任务. 具体的有以下三个包: java.util.conc ...

  5. 聊聊Cookie、Session、Token 背后的故事

    摘要:Cookie.Session.Token 这三者是不同发展阶段的产物 本文分享自华为云社区<Cookie.Session.Token 背后的故事>,作者: 龙哥手记. 1. 网站交互 ...

  6. python进阶之路14 之函数内置方法、可迭代对象、异常捕获处理

    重要内置函数 1.map() 映射 l1 = [1, 2, 3, 4, 5] # def func(a): # return a+1 res = map(lambda x:x+1, l1) print ...

  7. Lyndon Word 与 Lydon 分解

    \(\newcommand\m\mathbf\) \(\newcommand\t\texttt\) \(\text{By DaiRuiChen007}\) 约定: 对于两个字符串 \(S,T\),用 ...

  8. LCD副屏-CPU,内存,时显,日期显示

    文章结构: 项目概述 成品预览 项目框架 硬件资料,代码 项目槽点 -项目概述- 以前的旧模块搁置很久没用,最近看到圈子很多倒腾电脑副屏的,咱虽然没钱,但是闲啊,刚好手头有这些东西,开干. 目的: 显 ...

  9. Linux的串口非标准波特率设置更改

    用的是全志的R528 SDK,Linux内核是5.4,新增加一个250000的非标准波特率 参考网络大神文档,实践并记录宝贵的经验. 方法: 1.修改内核的/include/uapi/asm-gene ...

  10. Xmake v2.7.6 发布,新增 Verilog 和 C++ Modules 分发支持

    Xmake 是一个基于 Lua 的轻量级跨平台构建工具. 它非常的轻量,没有任何依赖,因为它内置了 Lua 运行时. 它使用 xmake.lua 维护项目构建,相比 makefile/CMakeLis ...