STM32中断——外部中断
目录
一、概述
二、外部中断(Extern Interrupt简称EXTI)
三、实例-对射式红外传感器
1、配置中断:
2 、完整代码
一、概述
中断:在主程序运行过程中,出现了特定的中断触发条件(中断源),使得CPU暂停当前正在运行的程序,转而去处理中断程序,处理完成后又返回原来被暂停的位置继续运行。
中断优先级:当有多个中断源同时申请中断时,CPU会根据中断源的轻重缓急进行裁决,优先响应更加紧急的中断源。
中断嵌套:当一个中断程序正在运行时,又有新的更高优先级的中断源申请中断,CPU再次暂停当前中断程序,转而去处理新的中断程序,处理完成后依次进行返回。
STM32中有68个可屏蔽中断通道,包含EXTI、TIM、ADC、USART、SPI、I2C、RTC等多个外设;使用NVIC统一管理中断,每个中断通道都拥有16个可编程的优先等级,可对优先级进行分组,进一步设置抢占优先级和响应优先级.
NVIC就是STM32中用来管理中断、分配优先级,被称为内嵌向量中断控制器。

可以根据医院中叫号的例子进行理解。如上图EXIT、TIM等等当作病人,NVIC当作叫号系统,CPU当作医生。根据病人的等级分配一个优先级,叫号系统看一下现在在排队的病人,优先叫紧急的病人,叫号系统会把该病人的号进行提前,然后医生就可以看病了。
NVIC的中断优先级由优先级寄存器的4位(0~15)决定,值越小,优先级越高,这4位可以进行切分,分为高 n 位的抢占优先级和低 4-n 位的响应优先级 ,抢占优先级高的可以中断嵌套,响应优先级高的可以优先排队,抢占优先级和响应优先级均相同的按中断号排队


根据上面看病例子,响应优先级高的可以优先排队,就是病人很紧急的可以优先看病,可以插队看病。抢占优先级高的可以中断嵌套,就是,一个病人A正在看病,病人中来了个很紧急的病人B,这时病人B直接进到医生屋里,直接打断病人A看病,然后医生给病人B看,看完后,再给病人A看。
二、外部中断(Extern Interrupt简称EXTI)
1、EXTI可以监测指定GPIO口的电平信号,当其指定的GPIO口产生电平变化时,EXTI将立即向NVIC发出中断申请,经过NVIC裁决后即可中断CPU主程序,使CPU执行EXTI对应的中断程序
2、支持的触发方式:上升沿/下降沿/双边沿/软件触发
3、支持的GPIO口:所有GPIO口,但相同的Pin不能同时触发中断(这个就是如PA1和PB1或PA1、PB1、PC1,这种Pin一样的不能同时用,只能选择一个作为中断)
4、通道数:16个GPIO_Pin,外加PVD输出、RTC闹钟、USB唤醒、以太网唤醒
5、触发响应方式:中断响应/事件响应。触发引脚是中断响应,事件响应就是外部中断的信号就不会通向CPU了,而是通向其他外设,用来触发其他外设的操作。
如下图,经过AFIO中断引脚选择后,只有一个16位通道,所以相同的Pin不能同时触发中断,只能选择其中一个。EXTI总共有20个输入信号(加了下面绿色蹭饭的四个),经过EXTI电路之后,分为两种输出,一种是NVIC,另一种是其他外设,在NVIC中外部中断5~9,10~15放在了一个通道中,也就是说,外部中断5~9,10~15可以触发同一个中断函数,在编程中,需要根据标志位来区分到底哪个中断进来。
最下面有20条输出线路到了其他外设,用来触发其他外设,也就是前面所说的事件响应

