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

初学stm32 --- 外部中断

目录

STM32 IO 口中断基础知识

相关库函数:

使用 IO 口外部中断的一般步骤


STM32 IO 口中断基础知识

        STM32 的每个 IO 都可以作为外部中断的中断输入口。STM32F103 的中断控制器支持 19 个外部中断/事件请求。每个中断设有状态位,每个中断/事件都有独立的触发和屏蔽设置。 STM32F103 的19 个外部中断为:

  • 线 0~15:对应外部 IO 口的输入中断。
  • 线 16:连接到 PVD 输出。
  • 线 17:连接到 RTC 闹钟事件。
  • 线 18:连接到 USB 唤醒事件。

        从上面可以看出, STM32 供 IO 口使用的中断线只有 16 个,但是 STM32 的 IO 口却远远不止 16 个,那么 STM32 是怎么把 16 个中断线和 IO 口一一对应起来的呢? 于是 STM32 就这样设计, GPIO 的管脚 GPIOx.0~GPIOx.15(x=A,B,C,D,E, F,G)分别对应中断线 0~15。这样每个中断线对应了最多 7 个 IO 口,以线 0 为例:它对应了 GPIOA.0、 GPIOB.0、 GPIOC.0、 GPIOD.0、GPIOE.0、 GPIOF.0、 GPIOG.0。而中断线每次只能连接到 1 个 IO 口上,这样就需要通过配置来决定对应的中断线配置到哪个 GPIO 上了。 下面我们看看 GPIO 跟中断线的映射关系图:

图1 GPIO 和中断线的映射关系图

相关库函数:

在库函数中,配置 GPIO 与中断线的映射关系的函数 GPIO_EXTILineConfig()来实现的:

void GPIO_EXTILineConfig(uint8_t GPIO_PortSource, uint8_t GPIO_PinSource)

该函数将 GPIO 端口与中断线映射起来,使用范例是:

GPIO_EXTILineConfig(GPIO_PortSourceGPIOE,GPIO_PinSource2);

        将中断线 2 与 GPIOE 映射起来,那么很显然是 GPIOE.2 与 EXTI2 中断线连接了。 设置好中断线映射之后, 那么到底来自这个 IO 口的中断是通过什么方式触发的呢? 接下来我们就要设置该中断线上中断的初始化参数了。
        中断线上中断的初始化是通过函数 EXTI_Init()实现的。 EXTI_Init()函数的定义是:

void EXTI_Init(EXTI_InitTypeDef* EXTI_InitStruct);

下面我们用一个使用范例来说明这个函数的使用:

EXTI_InitTypeDef EXTI_InitStructure;
EXTI_InitStructure.EXTI_Line=EXTI_Line4;
EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;
EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling;
EXTI_InitStructure.EXTI_LineCmd = ENABLE;
EXTI_Init(&EXTI_InitStructure); //根据 EXTI_InitStruct 中指定的参数初始化外设 EXTI 寄存器

        上面的例子设置中断线 4 上的中断为下降沿触发。 STM32 的外设的初始化都是通过结构体来设置初始值的。我们来看看结构体 EXTI_InitTypeDef 的成员变量:

typedef struct
{uint32_t EXTI_Line;EXTIMode_TypeDef EXTI_Mode;EXTITrigger_TypeDef EXTI_Trigger;FunctionalState EXTI_LineCmd;
}EXTI_InitTypeDef;

        从定义可以看出,有 4 个参数需要设置。 第一个参数是中断线的标号,取值范围为EXTI_Line0~EXTI_Line15。这个在上面已经讲过中断线的概念。 也就是说,这个函数配置的是某个中断线上的中断参数。 第二个参数是中断模式, 可选值为中断 EXTI_Mode_Interrupt 和事件 EXTI_Mode_Event。第三个参数是触发方式,可以是下降沿触发 EXTI_Trigger_Falling上升沿触发 EXTI_Trigger_Rising,或者任意电平(上升沿和下降沿) 触发EXTI_Trigger_Rising_Falling。 最后一个参数就是使能中断线了。
        我们设置好中断线和 GPIO 映射关系,然后又设置好了中断的触发模式等初始化参数。 既然是外部中断, 涉及到中断我们当然还要设置 NVIC 中断优先级。

