当前位置: 首页 > news >正文

stm32——外部中断EXTI

        上回书说到定时器的级联,今天来谈谈外部中断EXTI。我使用的是STM32F103C8T6的学习板。仅供大家参考。

        什么是中断呢?中断是指计算机在执行程序的过程中,当出现某些异常情况或特殊事件(例如外部设备请求、定时时间到达、程序错误等)时,计算机暂停当前正在执行的程序,转而去处理这些异常情况或特殊事件的机制。也就是只要你触发了中断,只有等把中断的事件处理完了,才能去运行其他的程序。stm32的中断非常强大,每个外设都可以产生中断,这里呢,我就单纯的说说外部中断按键的方式如何去控制小灯的亮灭。也就是我们常说的独立按键怎么用。继续往下看。

        EXTI(External Interrupt/event controller) 是外部中断/事件控制器,管理了控制器的20个中断/事件线。每个中断/事件线都对应一个边沿检测器,可以实现输入信号的上升沿检测和下降沿的检测。EXTI可以实现对每个中断/事件线进行单独配置,可以单独配置为中断或者事件,以及触发事件的属性。

EXTI功能框图

        

中断/事件线

        EXTI一共有20个中断/事件线。每个GPIO口都可以被设置成输入线,占用EXTI0~EXTI15,也就是PX0,就对应着EXTI0,一一对应。

        我们先来看看程序,首先是开启外部中断的时候,我们需要用到两个时钟GPIOC端口(对应外部中断的端口)和AFIO端口(EXTI所需要的端口)。

void RCC_Configuration(void)
{/* 时钟开启 */RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC | RCC_APB2Periph_GPIOA | RCC_APB2Periph_AFIO, ENABLE);
}

        接下来,配置GPIO口,NVIC中断以及EXTI初始化。这里我使用的是GPIOC的line13作为它的外部中断,对应单片机上的KEY2按键,通过控制GPIOA上PIN3的LED3小灯来观测现象。

void GPIO_Configuration(void)
{GPIO_InitTypeDef GPIO_InitStructure;GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(GPIOA, &GPIO_InitStructure);GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(GPIOC, &GPIO_InitStructure);
}void EXIT_Configuration(void)
{EXTI_InitTypeDef EXTI_InitStructure;GPIO_EXTILineConfig(GPIO_PortSourceGPIOC, GPIO_PinSource13);EXTI_InitStructure.EXTI_Line = EXTI_Line13;EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling;EXTI_InitStructure.EXTI_LineCmd = ENABLE;EXTI_Init(&EXTI_InitStructure);
}void NVIC_Configuration(void)
{								NVIC_InitTypeDef NVIC_InitStructure;#ifdef  VECT_TAB_RAM  NVIC_SetVectorTable(NVIC_VectTab_RAM , 0x0); 
#else 	NVIC_SetVectorTable(NVIC_VectTab_FLASH , 0x0);   
#endifNVIC_PriorityGroupConfig(NVIC_PriorityGroup_0);NVIC_InitStructure.NVIC_IRQChannel = EXTI15_10_IRQn;NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;NVIC_Init(&NVIC_InitStructure);
}

        配置是配置完了接下来就是中断函数。大家可以打开自己的启动文件,来看看对应中断函数的命名,0到4是每个都有自身的一个中断函数。5~9是共用中断EXTI9_5_IRQHandler(),10~15是共用一个中断函数EXTI15_10_IRQHandler。因为我用的是GPIOC的13引脚,我使用的中断就是EXTI15_10_IRQHandler。这里要注意使用对应的GPIO口要用上GPIO_EXTILineConfig(GPIO_PortSourceGPIOC, GPIO_PinSource13);这个语句。否则无法看到对应的现象。接下来是中断程序。