AFIO复用IO口
- AFIO主要用于引脚复用功能的选择和重定义
- 在STM32中,AFIO主要:复用功能引脚重映射、中断引脚选择
外部中断一些应用场景,其实是由突发信号来产生中断。
三、实例-对射式红外传感器
工作原理:
- 有遮挡,输出高电平;无遮挡,输出低电平
- 有输出状态指示灯,输出高电平灯灭,输出低电平灯亮
本实验是通过该红外传感器进行计数,计数值在OLED屏显示。
1、配置中断:
- 配置时钟外设
//使用的是B端
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);
//AFIO外设,也是在RCC_APB2Periph总线中的
RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);
- GPIO初始化
GPIO_InitTypeDef GPIO_InitStructure;
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IPU;
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_14;
GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
GPIO_Init(GPIOB,&GPIO_InitStructure);
- 配置AFIO
//通过AFIO,选出中断通道
GPIO_EXTILineConfig(GPIO_PortSourceGPIOB,GPIO_PinSource14);
- 配置EXTI
EXTI_InitTypeDef EXTI_InitStructure;
EXTI_InitStructure.EXTI_Line=EXTI_Line14; //B14
EXTI_InitStructure.EXTI_LineCmd=ENABLE; //使能
EXTI_InitStructure.EXTI_Mode=EXTI_Mode_Interrupt; //中断响应
EXTI_InitStructure.EXTI_Trigger=EXTI_Trigger_Falling; //下降沿EXTI_Init(&EXTI_InitStructure); //EXTI初始化
- 配置NVIC
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); //先进行分组,用得分组2NVIC_InitStruct.NVIC_IRQChannel=EXTI15_10_IRQn; //选10_15,用的是14NVIC_InitStruct.NVIC_IRQChannelCmd=ENABLE; //使能NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority=1; //抢占优先,中断少,可以随便设置NVIC_InitStruct.NVIC_IRQChannelSubPriority=1; //响应优先NVIC_Init(&NVIC_InitStruct); //NVIC初始化
- 最后配置中断服务函数
中断服务函数格式和函数名是固定的,可以在起始文件进行查看。如下,一个是5—9通道,另外一个是10-15通道,这里用到的是10-15:

