基于STM32的外部中断(EXTI)在嵌入式系统中的应用

外部中断(External Interrupt,EXTI)是STM32嵌入式系统中常见且重要的功能之一。它允许外部事件(例如按键按下、传感器触发等)通过适当的引脚触发中断,从而应用于各种嵌入式系统中。在STM32微控制器中,有多个GPIO引脚可用于外部中断,并且可以根据上升沿、下降沿或双边沿触发中断。

以下是一个基于STM32的外部中断在嵌入式系统中的应用概述,并提供了关键代码示例:

步骤1:GPIO 初始化和配置:

首先,需要初始化和配置相关引脚,以便将其用作外部中断触发器。这涉及到以下几个方面:
- 选择引脚:根据应用需求,选择适当的GPIO引脚,并进行相应的引脚初始化。
- 中断触发方式:确定中断的触发方式,可以选择上升沿、下降沿或双边沿触发。
- GPIO 初始化和配置:使用STM32提供的库函数进行GPIO初始化和配置。

以下是一个示例代码片段,展示如何初始化并配置GPIO引脚作为外部中断触发器:

```c
// 引脚选择和配置
GPIO_InitTypeDef GPIO_InitStruct;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
GPIO_InitStruct.GPIO_Mode = GPIO_Mode_IPU;
GPIO_InitStruct.GPIO_Pin = GPIO_Pin_0; // 选择引脚A0作为外部中断触发器
GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStruct);// 外部中断触发方式配置
EXTI_InitTypeDef EXTI_InitStruct;
GPIO_EXTILineConfig(GPIO_PortSourceGPIOA, GPIO_PinSource0); // 确定中断引脚和外部中断线的对应关系
EXTI_InitStruct.EXTI_Line = EXTI_Line0; // 使用外部中断线0
EXTI_InitStruct.EXTI_Mode = EXTI_Mode_Interrupt;
EXTI_InitStruct.EXTI_Trigger = EXTI_Trigger_Rising; // 选择上升沿触发,也可根据需求选择其他触发方式
EXTI_InitStruct.EXTI_LineCmd = ENABLE;
EXTI_Init(&EXTI_InitStruct);
```

步骤2:中断服务函数编写和处理逻辑:

接下来,需要编写中断服务函数(也称为IRQHandler)来处理外部中断触发事件。中断服务函数是在中断发生时自动调用的函数,我们可以在其中编写特定的处理逻辑。

以下是一个示例代码片段,展示如何编写中断服务函数以及处理外部中断事件的逻辑。

```c
void EXTI0_IRQHandler(void)
{if (EXTI_GetITStatus(EXTI_Line0) != RESET){// 处理外部中断事件,例如控制LED的状态// 此处仅为示例,假设GPIOB的位12作为LED引脚GPIO_ToggleBits(GPIOB, GPIO_Pin_12); // 切换LED的状态EXTI_ClearITPendingBit(EXTI_Line0); // 清除中断挂起标志位}
}
```

步骤3:中断优先级配置和使能:

最后,需要配置中断优先级以及使能中断。中断优先级的配置将决定中断的响应顺序和抢占优先级。

以下是一个示例代码片段,展示如何配置中断优先级和使能中断:

```c
NVIC_InitTypeDef NVIC_InitStruct;
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); // 选择优先级分组
NVIC_InitStruct.NVIC_IRQChannel = EXTI0_IRQn; // 使用外部中断线0
NVIC_InitStruct.NVIC_IRQChannelCmd = ENABLE; // 使能中断
NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority = 0x00; // 设置中断抢占优先级
NVIC_InitStruct.NVIC_IRQChannelSubPriority = 0x00; //设置中断响应优先级
NVIC_Init(&NVIC_InitStruct);
```

通过这些步骤,您可以实现基于STM32的外部中断在嵌入式系统中的应用。这个示例中,按下引脚PA0上的按键将触发中断服务函数,然后在LED引脚PB12上切换LED的状态。