NVIC_InitTypeDef NVIC_InitStructure;
NVIC_InitStructure.NVIC_IRQChannel = EXTI2_IRQn; //使能按键外部中断通道
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x02; //抢占优先级 2,
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x02; //子优先级 2
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //使能外部中断通道
NVIC_Init(&NVIC_InitStructure); //中断优先级分组初始

        我们配置完中断优先级之后,接着我们要做的就是编写中断服务函数。中断服务函数的名字是在 MDK 中事先有定义的。 这里需要说明一下, STM32 的 IO 口外部中断函数只有 6 个,分别为:

EXPORT EXTI0_IRQHandler
EXPORT EXTI1_IRQHandler
EXPORT EXTI2_IRQHandler
EXPORT EXTI3_IRQHandler
EXPORT EXTI4_IRQHandler
EXPORT EXTI9_5_IRQHandler
EXPORT EXTI15_10_IRQHandler

        中断线 0-4 每个中断线对应一个中断函数, 中断线 5-9 共用中断函数 EXTI9_5_IRQHandler,中断线 10-15 共用中断函数 EXTI15_10_IRQHandler。 在编写中断服务函数的时候会经常使用到两个函数, 第一个函数是判断某个中断线上的中断是否发生(标志位是否置位):

ITStatus EXTI_GetITStatus(uint32_t EXTI_Line);

        这个函数一般使用在中断服务函数的开头判断中断是否发生。 另一个函数是清除某个中断线上的中断标志位:

void EXTI_ClearITPendingBit(uint32_t EXTI_Line);

        这个函数一般应用在中断服务函数结束之前, 清除中断标志位。
常用的中断服务函数格式为:

void EXTI3_IRQHandler(void)
{if(EXTI_GetITStatus(EXTI_Line3)!=RESET)//判断某个线上的中断是否发生{//中断逻辑…EXTI_ClearITPendingBit(EXTI_Line3); //清除 LINE 上的中断标志位}
}

        在这里需要说明一下,固件库还提供了两个函数用来判断外部中断状态以及清除外部状态标志位的函数 EXTI_GetFlagStatus 和 EXTI_ClearFlag,他们的作用和前面两个函数的作用类似。只是在 EXTI_GetITStatus 函数中会先判断这种中断是否使能,使能了才去判断中断标志位,而EXTI_GetFlagStatus 直接用来判断状态标志位。

使用 IO 口外部中断的一般步骤

        1)初始化 IO 口为输入。

        2)开启 AFIO 时钟

        3)设置 IO 口与中断线的映射关系。

        4)初始化线上中断,设置触发条件等。

        5)配置中断分组(NVIC),并使能中断。

        6)编写中断服务函数。中断服务函数结束之前, 要主动清除中断标志位。

通过以上几个步骤的设置,我们就可以正常使用外部中断了。





         

相关文章:

初学stm32 --- 外部中断

目录 STM32 IO 口中断基础知识 相关库函数: 使用 IO 口外部中断的一般步骤 STM32 IO 口中断基础知识 STM32 的每个 IO 都可以作为外部中断的中断输入口。STM32F103 的中断控制器支持 19 个外部中断/事件请求。每个中断设有状态位,每个中断/事件都有独立…...

wordpress调用指定分类ID下 相同标签的内容

要在WordPress中调用分类ID为1、3、7的分类下,具有相同标签的前10个内容,可以使用自定义的WordPress查询(WP_Query)。以下是实现此功能的步骤和示例代码: 步骤: 确定共同标签: 首先,你需要确定分类1、3、…...

