STM32——外部中断

文章目录

    • 0.中断关系映射
    • 1.使能 IO 口时钟,初始化 IO 口为输入
    • 2.设置 IO 口模式,触发条件,开启 SYSCFG 时钟,设置 IO 口与中断线的映射关系。
    • 3.配置NVIC优先级管理,并使能中断
    • 4.编写中断服务函数。
    • 5.编写中断处理回调函数 HAL_GPIO_EXTI_Callback

0.中断关系映射

STM32F103 的中断控制器支持 19
个外部中断/事件请求。每个中断设有状态位,每个中断/事件都有独立的触发和屏蔽设置。
STM32F103 的 19 个外部中断为:
EXTI 线 0~15:对应外部 IO 口的输入中断。
EXTI 线 16:连接到 PVD 输出。
EXTI 线 17:连接到 RTC 闹钟事件。
EXTI 线 18:连接到 USB 唤醒事件。
EXTI 线 19:连接到以太网唤醒事件。
从上面可以看出,STM32F1 供 IO 口使用的中断线只有 16 个,但是 STM32F1 的 IO 口却 远远不止 16 个,那么 STM32F1 是怎么把 16 个中断线和 IO 口一一对应起来的呢?于是 STM32 就这样设计,GPIO 的管教 GPIOx.0-GPIOx.15(x=A,B,C,D,E,F,G,H,I)分别对应中断线 0~15。这 样每个中断线对应了最多 9 个 IO 口,以线 0 为例:它对应了 GPIOA.0、GPIOB.0、GPIOC.0、 GPIOD.0、GPIOE.0、GPIOF.0、GPIOG.0。而中断线每次只能连接到 1 个 IO 口上,这样就需要 通过配置来决定对应的中断线配置到哪个 GPIO 上了。下面我们看看 GPIO 跟中断线的映射关系图:
在这里插入图片描述

1.使能 IO 口时钟,初始化 IO 口为输入

__HAL_RCC_GPIOA_CLK_ENABLE();
__HAL_RCC_GPIOE_CLK_ENABLE();

2.设置 IO 口模式,触发条件,开启 SYSCFG 时钟,设置 IO 口与中断线的映射关系。

GPIO_InitTypeDef GPIO_Initure; 
GPIO_Initure.Pin=GPIO_PIN_0; //PA0 
GPIO_Initure.Mode=GPIO_MODE_IT_RISING; //外部中断,上升沿触发 
GPIO_Initure.Pull=GPIO_PULLDOWN; //默认下拉 
HAL_GPIO_Init(GPIOA,&GPIO_Initure); 

当我们调用 HAL_GPIO_Init 设置 IO 的 Mode 值为 GPIO_MODE_IT_RISING(外部中断上 升 沿 触 发 ), GPIO_MODE_IT_FALLING ( 外 部 中 断 下 降 沿 触 发 ) 或 者 GPIO_MODE_IT_RISING_FALLING(外部中断双边沿触发)的时候,该函数内部会通过判断 Mode 的值来开启 SYSCFG 时钟,并且设置 IO 口和中断线的映射关系。
此时如果有新的IO口在同一条中断线上映射,后面的会覆盖前面的,比如,此时PA0已经初始化了上升沿触发的中断线0,如果再配置PB0,就会清除PA0的中断配置,改为PB0,

3.配置NVIC优先级管理,并使能中断

HAL_NVIC_SetPriority(EXTI0_IRQn,2,0); //抢占优先级为 2,子优先级为 0 
HAL_NVIC_EnableIRQ(EXTI0_IRQn); //使能中断线 2 

4.编写中断服务函数。

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

void EXTI0_IRQHandler(); 
void EXTI1_IRQHandler(); 
void EXTI2_IRQHandler(); 
void EXTI3_IRQHandler(); 
void EXTI4_IRQHandler(); 
void EXTI9_5_IRQHandler(); 
void EXTI15_10_IRQHandler(); 

中断线 0-4 每个中断线对应一个中断函数,中断线 5-9 共用中断函数 EXTI9_5_IRQHandler,中
断线 10-15 共用中断函数 EXTI15_10_IRQHandler

5.编写中断处理回调函数 HAL_GPIO_EXTI_Callback