void EXTI15_10_IRQHandler(void)
{if(EXTI_GetITStatus(EXTI_Line13) != RESET) {GPIO_WriteBit(GPIOA, GPIO_Pin_3,(BitAction)((1-GPIO_ReadOutputDataBit(GPIOA,GPIO_Pin_3))));EXTI_ClearITPendingBit(EXTI_Line13); }}

        大家看看现象吧,应该是D3受到KEY2按键的控制。使灯发生亮灭的操作。

        谈到中断,这里就要考虑到中断优先级的问题,有两个优先级的概念,分别是抢占式优先级和响应优先级,每个中断源都需要被指定这两种优先级。具有高抢占式优先级的中断可以在具有低抢占式优先级的中断处理过程中被响应,即中断嵌套,或者说高抢占式优先级的中断可以嵌套低抢占式优先级的中断。当两个中断源的抢占式优先级相同时,这两个中断将没有嵌套关系。当一个中断到来后,如果正在处理另一个中断,这个后到来的中断就要等到前一个中断处理完之后才能被处理。如果这两个中断同时到达,则中断控制器根据它们的响应优先级高低来决定先处理哪一个;如果它们的抢占式优先级和响应优先级都相等,则根据它们在中断表中的排位顺序决定先处理哪一个。优先级是从0开始是最高的优先级,优先级越大越低。大家可以结合串口通信,设置EXTI0、EXTI1、EXTI2这三个外部中断来看看。

        这里就不过多说了给个简单的代码,中断配置和中断函数。请看代码。

void NVIC_Configuration(void)
{NVIC_InitTypeDef NVIC_InitStructure;// 如果定义了 VECT_TAB_RAM 宏#ifdef  VECT_TAB_RAM  // 将中断向量表设置为位于 RAM 中,并设置偏移量为 0NVIC_SetVectorTable(NVIC_VectTab_RAM, 0x0); // 否则#else  // 将中断向量表设置为位于 FLASH 中,并设置偏移量为 0NVIC_SetVectorTable(NVIC_VectTab_FLASH, 0x0);   #endif// 设置中断优先级分组为 2NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);// 配置 EXTI0 中断NVIC_InitStructure.NVIC_IRQChannel = EXTI0_IRQn;// 设置抢占优先级为 2NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 2;// 设置响应优先级为 0NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;// 使能该中断通道NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;// 初始化 EXTI0 中断NVIC_Init(&NVIC_InitStructure);// 配置 EXTI1 中断NVIC_InitStructure.NVIC_IRQChannel = EXTI1_IRQn;// 设置抢占优先级为 1NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;// 设置响应优先级为 0NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;// 使能该中断通道NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;// 初始化 EXTI1 中断NVIC_Init(&NVIC_InitStructure);// 配置 EXTI2 中断NVIC_InitStructure.NVIC_IRQChannel = EXTI2_IRQn;// 设置抢占优先级为 0NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;// 设置响应优先级为 0NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;// 使能该中断通道NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;// 初始化 EXTI2 中断NVIC_Init(&NVIC_InitStructure);
}

        中断函数

/*******************************************************************************
* Function Name  : EXTI0_IRQHandler
* Description    : This function handles External interrupt Line 0 request.
* Input          : None
* Output         : None
* Return         : None
*******************************************************************************/
void EXTI0_IRQHandler(void)
{printf("\r\nEXIT0 IRQHandler enter.\r\n");EXTI_GenerateSWInterrupt(EXTI_Line1);printf("\r\nEXIT0 IRQHandler return.\r\n");EXTI_ClearFlag(EXTI_Line0);
}/*******************************************************************************
* Function Name  : EXTI1_IRQHandler
* Description    : This function handles External interrupt Line 1 request.
* Input          : None
* Output         : None
* Return         : None
*******************************************************************************/
void EXTI1_IRQHandler(void)
{printf("\r\nEXIT1 IRQHandler enter.\r\n");EXTI_GenerateSWInterrupt(EXTI_Line2);printf("\r\nEXIT1 IRQHandler return.\r\n");EXTI_ClearFlag(EXTI_Line1);
}/*******************************************************************************
* Function Name  : EXTI2_IRQHandler
* Description    : This function handles External interrupt Line 2 request.
* Input          : None
* Output         : None
* Return         : None
*******************************************************************************/
void EXTI2_IRQHandler(void)
{printf("\r\nEXIT2 IRQHandler enter.\r\n");printf("\r\nEXIT2 IRQHandler return.\r\n");EXTI_ClearFlag(EXTI_Line2);
}

        好了,今天就说这么多。

        欲知后事如何,且听下回分解。OVO......