SQL语法基础知识总结

一、引言 在当今数字化时代,数据的存储和管理至关重要。SQL(Structured Query Language),即结构化查询语言,是用于管理关系型数据库的强大工具。无论是开发 Web 应用、进行数据分析还是处理企业级数据,掌握…...

css 实现呼吸灯效果

先看效果&#xff1a; 动画的结果就想实在呼吸,完整的代码如下&#xff1a; <template><div class"container"><div class"long-breath"></div></div> </template><style lang"less"> html, body{h…...

IMX6ULL开发板如何关掉自带的QT的GUI界面和poky的界面的方法

重要说明&#xff1a;其实最后发现根本没必要去关掉自带的QT的GUI界面&#xff0c;直接把屏幕先刷黑就可以看到测试效果了&#xff0c;把屏蔽先刷黑的代码见博文&#xff1a; https://blog.csdn.net/wenhao_ir/article/details/144594705 不过&#xff0c;既然花了时间摸索如何…...

几种广泛使用的 C++ 编译器

C 编译器有很多种&#xff0c;它们在不同的操作系统和开发环境中提供服务。以下是几种广泛使用的 C 编译器&#xff1a; 1. GCC (GNU Compiler Collection) 平台&#xff1a;跨平台&#xff08;Linux, macOS, Windows&#xff09;特点&#xff1a;GCC 是一个自由软件编译器套…...

《Vue进阶教程》第十六课:深入完善响应式系统之单例模式

往期内容&#xff1a; 《Vue进阶教程》第五课&#xff1a;ref()函数详解(重点) 《Vue进阶教程》第六课&#xff1a;computed()函数详解(上) 《Vue进阶教程》第七课&#xff1a;computed()函数详解(下) 《Vue进阶教程》第八课&#xff1a;watch()函数的基本使用 《Vue进阶教…...

C语言版解法力扣题:将整数按权重排序

1.题目描述 我们将整数 x 的 权重 定义为按照下述规则将 x 变成 1 所需要的步数&#xff1a; 如果 x 是偶数&#xff0c;那么 x x / 2 如果 x 是奇数&#xff0c;那么 x 3 * x 1 比方说&#xff0c;x3 的权重为 7 。因为 3 需要 7 步变成 1 &#xff08;3 --> 10 -->…...

Unity ECS和OOP优劣对比

OOP的优劣 面向对象编程&#xff08;OOP, Object-Oriented Programming&#xff09;是一种通过对象及其交互来组织代码的编程范式&#xff0c;广泛应用于软件开发中。以下是OOP的优缺点&#xff1a; 优点 代码可重用性 继承机制&#xff1a;通过继承&#xff0c;子类可以复用…...

【Java基础面试题026】Java中的String、StringBuffer和StringBuilder的区别是什么?

回答重点 他们都是Java中处理字符串的类&#xff0c;区别主要体现在可变性、线程安全和性能上 1&#xff09;String 不可变&#xff1a;String是不可变类&#xff0c;字符串对象创建&#xff0c;存储在堆中&#xff0c;字符串内容存储在字符串常量池中&#xff0c;一旦创建内…...

解析在OceanBase创建分区的常见问题|OceanBase 用户问题精粹

在《分区策略和管理分区计划的实践方案》这篇文章中&#xff0c;我们介绍了在ODC中制定分区策略及有效管理分区计划的经验。有不少用户在该帖下提出了使用中的问题&#xff0c;其中一个关于创建分区的限制条件的问题&#xff0c;也是很多用户遭遇的老问题。因此本文以其为切入&…...

Flutter组件————Container

Container Container 是 Flutter 中最常用的布局组件之一 参数 参数名称类型描述alignmentAlignmentGeometry定义子组件在其内部的对齐方式&#xff0c;默认为 null&#xff0c;即不改变子组件的位置。paddingEdgeInsetsGeometry内边距&#xff0c;用于在子组件周围添加空间…...