总结:

在基于STM32的嵌入式系统中,外部中断(EXTI)是非常有用的功能,可以用于各种应用场景。通过适当的GPIO初始化、中断配置和中断服务函数编写,并结合中断优先级的配置和使能,您可以创建满足需求的外部中断应用程序。希望这个概述和代码示例能够帮助您更好地理解和应用基于STM32的外部中断。如果您有进一步的问题,请随时提问。

 嵌入式物联网的学习之路非常漫长,不少人因为学习路线不对或者学习内容不够专业而错失高薪offer。不过别担心,我为大家整理了一份150多G的学习资源,基本上涵盖了嵌入式物联网学习的所有内容。点击这里,0元领取学习资源,让你的学习之路更加顺畅!记得点赞、关注、收藏、转发哦。 

​ 点击链接扫码进入嵌入式交流群 ​https://fss.mpay8.cn/article/dmrjinh2C6fjejm

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/147371.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Vulkan渲染引擎开发教程 一、开发环境搭建

一 安装 Vulkan SDK Vulkan SDK 就是我们要搞的图形接口 首先到官网下载SDK并安装 https://vulkan.lunarg.com/sdk/home 二 安装 GLFW 窗口库 GLFW是个跨平台的小型窗口库,也就是显示窗口,图形的载体 去主页下载并安装,https://www.glfw.…

【自然语言处理(NLP)实战】LSTM网络实现中文文本情感分析(手把手与教学超详细)

目录 引言: 1.所有文件展示: 1.中文停用词数据(hit_stopwords.txt)来源于: 2.其中data数据集为chinese_text_cnn-master.zip提取出的文件。点击链接进入github,点击Code、Download ZIP即可下载。 2.安装依赖库&am…

Spring 事务和事务传播机制

一、再谈事务 到这里 JavaEE 的学习基本是已经接近了尾声,相信大家对事务已然有了一些理解。当然这里我们还是简单的说明一下: 事务就是将一组操作封装成一个执行单元,要么全部成功,要么全部失败。比较典型的应用场景是转账&…

Vite - 配置 - 文件路径别名的配置

为什么要配置别名 别名的配置,主要作用是为了缩短代码中的导入路径。例如有如下的项目目录: project-name| -- src| -- a| --b| --c| --d| --e| -- abc.png| -- index.html| -- main.js如果想在 main.js 文件中使用 abc.png ,则使用的路径是 &#xff1…

二元分类模型评估方法

文章目录 前言一、混淆矩阵二、准确率三、精确率&召回率四、F1分数五、ROC 曲线六、AUC(曲线下面积)七、P-R曲线类别不平衡问题中如何选择PR与ROC 八、 Python 实现代码混淆矩阵、命中率、覆盖率、F1值ROC曲线、AUC面积 指标 公式 意义 真正例 (TP)被…

DNS1(Bind软件)

名词解释 1、DNS(Domain Name System) DNS即域名系统,它是一个分层的分布式数据库,存储着IP地址与主机名的映射 2、域和域名 域为一个标签,而有多个标签域构成的称为域名。例如hostname.example.com,其…

gRPC 的原理 介绍带你从头了解gRPC

gRPC 的原理 什么是gRPC gRPC的官方介绍是:gRPC是一个现代的、高性能、开源的和语言无关的通用 RPC 框架,基于 HTTP2 协议设计,序列化使用PB(Protocol Buffer),PB 是一种语言无关的高性能序列化框架,基于 HTTP2PB 保…

Sentinel 流控规则

Sentinel 是面向分布式、多语言异构化服务架构的流量治理组件,主要以流量为切入点,从流量路由、流量控制、流量整形、熔断降级、系统自适应过载保护、热点流量防护等多个维度来帮助开发者保障微服务的稳定性。 SpringbootDubboNacos 集成 Sentinel&…

实用技巧:在C和cURL中设置代理服务器爬取www.ifeng.com视频