我之前使用标准库开发的时候,对中断服务函数中直接编写逻辑,清除中断标志位,然后写中断对应的引脚功能。但是HAL库对后面所说的“中断对应引脚功能代码编写”又进行了库函数的封装,即HAL_GPIO_EXIT_Callback()回调函数。
那么在HAL库中的中断服务函数是:

void HAL_GPIO_EXTI_IRQHandler(uint16_t GPIO_Pin) 
{ 
	if(__HAL_GPIO_EXTI_GET_IT(GPIO_Pin) != 0x00u) 
	{ 
		__HAL_GPIO_EXTI_CLEAR_IT(GPIO_Pin); 
		HAL_GPIO_EXTI_Callback(GPIO_Pin); 
	} 
} 

然后我们把中断功能的编写写在Callback回调函数中。
这个中断标志位是在中断触发的时候,硬件中断控制器就会设置中断标志位,我们进入中断服务函数先将中断标志位清除,表示正在处理这个中断,防止重复触发同一个中断,保证这个中断每次响应后只处理一次。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

朋友圈为什么会折叠?

你是不是也经常刷到被折叠成一行的朋友圈? 你是不是也担心自己发的朋友圈被折叠? 今天桔子分享你5个实用技巧,有效放折叠! 朋友圈折叠,原因可能是多方面的: 1、有min感词内容 比如一些促xiao、优hui、单品…

三十岁,顺丰带着理性和智慧“折腾”不止

5月出售丰网,7月补充收购嘉里物流旗下的附属的快递公司,8月明确赴港上市,9月43架全货机航线成功转场鄂州花湖机场这个“新家”——顺丰度过了忙碌的大半年,恰如“三十而立”的业务骨干,在过完生日后马不停蹄地投身工作…

猫罐头选哪个牌子?口碑好的5款猫罐头推荐给新手养猫人!

很多人家里的哈基米是不是吃猫粮吃腻了,或者猫猫平时不喜欢喝水,又或者看猫猫太瘦了想入手几款猫罐头但是又愁于不会选择。而且现在猫罐头风这么大不知道选什么好~ 作为一个从事宠物行业7年的宠物店店长,看到很多新手羊毛人来店里咨询怎么给猫…

【JavaEE初阶】 JavaScript相应的WebAPI

文章目录 🌲WebAPI 背景知识🚩什么是 WebAPI🚩什么是 API 🎍DOM 基本概念🚩什么是 DOM🚩DOM 树 🍀获取元素🚩querySelector🚩querySelectorAll 🎄事件初识&am…

宇宙工具箱:办公娱乐两不误堪称手机的百宝箱

宇宙工具箱 宇宙工具箱,提供大量实用工具,多种类型尽在其中,支持图片/视频处理、计算、查询、娱乐等多方内容,满足用户使用需求,超多工具直接使用。 获取资源 详细获取地址请点击 宇宙工具箱 功能特点 1、计算工具…

containerd Snapshots功能解析

containerd Snapshots功能解析 snapshot是containerd的一个核心功能,用于创建和管理容器的文件系统。 本篇containerd版本为v1.7.9。 本文以 ctr i pull命令为例,分析containerd的snapshot “创建” 相关的功能。 ctr命令 ctr image相关命令的实现在cmd…

《微信小程序开发从入门到实战》学习二十五

3.3 开发创建投票页面 3.3.13 使用页面路径参数 写了很多重复代码,现在想办法将多选和单选投票页面合二为一。 将单选页面改造作为单选多选共同页面。 修改index.js中的代码,将路径都跳转到第一个单选页面,带上单选或多选的标志&#xff…

常见的四种需求分析方法

需求分析是软件开发项目中非常重要的一环,而适当的需求分析方法可以帮助开发团队更好地理解用户需求,准确定义系统的功能和性能要求。通过使用这些方法,开发团队可以更好地规划和管理项目,减少需求变更和返工的风险。 如果缺乏适当…

云贝教育 |【喜报】同学们年末冲刺考试了!恭喜本月MySQL和oracle的考试同学 同一天顺利下证