Java重要面试名词整理(二):SpringMyBatis

文章目录 Spring篇Spring核心推断构造方法AOP动态代理Advice的分类Advisor的理解AOP相关的概念 定义BeanASM技术JFR依赖注入循环依赖LifecycleSpring AOT Spring事务Spring事务传播机制Spring事务传播机制是如何实现的呢?Spring事务传播机制分类 SpringMVCHandlerHandlerMappi…...

Excel生成DBC脚本源文件

Excel制作 新建一个Excel&#xff0c;后缀为“.xls” 工作本名称改为“CAN_Matrix” 在首行按照列来起名字&#xff0c;在里面只需要填写必须的内容即可。 列数名称第0列Message Name第1列Message Format第2列Message ID第3列Message Length (byte)第4列Message Transmitte…...

Git进阶:本地或远程仓库如何回滚到之前的某个commit

在Git的使用过程中&#xff0c;我们经常会遇到需要回滚到之前某个commit的情况。无论是为了修复错误、撤销更改&#xff0c;还是为了重新组织代码&#xff0c;回滚到特定commit都是一个非常有用的技能。本文将介绍几种常用的回滚方法&#xff0c;帮助读者更好地掌握Git版本控制…...

linux 中文输入法设置的宏观思路 (****)

乱是永远的不乱,变是永远的不变。 $ ibus help # 注意:help 前没有杠符号 $ setxkbmap -help # 注意:help 前只有一个杠符号 $ localectl --help # 注意:help 前有 2 个杠符号 $ man im-config # 注意:-h, --help 只出来提示信息:请参考。。。。。。。 $ man abc…...

271-基于XC7V690T的12路光纤PCIe接口卡

一、板卡概述 基于XC7V690T的12路光纤PCI-E接口卡&#xff0c;用于实现多通道高速光纤数据接收和发送&#xff0c;板卡兼容PCIe 2.0和PCIe 3.0规范&#xff0c;利用PCI-E Switch PEX 8748实现FPGA芯片与计算机的通信&#xff0c;计算机与板卡接口处提供PCI-e 16速接口&#xff…...

Semaphore UI安装和实践

本次实验环境采用centos7.9操作系统&#xff0c;使用rpm包安装方式。 1.配置yum源 --下载centos华为云镜像仓库 wget -O /etc/yum.repos.d/CentOS-Base.repo https://mirrors.huaweicloud.com/repository/conf/CentOS-7-anon.repo[rootlocalhost ~]# wget -O /etc/yum.repos.…...

Redis篇--常见问题篇7--缓存一致性2(分布式事务框架Seata)

1、概述 在传统的单体应用中&#xff0c;事务管理相对简单&#xff0c;通常使用数据库的本地事务&#xff08;如MySQL的BEGIN和COMMIT&#xff09;来保证数据的一致性。然而&#xff0c;在微服务架构中&#xff0c;由于每个服务都有自己的数据库&#xff0c;跨服务的事务管理变…...

Docker Compose 安装 Harbor

我使用的系统是rocky Linux 9 1. 准备环境 确保你的系统已经安装了以下工具&#xff1a; DockerDocker ComposeOpenSSL&#xff08;用于生成证书&#xff09;#如果不需要通过https连接的可以不设置 1.1 安装 Docker 如果尚未安装 Docker&#xff0c;可以参考以下命令安装&…...

3分钟,零代码!让Arduino看懂你的手势——Teachable Machine硬件魔法揭秘

3分钟&#xff0c;零代码&#xff01;让Arduino看懂你的手势——Teachable Machine硬件魔法揭秘 【免费下载链接】teachablemachine-community Example code snippets and machine learning code for Teachable Machine 项目地址: https://gitcode.com/gh_mirrors/te/teachab…...

ROS2编译踩坑记:从‘--symlink-install’到CMake参数传递的避坑指南