概述: 网络爬虫技术作为一种自动获取互联网数据的方法,在搜索引擎、数据分析、网站监测等领域发挥着重要作用。然而,面对反爬虫机制、网络阻塞、IP封禁等挑战,设置代理服务器成为解决方案之一。代理服务器能够隐藏爬虫的真实IP地…

Word中NoteExpress不显示的问题

首先确认我们以及安装了word插件 我们打开word却没有。此时我们打开:文件->选项->加载项 我们发现被禁用了 选择【禁用项目】(如果没有,试一试【缓慢且禁用的加载项】),点击转到 选择启用 如果没有禁用且没有出…

C++加持让python程序插上翅膀——利用pybind11进行c++和python联合编程示例

目录 0、前言1、安装 pybind11库c侧python侧 2、C引入bybind11vs增加相关依赖及设置cpp中添加头文件及导出模块cpp中添加numpy相关数据结构的接收和返回编译生成dll后改成导出模块同名文件的.pyd 3、python调用c4、C引入bybind11 0、前言 在当今的计算机视觉和机器学习领域&am…

CSDN每日一题学习训练——Python版(简化路径,不同的二叉搜索树)

版本说明 当前版本号[20231116]。 版本修改说明20231116初版 目录 文章目录 版本说明目录简化路径题目解题思路代码思路参考代码 不同的二叉搜索树题目解题思路代码思路参考代码 简化路径 题目 给你一个字符串 path ,表示指向某一文件或目录的 Unix 风格 绝对路…

Mysql数据库 16.SQL语言 数据库事务

一、数据库事务 数据库事务介绍——要么全部成功要么全部失败 我们把完成特定的业务的多个数据库DML操作步骤称之为一个事务 事务——就是完成同一个业务的多个DML操作 例: 数据库事务四大特性 原子性(A):一个事务中的多个D…

(三)什么是Vite——Vite 主体流程(运行npm run dev后发生了什么?)

vite分享ppt,感兴趣的可以下载: ​​​​​​​Vite分享、原理介绍ppt 什么是vite系列目录: (一)什么是Vite——vite介绍与使用-CSDN博客 (二)什么是Vite——Vite 和 Webpack 区别&#xff0…

vscode 配置 lua

https://luabinaries.sourceforge.net/ 官网链接 主要分为4个步骤 下载压缩包,然后解压配置系统环境变量配置vscode的插件测试 这里你可以选择用户变量或者系统环境变量都行。 不推荐空格的原因是 再配置插件的时候含空格的路径 会出错,原因是空格会断…

linux 网络 cat /proc/net/dev 查看测试网络丢包情况

可以通过 cat /proc/net/dev 查看测试网络丢包情况,drop关键字,查看所有网卡的丢包情况 还可以看其他数据, /proc/net/下面有如下文件

性能测试 —— Jmeter接口处理不低于200次/秒-场景

需求:期望某个接口系统的处理能力不低于200次/秒,如何设计? ①这个场景是看服务器对某个接口的TPS值是否能大于等于200,就可以了; ②系统处理能力:说的就是我们性能测试中的TPS; ③只要设计一…

Visual Studio Code---介绍

0 Preface/Foreword 1、安装VScode 官网:Download Visual Studio Code - Mac, Linux, Windows 文档:Documentation for Visual Studio Code 1.1 优点 Intelligent code completion: code smarter with intellisense - completions for variables, me…

哈希

欢迎来到Cefler的博客😁 🕌博客主页:那个传说中的man的主页 🏠个人专栏:题目解析 🌎推荐文章:题目大解析(3) 目录 👉🏻unordered系列关联式容器un…

锐捷练习-ospf虚链路及rip路由相互引入

一、相关知识补充 1、ospf基本概述 OSPF(Open Shortest Path First)是一种链路状态路由协议,用于在计算机网络中进行路由选择。它是内部网关协议(IGP)之一,常用于大规模企业网络或互联网服务提供商的网络…