相关文章:

stm32——外部中断EXTI

上回书说到定时器的级联,今天来谈谈外部中断EXTI。我使用的是STM32F103C8T6的学习板。仅供大家参考。 什么是中断呢?中断是指计算机在执行程序的过程中,当出现某些异常情况或特殊事件(例如外部设备请求、定时时间到达、程序错误等…...

Solidity:变量数据存储和作用域 storage/memory/calldata

Solidity中的引用类型​ 引用类型(Reference Type):包括数组(array)和结构体(struct),由于这类变量比较复杂,占用存储空间大,我们在使用时必须要声明数据存储的位置。 数据位置​ …...

ElementUI中的el-table解决宽度问题 - 根据内容自动撑开

在使用element-ui中,会发现表格组件el-table在未指定宽度情况下,会自动计算并给表格宽度赋值。但实际开发中,有时需要根据内容实际长度自动撑开显示,由内容的多少而决定表格的宽度,而不是默认宽度为100%。在默认情况下…...

react apollo hooks

1、创建ApolloProvider来包装整个程序 <ApolloProvider client{client}><App /> <ApolloProvider> 2、useQuery查询 工作方式usequery将返回一个数组 const {要返回的对象} useQuery(传入参数) 实例 const query gqlquery name {whatever {field}} e…...

Android 10.0 SystemUI启动流程

1、手机开机后&#xff0c;Android系统首先会创建一个Zygote&#xff08;核心进程&#xff09;。 2、由Zygote启动SystemServer。 3、SystemServer会启动系统运行所需的众多核心服务和普通服务、以及一些应用及数据。例如&#xff1a;SystemUI 启动就是从 SystemServer 里启动的…...

洛谷 P1032 [NOIP2002 提高组] 字串变换

P1032 [NOIP2002 提高组] 字串变换 - 洛谷 | 计算机科学教育新生态 题目来源 洛谷 题目内容 [NOIP2002 提高组] 字串变换 题目背景 本题不保证存在靠谱的多项式复杂度的做法。测试数据非常的水&#xff0c;各种做法都可以通过&#xff0c;不代表算法正确。因此本题题目和…...

网络资源模板--Android Studio 外卖点餐App

目录 一、项目演示 二、项目测试环境 三、项目详情 四、完整的项目源码 原创外卖点餐&#xff1a;基于Android studio 实现外卖(点)订餐系统 非原创奶茶点餐&#xff1a;网络资源模板--基于 Android Studio 实现的奶茶点餐App报告 一、项目演示 网络资源模板--基于Android …...

【Linux】网络新手村

欢迎来到 破晓的历程的 博客 ⛺️不负时光&#xff0c;不负己✈️ 引言 今天&#xff0c;我们就开始学习Linux网络相关的内容。这篇博客作为Linux网络板块的第一篇博客看&#xff0c;我们首先要带着大家明白Linux网络的一些名词的概念&#xff0c;为之后的学习扫清障碍。然后我…...

123123

123123...

在pycharm中使用jupyter

在pycharm中使用jupyter 前置条件&#xff1a;你的环境中应该有juptyer &#xff0c;没有的话 pip install jupyter 点击项目目录&#xff0c;右键->new->jupyter notebook 打开file settings 找到 jupyter server &#xff08;按照默认的用代理服务器就行&#xff09; P…...

MongoDB:掌握核心常用命令语句,精通数据操作

标题:MongoDB:掌握核心命令,精通数据操作 前言: MongoDB 是一种非关系型数据库,以文档为中心,使用 JSON 格式的 BSON 来存储数据。它具有高可用性、高性能和易于扩展的特点,被广泛应用于各种规模的项目中。本文将详细介绍 MongoDB 的常用命令,帮助你更好地理解和掌握…...

Redis中测试Stream的例子

当你想要测试 Redis 中的 Stream 功能时&#xff0c;可以通过 Redis 的命令行客户端或者使用任何支持 Redis 的编程语言来操作。下面我会给出一个简单的例子&#xff0c;使用 Redis 的命令行客户端 redis-cli 来测试 Stream 的基本功能。 准备工作 确保你已经安装并启动了 Re…...

28 H3C SecPath F1000 概览(主要功能是总 观看全局)

28 H3C SecPath F1000 概览(主要功能是总 观看全局) 特性简介 概览页面通过清晰的图形化模块清晰展示了设备关键数据信息及各类状态&#xff0c;并支持灵活排版布局&#xff0c;以便实时查看用户关心的数据。预定义监控默认展示了设备基础信息模块&#xff0c;也可以手动添加其…...

标准版视频检测终端功能有哪些? 捷顺高清视频车位引导系统怎么样?

随着城市化进程的加速&#xff0c;城市交通压力日益增大&#xff0c;停车难问题成为了许多城市居民的共同困扰。在这样的背景下&#xff0c;车位引导系统的出现&#xff0c;无疑为解决这一难题提供了一种有效的解决方案。车位引导系统利用先进的信息技术&#xff0c;通过实时监…...

说明本文档目录是软件开发梳理需求常见问题QA文档,方便客户看,也方便我们的售前人员,需求分析人员,ui设计师,原型绘图人员,思维导图绘图人员查看。

https://doc.youyacao.com/117/2150 说明 本文档目录是软件开发梳理需求常见问题QA文档&#xff0c;方便客户看&#xff0c;也方便我们的售前人员&#xff0c;需求分析人员&#xff0c;ui设计师&#xff0c;原型绘图人员&#xff0c;思维导图绘图人员查看。 提示 本内容客户…...

Echarts桑基图

关于Echarts的使用方法参考&#xff1a;vue2中echarts的使用_vue2中使用echarts-CSDN博客 实现效果&#xff1a; 代码&#xff1a; var sysT {"用采": #2D9BFF,"营销系统": #39BFFF,"ERP": #76C2FF,"财务管控": #5F57FC,"PMS&…...

wordpress网站添加一个临时维护功能

把以下代码放到functions.php文件中&#xff0c;主要用网站临时维护或者用于备案。事情做好了&#xff0c;把以下代码删除即可&#xff01;&#xff01;&#xff01; 有时遇到一些情况&#xff0c;比如站点需要闭站备案、或者被要求停站等等&#xff0c;我们就可以使用本文的功…...

充电桩开源平台,开发流程有图有工具

慧哥充电桩开源平台产品研发流程是确保产品从概念阶段到市场推广阶段的有序进行的关键。以下是对您给出的步骤的详细解释和建议&#xff1a; 设计业务流程: 在这一步&#xff0c;团队需要确定产品的核心功能、目标用户以及如何满足用户需求。进行市场调研&#xff0c;了解竞争…...

数据中台设计书及建设指南(中台及大数据解决技术方案)

1. 中台概念 2. 推动企业组织模式演进 3. 建设方法 4 .中台内容 5. 数据安全体系 中台内容围绕数据中台建设评估、整体框架、数据采集&#xff0c;结构化、半结构化、非结构化的数据采集&#xff0c;数据计算能力、存储计算引擎、数据架构、数据挖掘、各种不同数据层建设、模型…...

合合信息大模型“加速器”重磅上线

大模型技术的发展和应用&#xff0c;预示着更加智能化、个性化未来的到来。如果将大模型比喻为正在疾驰的科技列车&#xff0c;语料便是珍贵的“燃料”。本次世界人工智能大会期间&#xff0c;合合信息为大模型打造的“加速器”解决方案备受关注。 在大模型训练的上游阶段&…...

RestClient

什么是RestClient RestClient 是 Elasticsearch 官方提供的 Java 低级 REST 客户端&#xff0c;它允许HTTP与Elasticsearch 集群通信&#xff0c;而无需处理 JSON 序列化/反序列化等底层细节。它是 Elasticsearch Java API 客户端的基础。 RestClient 主要特点 轻量级&#xff…...

利用最小二乘法找圆心和半径

#include <iostream> #include <vector> #include <cmath> #include <Eigen/Dense> // 需安装Eigen库用于矩阵运算 // 定义点结构 struct Point { double x, y; Point(double x_, double y_) : x(x_), y(y_) {} }; // 最小二乘法求圆心和半径 …...

JavaSec-RCE

简介 RCE(Remote Code Execution)&#xff0c;可以分为:命令注入(Command Injection)、代码注入(Code Injection) 代码注入 1.漏洞场景&#xff1a;Groovy代码注入 Groovy是一种基于JVM的动态语言&#xff0c;语法简洁&#xff0c;支持闭包、动态类型和Java互操作性&#xff0c…...

springboot 百货中心供应链管理系统小程序

一、前言 随着我国经济迅速发展&#xff0c;人们对手机的需求越来越大&#xff0c;各种手机软件也都在被广泛应用&#xff0c;但是对于手机进行数据信息管理&#xff0c;对于手机的各种软件也是备受用户的喜爱&#xff0c;百货中心供应链管理系统被用户普遍使用&#xff0c;为方…...

STM32+rt-thread判断是否联网

一、根据NETDEV_FLAG_INTERNET_UP位判断 static bool is_conncected(void) {struct netdev *dev RT_NULL;dev netdev_get_first_by_flags(NETDEV_FLAG_INTERNET_UP);if (dev RT_NULL){printf("wait netdev internet up...");return false;}else{printf("loc…...

CMake基础:构建流程详解

目录 1.CMake构建过程的基本流程 2.CMake构建的具体步骤 2.1.创建构建目录 2.2.使用 CMake 生成构建文件 2.3.编译和构建 2.4.清理构建文件 2.5.重新配置和构建 3.跨平台构建示例 4.工具链与交叉编译 5.CMake构建后的项目结构解析 5.1.CMake构建后的目录结构 5.2.构…...

[ICLR 2022]How Much Can CLIP Benefit Vision-and-Language Tasks?

论文网址&#xff1a;pdf 英文是纯手打的&#xff01;论文原文的summarizing and paraphrasing。可能会出现难以避免的拼写错误和语法错误&#xff0c;若有发现欢迎评论指正&#xff01;文章偏向于笔记&#xff0c;谨慎食用 目录 1. 心得 2. 论文逐段精读 2.1. Abstract 2…...

华为OD机试-食堂供餐-二分法

import java.util.Arrays; import java.util.Scanner;public class DemoTest3 {public static void main(String[] args) {Scanner in new Scanner(System.in);// 注意 hasNext 和 hasNextLine 的区别while (in.hasNextLine()) { // 注意 while 处理多个 caseint a in.nextIn…...

Java入门学习详细版(一)

大家好&#xff0c;Java 学习是一个系统学习的过程&#xff0c;核心原则就是“理论 实践 坚持”&#xff0c;并且需循序渐进&#xff0c;不可过于着急&#xff0c;本篇文章推出的这份详细入门学习资料将带大家从零基础开始&#xff0c;逐步掌握 Java 的核心概念和编程技能。 …...

让AI看见世界:MCP协议与服务器的工作原理

让AI看见世界&#xff1a;MCP协议与服务器的工作原理 MCP&#xff08;Model Context Protocol&#xff09;是一种创新的通信协议&#xff0c;旨在让大型语言模型能够安全、高效地与外部资源进行交互。在AI技术快速发展的今天&#xff0c;MCP正成为连接AI与现实世界的重要桥梁。…...