ROS2编译实战避坑指南&#xff1a;从符号链接到参数传递的深度解析 第一次接触ROS2的编译系统时&#xff0c;那种既熟悉又陌生的感觉让我记忆犹新。作为从ROS1迁移过来的开发者&#xff0c;本以为colcon不过是catkin的简单升级&#xff0c;直到在项目构建过程中踩了无数坑之后…...

Serge模型管理终极指南:如何快速下载、配置和优化AI模型

Serge模型管理终极指南&#xff1a;如何快速下载、配置和优化AI模型 【免费下载链接】serge A web interface for chatting with Alpaca through llama.cpp. Fully dockerized, with an easy to use API. 项目地址: https://gitcode.com/gh_mirrors/se/serge Serge是一个…...

ReactPy虚拟DOM终极指南:Python如何高效更新网页内容

ReactPy虚拟DOM终极指南&#xff1a;Python如何高效更新网页内容 【免费下载链接】reactpy Its React, but in Python 项目地址: https://gitcode.com/gh_mirrors/re/reactpy ReactPy作为Python领域的创新框架&#xff0c;让开发者能够使用Python语法构建交互式Web界面&…...

NanoPC-T6开发板实战:手把手教你制作并烧录RK3588的Recovery镜像(含完整分区解析)

NanoPC-T6开发板实战&#xff1a;手把手教你制作并烧录RK3588的Recovery镜像&#xff08;含完整分区解析&#xff09; 在嵌入式开发领域&#xff0c;能够独立制作和烧录Recovery镜像是一项至关重要的技能。对于使用NanoPC-T6开发板和RK3588芯片的开发者来说&#xff0c;掌握这一…...

语音识别模型Conformer实战:如何用夹心饼干结构提升ASR效果

Conformer模型实战&#xff1a;用"夹心饼干"架构打造工业级语音识别系统 语音识别技术正在经历从传统DNN-HMM到端到端深度学习的范式转移&#xff0c;而Conformer凭借其创新的"CNNTransformer"混合架构&#xff0c;正在成为新一代ASR系统的标配。这种被开发…...

革命性LLM优化代理OptiLLM:零训练实现2-10倍推理性能提升

革命性LLM优化代理OptiLLM&#xff1a;零训练实现2-10倍推理性能提升 【免费下载链接】optillm Optimizing inference proxy for LLMs 项目地址: https://gitcode.com/gh_mirrors/op/optillm OptiLLM是一款强大的LLM优化代理工具&#xff0c;能够在不进行任何模型训练的…...

探索Beyond All Reason:重新定义开源实时战略游戏体验

探索Beyond All Reason&#xff1a;重新定义开源实时战略游戏体验 【免费下载链接】Beyond-All-Reason www.beyondallreason.info 项目地址: https://gitcode.com/gh_mirrors/be/Beyond-All-Reason Beyond All Reason是一款基于Spring引擎开发的开源实时战略&#xff08…...

别再傻傻分不清!一文讲透华为设备CRU与FRU区别及SmartKit工具的正确打开方式

华为设备维护进阶指南&#xff1a;CRU与FRU的深度解析及SmartKit高效应用 在数据中心运维和IT设备管理领域&#xff0c;华为设备的可靠性和性能一直备受认可。然而&#xff0c;即便是经验丰富的运维团队&#xff0c;在面对设备部件更换决策时&#xff0c;也常常陷入概念混淆和操…...

用51单片机+普中开发板DIY一个抢答器,从Proteus仿真到实物烧录全流程记录

从零打造51单片机抢答器&#xff1a;普中开发板实战全记录 第一次接触单片机项目时&#xff0c;我盯着闪烁的LED灯兴奋了整整半小时——那种"让机器听我指挥"的成就感&#xff0c;至今记忆犹新。这次要挑战的是更实用的抢答器制作&#xff0c;不仅涉及编程逻辑&#…...