恭喜MySQL的kang同学和oracle的wang同学本月考试通关,都顺利下证 悄悄的说 : 这月有MySQL优惠试卷,培训考试也有特惠价~ Oracle培训考试年末特别价 保证惊喜!! 最后祝同学们都顺利过关!早日下证&#xf…

【攻防世界-misc】pure_color

1.方法一:用画图工具打开图片,将图片拷贝至虚拟机win7桌面, 点“属性”,颜色设置为“黑白”, 出现flag值。 2.方法二:使用Stegsilve打开,分析图片 将图片打开,按左右键查找&#xff…

String 真的不可变吗?

为什么 String 类不可变 final修饰符: String类被声明为final,这意味着它不能被继承。因此,无法创建String的子类来修改其行为。私有字符数组(char[]): String类内部使用私有的字符数组来存储字符串的内容…

TypeError: Cannot read property ‘sendpost‘ of undefined

箭头函数指向问题,定义let that this 解决

分享5款工作和学习中,经常用到的软件

​ 如今,工作和学习都离不开电脑,所以电脑里的软件自然也是必不可少的,但是电脑软件那么多,不可能每个都装上吧,所以我们要装好用的、实用的,下面给大家分享5款好用到爆的软件,很多懂电脑的人都…

使用支付宝的沙箱环境在本地配置模拟支付并发布至公网调试

文章目录 前言1. 下载当面付demo2. 修改配置文件3. 打包成web服务4. 局域网测试5. 内网穿透6. 测试公网访问7. 配置二级子域名8. 测试使用固定二级子域名访问9. 结语 前言 在沙箱环境调试支付SDK的时候,往往沙箱环境部署在本地,局限性大,在沙…

java--ArrayList快速入门

1.什么是集合&#xff1f; 集合是一个容器&#xff0c;用来装数据的&#xff0c;类似于数组。 2.有数组&#xff0c;为啥还学习集合 ①数组定义完成并启动后&#xff0c;长度是固定了。 ②集合大小可变&#xff0c;开发中用的更多。 3.ArrayList<E> 是用的最多、最…

OpenStack-train版安装之基础组件安装

基础组件安装 安装MariaDB&#xff08;数据库&#xff09;安装RabbitMQ&#xff08;消息队列&#xff09;安装Memcached&#xff08;缓存&#xff09; 安装MariaDB&#xff08;数据库&#xff09; 安装 # yum install mariadb mariadb-server python2-PyMySQL -y数据库配置 …

公益众筹模式源码模式:水滴筹模式 实现社会价值的最大化 附带完整的搭建教程

随着社会的进步和互联网技术的发展&#xff0c;公益众筹作为一种有效的筹款方式&#xff0c;越来越受到人们的关注。其中&#xff0c;水滴筹模式以其独特的运营方式和强大的社交功能&#xff0c;逐渐成为了公益众筹领域的一种重要模式。该源码系统就是在这样的背景下应运而生&a…

洗地机哪个牌子好用?洗地机选购攻略

传统的清洁方式都是扫把拖把的结合&#xff0c;既繁琐也劳累&#xff0c;每次清洁完后还得累的腰酸背痛的&#xff0c;像厨房这种地方甚至会不容易清洁干净&#xff0c;总感觉地板灰蒙蒙的。洗地机的诞生就很好的解决了这些问题&#xff0c;不用一遍遍的重复扫地拖地擦地&#…

vue一个页面左边是el-table表格 当点击每条数据时可以在右边界面编辑表格参数,右边保存更新左边表格数据

实现思路&#xff1a; 1.点击当前行通过row拿到当前行数据。 2.将当前行数据传给子组件。 3.子组件监听父组件传过来的数据并映射在界面。 4.点击保存将修改的值传给父组件更新表格。 5.父组件收到修改过后的值&#xff0c;可以通过字段判断比如id&#xff0c;通过 findIn…

volatile 详解

目录 一. 前言 二. 可见性 2.1. 可见性概述 2.2. 内存屏障 2.3. 代码实例 三. 不保证原子性 3.1. 原子性概述 3.2. 如何解决 volatile 的原子性问题呢&#xff1f; 四. 禁止指令重排 4.1. volatile 的 happens-before 关系 4.2. 代码实例 五. volatile 应用场景 5…