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个按键设为外部中断方 ...
随机推荐
- 3.5:基于Python的KNN算法简单实现
〇.目标 1.使用pycharm工具创建项目demo: 2.使用python语言实现KNN算法. 一.创建脚本文件 二.编写KNN算法程序 KNN算法所阐述的核心思想在KNN.py文件的注释部分具有详 ...
- <一>C++ STL
STL (standard template libaray - 标准模板库):是 C++ 标准库的重要组成部分,不仅是一个可复用的组件库,而且是一个包罗数据结构与算法的软件框架. 通俗来说:STL就 ...
- PyTorch复现GoogleNet学习笔记
PyTorch复现GoogleNet学习笔记 一篇简单的学习笔记,实现五类花分类,这里只介绍复现的一些细节 如果想了解更多有关网络的细节,请去看论文<Going Deeper with Conv ...
- Java基础类String学习分析
目录 1 String不可变性 2 不可变的好处 3 String+和StringBuilder效率差异 4 String, StringBuffer and StringBuilder 5 Stri ...
- python进阶之路10之函数
函数前戏 name_list = ['jason', 'kevin', 'oscar', 'jerry'] # print(len(name_list)) '''突然len不准用了''' # coun ...
- VMware-workstation软件安装和虚拟机创建
VMware-workstation软件安装和虚拟机创建 环境说明: 1.宿主机:Windows 10 专业版 19045.2364,CPU四核八线程,内存16G,硬盘1TB. 2.VMware-wo ...
- Matplotlib 绘制折线图
Matplotlib matplotlib: 最流行的Python底层绘图库,主要做数据可视化图表,名字取材于MATLAB,模仿MATLAB构建 绘制折线图 绘制两小时的温度变化 from matpl ...
- 计组Review1
1GB的内存,它是以字节编址的,假设内存地址为32位,128KB的高速缓存.现在有一个数据位于0x123456(字节编址),会映射到那些不同情形的内存单元上,还有TAG和总缓存大小. 1. 直接映射, ...
- 逐步讲解如何在 Proteus 中新建工程
前言 Proteus 新建工程虽然不难,但对于电子小白来说可能便成了学习路上的绊脚石,本篇我将逐步讲解如何在 Proteus 中新建工程. 最新版 Proteus 8.15 最新版 Proteus 8 ...
- TIM—高级定时器输出PWM
高级定时器输出PWM 主频144M,生成一个频率为1K,占空比为30%的PWM详细代码参考EVT例程PWM_Output 重要参数说明 TIM_TimeBaseInitStructure.TIM_Pe ...