代码如下:
void EXTI15_10_IRQHandler(void)
{if(EXTI_GetITStatus(EXTI_Line14)==SET) //14通道发生中断时,会产生中断标志位,也就是高电平,通过EXTI_GetITStatus()读取{Delay_ms(10); //延时,防止抖动CountSensor_Num++;EXTI_ClearITPendingBit(EXTI_Line14); //清除中断标志位,如果不清除,会不断发生中断}}}
2 、完整代码
分模块文件进行编程,如下:
CountSensor.c:
#include "stm32f10x.h" // Device header
#include "Delay.h"uint16_t CountSensor_Num=0;void CountSensor_Init(void)
{GPIO_InitTypeDef GPIO_InitStructure;EXTI_InitTypeDef EXTI_InitStructure;NVIC_InitTypeDef NVIC_InitStruct;//配置外设RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE); //EXIT和NVIC是不需要开启始终,NVIC是内核的GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IPU;GPIO_InitStructure.GPIO_Pin=GPIO_Pin_14;GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;GPIO_Init(GPIOB,&GPIO_InitStructure);//配置AFIOGPIO_EXTILineConfig(GPIO_PortSourceGPIOB,GPIO_PinSource14);//配置EXITEXTI_InitStructure.EXTI_Line=EXTI_Line14;EXTI_InitStructure.EXTI_LineCmd=ENABLE;EXTI_InitStructure.EXTI_Mode=EXTI_Mode_Interrupt;EXTI_InitStructure.EXTI_Trigger=EXTI_Trigger_Falling;EXTI_Init(&EXTI_InitStructure); //EXTI初始化//配置NVICNVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);NVIC_InitStruct.NVIC_IRQChannel=EXTI15_10_IRQn;NVIC_InitStruct.NVIC_IRQChannelCmd=ENABLE;NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority=1;NVIC_InitStruct.NVIC_IRQChannelSubPriority=1;NVIC_Init(&NVIC_InitStruct);}uint16_t CountSensor_Get(void)
{return CountSensor_Num;
}void EXTI15_10_IRQHandler(void)
{if(EXTI_GetITStatus(EXTI_Line14)==SET) //判断14通道是否中断{if(EXTI_GetITStatus(EXTI_Line14)==SET){Delay_ms(10);CountSensor_Num++;EXTI_ClearITPendingBit(EXTI_Line14); //清除中断标志位}}
CountSensor.h:
#ifndef _COUNTSENSOR_H
#define _COUNTSENSOR_Hvoid CountSensor_Init(void);uint16_t CountSensor_Get(void);#endif
main.c:
#include "stm32f10x.h" // Device header
#include "OLED.h"
#include "delay.h"
#include "CountSensor.h"uint16_t CountSensor_GetNum=0;int main(void)
{OLED_Init();CountSensor_Init();OLED_ShowString(1,1,"Count:");while(1) {CountSensor_GetNum=CountSensor_Get();OLED_ShowNum(1,8,CountSensor_GetNum,4);}}
OLED驱动代码和延时函数代码可以查看我之前写的文章。
相关文章:
STM32中断——外部中断
目录 一、概述 二、外部中断(Extern Interrupt简称EXTI) 三、实例-对射式红外传感器 1、配置中断: 2 、完整代码 一、概述 中断:在主程序运行过程中,出现了特定的中断触发条件(中断源),使得CPU暂停当…...
LeetCode78 子集
题目: 给你一个整数数组 nums ,数组中的元素 互不相同 。返回该数组所有可能的 子集(幂集)。 解集 不能 包含重复的子集。你可以按 任意顺序 返回解集。 示例 1: 输入:nums [1,2,3] 输出:[[…...
《python语言程序设计》2018版第8章19题几何Rectangle2D类(下)-头疼的几何和数学
希望这个下集里能有完整的代码 一、containsPoint实现 先从网上找一下Statement expected, found Py:DEDENTTAB还是空格呢??小小总结如何拆分矩形的四个点呢.我们来小小的测试一下这个函数结果出在哪里呢???修改完成variable in function should be lowercase 函数变量应该…...
【C++】入门基础介绍(上)C++的发展历史与命名空间
文章目录 1. 前言2. C发展历史2. 1 C版本更新特性一览2. 2 关于C23的一个小故事: 3. C的重要性3. 1 编程语言排行榜3. 2 C在工作领域中的应用 4. C学习建议和书籍推荐4. 1 C学习难度4. 2 学习书籍推荐 5. C的第一个程序6. 命名空间6. 1 namespace的价值6. 2 namespace的定义6. …...
dll动态库加载失败导致程序启动报错以及dll库加载失败的常见原因分析与总结
目录 1、问题说明 2、dll库的隐式加载与动态加载 2.1、dll库的隐式加载 2.2、dll库的显式加载 3、使用Process Explorer查看进程加载的dll库信息以及动态加载的dll库有没有加载成功 3.1、使用Process Explorer查看进程加载的dll库信息 3.2、使用Process Explorer查看动态…...
SAP MM学习笔记 - 豆知识10 - OMSY 初期化会计期间,ABAP调用MMPV/MMRV来批量更新会计期间(TODO)
之前用MMRV,MMPV来一次一个月来修改会计期间。 如果是老的测试机,可能是10几年前的,一次1个月,更新到当前期间,搞个100多次,手都抖。 SAP MM学习笔记 - 错误 M7053 - Posting only possible in periods 2…...
Pytorch实现RNN实验
一、实验要求 用 Pytorch 模块的 RNN 实现生成唐诗。要求给定一个字能够生成一首唐诗。 二、实验目的 理解循环神经网络(RNN)的基本原理:通过构建一个基于RNN的诗歌生成模型,学会RNN是如何处理序列数据的,以及如何在…...
四、Drf认证组件
四、Drf认证组件 4.1 快速使用 from django.shortcuts import render,HttpResponse from rest_framework.response import Response from rest_framework.views import APIView from rest_framework.authentication import BaseAuthentication from rest_framework.exception…...
C++:静态成员
静态成员涉及到的关键字尾static 静态成员变量要在类外初始化 去掉static关键字类型类名::变量名 静态成员变量不属于任何对象 所有对象共享一份 静态成员可以不通过对象直接访问 类名::成员名 静态成员依旧受访问修饰符的约束 …...
28 Vue3之搭建公司级项目规范
可以看到保存的时候ref这行被提到了最前面的一行 要求内置库放在组件的前面称为auto fix,数组new arry改成了字面量,这就是我们配置的规范 js规范使用的是airbnb规范模块使用的是antfu 组合prettier&eslint airbnb规范: https://github…...
【pytorch】张量求导3
再接上文,补一下作者未补完的矩阵运算的坑。 首先贴一下原作者的图,将其转化为如下代码: import torch import torch.nn as nn import torch.optim as optim# 定义一个简单的两层神经网络 class TwoLayerNet(nn.Module):def __init__(self):super(TwoLayerNet, self).__in…...
Servlet——springMvc底层原理
我们也先了解一下什么的动态资源,什么是静态资源。 静态资源:无需程序运行就可以获取的资源(照片、html、css、js等) 动态资源:需要通关程序运行才可以获得的资源。 (其实动态、静态的资源都与Servlet有…...
Json 在线可视化工具,分享几个
文章目录 1.json.cn2.json4u.cn3.jsonvisual.com4.jsoncrack5.altearius.github.io6.json.wanvb.com 前序:本文是对多种 Json 在线可视化工具 的介绍、分享。Json官网 https://www.json.org/json-en.html 个人比较中意第四款: https://jsoncrack.com/ed…...
LLM | llama.cpp 安装使用(支持CPU、Metal及CUDA的单卡/多卡推理)
1. 详细步骤 1.1 安装 cuda 等 nvidia 依赖(非CUDA环境运行可跳过) # 以 CUDA Toolkit 12.4: Ubuntu-22.04/24.04(x86_64) 为例,注意区分 WSL 和 Ubuntu,详见 https://developer.nvidia.com/cuda-12-4-1-download-archive?targ…...
矩阵求解复数(aniwoth求解串扰)
所以这种求解串扰的格式是因为,有串扰的共轭项在方程组中 复数共轭项的作用,但是这是二次方程,...
Redis: Sentinel哨兵监控架构及环境搭建
概述 在主从模式下,我们通过从节点只读模式提高了系统的并发能力并发不断增加,只需要扩展从节点即可,只要主从服务器之间,网络连接正常主服务器就会将写入自己的数据同步更新给从服务器,从而保证主从服务器的数据相同…...
C++ 语言特性30 - 模板介绍
目录 一:C11 之前的模板特性 1. 函数模板: 2. 类模板: 3. 模板特化: 4. 模板参数: 5. 模板元编程: 二:C11的模板特性 1. 变长模板(Variadic Templates)ÿ…...
算法笔记(七)——哈希表
文章目录 两数之和判定是否互为字符重排存在重复元素存在重复元素 II字母异位词分组 哈希表:一种存储数据的容器; 可以快速查找某个元素,时间复杂度O(1); 当频繁查找某一个数时,我们可以使用哈希表 创建一个容器&#…...
【基础算法总结】链表篇
目录 一, 链表常用技巧和操作总结二,算法原理和代码实现2.两数相加24.两两交换链表中的节点143.重排链表23.合并k个升序链表25.k个一组翻转链表 三,算法总结 一, 链表常用技巧和操作总结 有关链表的算法题也是一类常见并且经典的题…...
探索路由器静态IP的获取方式
在网络配置中,路由器静态IP是一个重要的概念。对于家庭网络或办公室网络而言,正确配置静态IP地址是确保网络稳定性和管理的关键步骤之一。但是,很多人对于静态IP地址的获取方式可能感到困惑。在本文中,我们将探讨它的获取途径&…...
钉钉H5应用PDF预览避坑指南:为什么iframe直接跳转下载页?
钉钉H5应用PDF预览技术解析:从安全策略到实战解决方案 每次在钉钉H5应用中尝试用iframe嵌套PDF时,那个突如其来的下载对话框总让人措手不及。这背后隐藏的不仅是技术限制,更是一场安全与用户体验的博弈。作为企业内部应用开发者,我…...
AI工具使用限制解决方案:突破设备识别与权限重置完全指南
AI工具使用限制解决方案:突破设备识别与权限重置完全指南 【免费下载链接】go-cursor-help 解决Cursor在免费订阅期间出现以下提示的问题: Youve reached your trial request limit. / Too many free trial accounts used on this machine. Please upgrade to pro. …...
BG3ModManager全攻略:从基础配置到故障解决的模组管理大师之路
BG3ModManager全攻略:从基础配置到故障解决的模组管理大师之路 【免费下载链接】BG3ModManager A mod manager for Baldurs Gate 3. 项目地址: https://gitcode.com/gh_mirrors/bg/BG3ModManager 一、基础配置:搭建你的模组管理中心 让游戏与工具…...
浮点数精度问题实战:如何用eps避免3.8的小数部分变成0.799999?
浮点数精度陷阱:从3.8的0.799999现象到工业级误差控制方案 当你在金融交易系统中发现0.01元的差额,或在游戏物理引擎中看到角色卡进墙壁,背后可能都是浮点数精度问题在作祟。最近团队在开发高频交易系统时,一个简单的价格计算3.8…...
Abp微服务之间的DTO不要使用object作为字段类型
这是一个典型的ABP vNext 微服务间接口定义和序列化问题,当类型定义为 object时,在不同服务之间传输会导致类型信息丢失。// 服务A public interface IMyServiceA : IApplicationService {Task<MyDto> GetDataAsync(); }public class MyDto {publi…...
python-flask-djangol框架的减肥健身养生人士饮食营养管理系统
目录 技术选型与框架搭建核心功能模块设计数据模型设计示例(Django ORM)算法实现要点部署与扩展 项目技术支持源码获取详细视频演示 :文章底部获取博主联系方式!同行可合作 技术选型与框架搭建 Python Flask/Django框架均适合开发…...
别再手动截图了!用这个FISH脚本把FLAC3D 6.0/7.0的应力云图一键导出到Tecplot
FLAC3D数据高效可视化:从应力云图到Tecplot的自动化转换方案 在岩土工程和地质力学领域,数值模拟已成为研究复杂地质现象不可或缺的工具。FLAC3D作为行业标准软件,其强大的计算能力常被用于解决各类岩土工程问题。然而,许多研究者…...
颠覆传统绘图:3个让技术文档颜值飙升的Mermaid技巧
颠覆传统绘图:3个让技术文档颜值飙升的Mermaid技巧 【免费下载链接】mermaid mermaid-js/mermaid: 是一个用于生成图表和流程图的 Markdown 渲染器,支持多种图表类型和丰富的样式。适合对 Markdown、图表和流程图以及想要使用 Markdown 绘制图表和流程图…...
解决IDEA/DataGrip连接SQL Server时的TLS协议兼容性问题
1. 为什么IDEA/DataGrip连不上SQL Server? 最近帮同事排查一个数据库连接问题,发现不少人在用IDEA或DataGrip连接SQL Server时都会遇到这个报错:"The server selected protocol version TLS10 is not accepted by client"。这个错误…...
绵羊行为检测数据集2276张VOC+YOLO格式
绵羊行为检测数据集2276张VOCYOLO格式数据集格式:Pascal VOC格式YOLO格式(不包含分割路径的txt文件,仅仅包含jpg图片以及对应的VOC格式xml文件和yolo格式txt文件) 图片数量(jpg文件个数):2276 标注数量(xml文件个数):2276 标注数量…...
