GPIO 和中断控制 LED 的状态
中断的概念
中断是 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)。执行完成之后,就回到之前的上下文,继续执行主任务。

- 中断源:中断的源头,有外部和内部之分。
- 中断服务程序:处理中断源的函数。
- 中断向量号:识别中断源的编号。
- 中断号:对中断服务程序进行区分,区别内核和非内核。
- 中断向量表:一个连续的存储表,存储中断服务程序的首地址。
实验检测理论
实验准备
开发板: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 的状态的更多相关文章
- Beaglebone Black–GPIO 高低电平控制 LED 灯
上一篇,运用 Linux 的 sysfs,控制本机上的 LED 灯,usr0 至 usr3,这次用 GPIO 控制外部的电路,点亮 LED 灯. 这次的全部材料: BBB 一台 购买 BBB 自带的 ...
- 实验 使用 vivado zedboard GPIO 开关 开控制 LED
前面我做了几个实验 都没有用过 开关,这一次用一用 发现 vivado 真的挺方便 所以 使用 vivado 开发 1.建工程 我使用 vivado 2013.4 创建新工程 –> next – ...
- C#与Arduino通过串口通信来控制LED灯的状态
一.引言 最近摆弄了一段时间的Arduino,发现Arduino做一些电子类项目.监控.机器人.电子玩具比较容易,并且Arduino与.NET程序集成也不难.接下来介绍一个简单的小程序,C#做的一个W ...
- 树莓派GPIO控制LED彩灯
树莓派使用GPIO接口来控制LED灯,自制五彩炫光的节日彩灯. 1.硬件准备 a. 树莓派(Raspberry Pi)一个 b. 彩色RGB二极管 c. 杜邦线 d. 5V电源引脚 以上所有零件均可在 ...
- 【iCore4 双核心板_ARM】例程四:USART实验——通过命令控制LED
实验原理: 开发板上自带一片CH340芯片,完成本实验电脑需要安装CH340驱动, CH340的TXD连接STM32的GPIO(PXC7),CH340的RXD连接STM32的 GPIO(PC6),通过 ...
- 【iCore1S 双核心板_ARM】例程四:USART通信实验——通过命令控制LED
实验原理: 开发板上自带一片CH340芯片,完成本实验电脑需要安装CH340驱动, CH340的TXD连接STM32的GPIO(PB6),CH340的RXD连接STM32的 GPIO(PB7),通过串 ...
- 云中树莓派(4):利用声音传感器控制Led灯
云中树莓派(1):环境准备 云中树莓派(2):将传感器数据上传到AWS IoT 并利用Kibana进行展示 云中树莓派(3):通过 AWS IoT 控制树莓派上的Led 云中树莓派(4):利用声音传感 ...
- STM32学习笔记(四)——串口控制LED(中断方式)
目录: 一.时钟使能,包括GPIO的时钟和串口的时钟使能 二.设置引脚复用映射 三.GPIO的初始化配置,注意要设置为复用模式 四.串口参数初始化配置 五.中断分组和中断优先级配置 六.设置串口中断类 ...
- CC2530学习路线-基础实验-GPIO 按键控制LED灯亮灭(2)
目录 1.前期预备知识 1.1 新大陆Zigbee模块按键电路图 1.2 CC2530相关寄存器 1.3 CC2530中断走向图 1.4 使用C语言为51单片机编写中断程序 1.5 *函数指针 2. ...
- 外部按键 控制 LED 中断 (参考 http://www.oschina.net/question/565065_115196?sort=time )
转帖: http://www.oschina.net/question/565065_115196?sort=time 实验目的: mini2440开发板上有6个按键,将其中的前4个按键设为外部中断方 ...
随机推荐
- 【每日一题】【DFS+存已加的值】2022年2月27日-二叉树根节点到叶子节点的所有路径和
描述给定一个二叉树的根节点root,该树的节点值都在数字0−9 之间,每一条从根节点到叶子节点的路径都可以用一个数字表示.1.该题路径定义为从树的根结点开始往下一直到叶子结点所经过的结点2.叶子节点是 ...
- SpringBoot源码2——SpringBoot x Mybatis 原理解析(如何整合,事务如何交由spring管理,mybatis如何进行数据库操作)
阅读本文需要spring源码知识,和springboot相关源码知识 对于springboot 整合mybatis,以及mybatis源码关系不密切的知识,本文将简单带过 系列文章目录和关于我 涉及到 ...
- STM32用PWM波控制呼吸灯代码
pwm.c #include "pwm.h" //TIM3-CH3 //PB0 void PWM_Config(void) { GPIO_InitTypeDef GPIO_Init ...
- 解决Win10更新后远程桌面提示CredSSP加密Oracle修正的问题
1.以管理员身份打开cmd,运行命令提示符:2.执行REG ADD HKLM\Software\Microsoft\Windows\CurrentVersion\Policies\System\Cre ...
- 侦察工具——Httrack
前言 web渗透学习笔记,实验环境为Metasploitable靶机上的DVWA.此随笔介绍Web渗透侦察工具Httrack Httrack 简介 Httrack能够克隆拷贝目标网站上的所有可访问.可 ...
- Base58算法加密解密(Python实现)
def b58encode(tmp:str) -> str: tmp = list(map(ord,tmp)) temp = tmp[0] base58 = "123456789ABC ...
- Spark下中文分词常用项目
Spark下中文分词常用项目 四种中文分词工具名称: hanLP ansj jieba fudannlp 推荐使用ansj,HanLP效果也不错 Ansj中文分词 基于n-Gram+CRF+HMM的中 ...
- Spark详解(09) - Spark调优
Spark详解(09) - Spark调优 Spark 性能调优 常规性能调优 常规性能调优一:最优资源配置 Spark性能调优的第一步,就是为任务分配更多的资源,在一定范围内,增加资源的分配与性能的 ...
- 传播问卷调查数据不够?自己生成假数据!Python编程一对一教学
问卷调查 Excel 样式 原文件下载 生成代码 序号 直接 range 生成即可. 提交答卷时间 import time time_str = time.strftime('%Y/%m/%d %H: ...
- CVE-2020-1957
漏洞名称 Apache Shiro 认证绕过漏洞 CVE-2020-1957 利用条件 Apache Shiro < 1.5.1 漏洞原理 Apache Shiro 是一款开源安全框架,提供身份 ...