正点原子--STM32中断系统学习笔记(2)

引言

上篇帖子STM32中断系统学习笔记(1)是理论,这篇帖子开始实战,目标是通过按键实现LED的控制。

1.工程建立

以正点原子HAL库 实验1 跑马灯实验为基础,复制工程,在“Drivers--BSP”目录下建立EXTI文件夹,并创建exti.c和exti.h文件;

2.导入C文件

第一步:

第二步: 

 

第三步:添加exti.c 

 

第四步:跳转到exti.h 

 添加这部分代码

#ifndef _EXTI_H
#define _EXTI_H#include "./SYSTEM/sys/sys.h"#endif

 3.查看原理图

我们想要最终实现的效果是按下KEY0使LED0灯翻转,按下KEY1使LED1翻转。

 配置LED0和LED1引脚为推挽输出模式(之前工程已经配置过),KEY0和KEY1引脚为中断输入模式;

 4.编写代码

按照正点原子给的步骤一步步来配置,最重要的是学习配置思路,一通百通!!

4.1 外部中断初始化

void exti_init(void)
{GPIO_InitTypeDef gpio_init_struct;__HAL_RCC_GPIOA_CLK_ENABLE();															/* 使能PA引脚时钟 */__HAL_RCC_GPIOC_CLK_ENABLE();															/* 使能PC引脚时钟 */gpio_init_struct.Pin = GPIO_PIN_15;               	/* 按键 KEY1 引脚 */gpio_init_struct.Mode =  GPIO_MODE_IT_FALLING;     	/* 外部中断下降沿触发 */gpio_init_struct.Pull = GPIO_PULLUP;                  /* 上拉 */HAL_GPIO_Init(GPIOA, &gpio_init_struct);         /* 配置初始化 */gpio_init_struct.Pin = GPIO_PIN_5;                /* 按键 KEY0 引脚 */gpio_init_struct.Mode =  GPIO_MODE_IT_FALLING;   /* 外部中断下降沿触发 */gpio_init_struct.Pull = GPIO_PULLUP;            /* 上拉 */HAL_GPIO_Init(GPIOC, &gpio_init_struct);       /* 配置初始化 */HAL_NVIC_SetPriority(EXTI15_10_IRQn,1,0);	/* 配置抢占优先级和响应优先级 */HAL_NVIC_EnableIRQ(EXTI15_10_IRQn);			/* 使能中断 */HAL_NVIC_SetPriority(EXTI9_5_IRQn,2,0);		/* 配置抢占优先级和响应优先级 */HAL_NVIC_EnableIRQ(EXTI9_5_IRQn);			/* 使能中断 */	
}

代码解释: 

①由原理图得知KEY0对应PC5,KEY1对应PA15,那么首先我们要使能PA和PC端口的时钟 ;

	GPIO_InitTypeDef gpio_init_struct;__HAL_RCC_GPIOA_CLK_ENABLE();															/* 使能PA引脚时钟 */__HAL_RCC_GPIOC_CLK_ENABLE();															/* 使能PC引脚时钟 */

②配置引脚号,引脚模式,有无上下拉电阻,以及配置完成初始化,这里需要注意一点的就是引脚模式配置为外部中断下降沿触发

	gpio_init_struct.Pin = GPIO_PIN_15;               	/* 按键 KEY1 引脚 */gpio_init_struct.Mode =  GPIO_MODE_IT_FALLING;     	/* 外部中断下降沿触发 */gpio_init_struct.Pull = GPIO_PULLUP;                  /* 上拉 */HAL_GPIO_Init(GPIOA, &gpio_init_struct);         /* 配置初始化 */gpio_init_struct.Pin = GPIO_PIN_5;                /* 按键 KEY0 引脚 */gpio_init_struct.Mode =  GPIO_MODE_IT_FALLING;   /* 外部中断下降沿触发 */gpio_init_struct.Pull = GPIO_PULLUP;            /* 上拉 */HAL_GPIO_Init(GPIOC, &gpio_init_struct);       /* 配置初始化 */

为什么要配置为上拉电阻:由原理图知,当我们按下KEY0时,GND导通,此时KEY0是低电平,我们接一个内置上拉电阻,那么KEY0在空闲状态时就是高电平。当按键按下时,KEY0的电平从高---->低,就是一个下降沿,这时我们配置引脚模式为下降沿触发,就能让外部中断信号顺利进入NVIC中断管家里。

③ 配置中断分组,中断优先级,使能中断

在stm32f1xx_hal.c里HAL_Init函数里,已经默认配置好了中断分组为2,所以我们只需要配置中断优先级以及使能中断就行;

	HAL_NVIC_SetPriority(EXTI15_10_IRQn,1,0);	/* 配置抢占优先级和响应优先级 */HAL_NVIC_EnableIRQ(EXTI15_10_IRQn);			/* 使能中断 */HAL_NVIC_SetPriority(EXTI9_5_IRQn,2,0);		/* 配置抢占优先级和响应优先级 */HAL_NVIC_EnableIRQ(EXTI9_5_IRQn);			/* 使能中断 */	

 HAL_NVIC_SetPriority,第一个参数是中断向量,选中它后按F12就能来到枚举类型的中断向量。

由EXTI和IO的重映射关系我们得知,PC5对应的EXTI线是EXTI5,PA5对应的EXTI线是EXTI15,所以我们要在IRQn_Type里找到我们所需要的中断向量, EXTI0~EXTI4有各自对应的中断向量,而EXTI5~EXTI9共用一个中断向量EXTI9_5_IRQn,EXTI10~EXTI15共用一个中断向量EXTI15_10_IRQn;

之后再配置抢占优先级和响应优先级即可,还有使能中断。

4.2 中断处理函数

思路:由HAL库中断回调处理机制得知,当发生中断后,首先进入到对应的中断服务函数里,比如KEY0(对应PC5引脚)按键按下,就会进入EXTI9_5_IRQHandler函数里,并调用HAL库中断处理公用函数HAL_GPIO_EXTI_IRQHandle(),在中断处理公用函数里会进行清中断标志位,调用中断回调函数HAL_GPIO_EXTI_Callback()的操作。

/* KEY1按键中断处理函数 */
void EXTI15_10_IRQHandler(void)
{HAL_GPIO_EXTI_IRQHandler(GPIO_PIN_15);		/* 公共处理函数 *//* HAL库默认先清中断再处理回调,退出时再清一次中断,避免按键抖动误触发 */__HAL_GPIO_EXTI_CLEAR_IT(GPIO_PIN_15);		
}/* KEY0按键中断处理函数 */
void EXTI9_5_IRQHandler(void)
{HAL_GPIO_EXTI_IRQHandler(GPIO_PIN_5);		/* 公共处理函数 *//* HAL库默认先清中断再处理回调,退出时再清一次中断,避免按键抖动误触发 */__HAL_GPIO_EXTI_CLEAR_IT(GPIO_PIN_5);
}void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
{delay_ms(20);    /* 延时消除按键抖动 */switch(GPIO_Pin){case GPIO_PIN_15 :if(HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_15) == 0)    /* 检测KEY1是否按下 */{ HAL_GPIO_TogglePin(GPIOA, GPIO_PIN_8);		/* 翻转LED0 */ }break;case GPIO_PIN_5 :if(HAL_GPIO_ReadPin(GPIOC, GPIO_PIN_5) == 0)     /* 检测KEY0是否按下 */{ HAL_GPIO_TogglePin(GPIOD, GPIO_PIN_2);		/* 翻转LED1 */ }break;default:break;	}
}

而 HAL_GPIO_EXTI_Callback()是虚函数,最后按照我们的思路编写HAL_GPIO_EXTI_Callback()就好了。

main函数里只添加exti_init()外部中断初始化。

 

OK,外部中断的原理和实验到此结束,完结撒花*★,°*:.☆( ̄▽ ̄)/$:*.°★* 。


本篇完。

本人博客仅代表个人见解方便记录成长笔记。

若有不足,请指出,感谢您的阅读!

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

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

相关文章

Spring Cloud Gateway 修改请求体、响应体

前言 例行每半年一次的工作轮换,接手了同事的网关服务 年底了工作不是很忙,看了下前人的代码,虽然都能读懂,但感觉应该可以再优雅一点 于是把网关的相关知识又翻阅了一下 官方资料 PS:这里如果按新方案调整的话&#…

Windows - 防火墙 - 如何开启单个端口以供Web应用访问(以82端口为例) - 开启端口后还是访问失败了?

Windows - 防火墙 - 如何开启单个端口以供Web应用访问(以82端口为例) - 开启端口后还是访问失败了? 前言 在网上搜“防火墙开启某个端口”供其他机器访问,都是只讲到了“如何允许某个端口被访问”,而没有后续了。 我之前就遇到过这个问题&…

数据据库八之 视图、触发器、事务

【零】准备数据 【1】创建表 (1)部门表 d_id是部门的编号d_name是部门的名字 # 确保表不存在 drop table if exists department; # 创建表 create table department( d_id int auto_increment primary key, d_name varchar(6) )auto_increment 501 …

STM32-GPIO输入——按键检测

1 软件设计 为了使程序更有条例,方便移植在“工程模板”之上新建“bsp_key.c”及“bsp_key.h”文件,这些文件也可根据您的喜好命名,这 些文件不属于STM32HAL库的内容,是由我们自己根据应用需要编写的 1.1 编程要点 1&#xff…

2024-01-06-AI 大模型全栈工程师 - 机器学习基础

摘要 2024-01-06 阴 杭州 晴 本节简介: a. 数学模型&算法名词相关概念; b. 学会数学建模相关知识; c. 学会自我思考,提升认知,不要只会模仿; 课程内容 1. Fine-Tuning 有什么作用? a. 什么是模型训练&#xff…

Linux(一)

目录结构 【在 Linux 世界里,一切皆文件】 linux 的文件系统是采用级层式的树状目录结构; 序号名称介绍备注1/:根目录一般根目录下只存放目录,在 linux 下有且只有一个根目录,所有的东西都是从这里开始; 当…

机器学习1-种类及应用

机器学习主要包括以下几种主要的种类: 1. 监督学习(Supervised Learning) 在监督学习中,模型通过使用已标记的训练数据(包括输入和对应的输出)来学习预测目标变量。常见的任务包括回归和分类。应用&#xf…

Docker进阶篇-Docker微服务实战

一、通过IDEA新建一个普通微服务模块 1、建Moduel <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0"xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation…

Open CASCADE学习|曲面上一点的曲率及切平面

曲率&#xff08;Curvature&#xff09;是一个几何学的概念&#xff0c;用于描述一个物体的形状在某一点上的弯曲程度。在我们日常生活中&#xff0c;曲率与我们的生活息息相关&#xff0c;如道路的弯道、建筑物的拱形结构、自然界的山脉等等。了解曲率的概念和计算方法&#x…

开源软件,推动技术创新

文章目录 一、开源软件介绍二、推动技术创的影响力三、常见的开源软件四、应用案例五、存在安全风险 一、开源软件介绍 开源软件&#xff0c;也称为自由软件或公众可用的软件&#xff0c;是一种源代码公开的软件。与传统的商业软件不同&#xff0c;开源软件由社区驱动&#xf…

Unity中开发程序打包发布

添加ESC脚本 使用Unity打包发布的过程中&#xff0c;考虑到打开的程序会处于全屏界面&#xff0c;而此时我们又会有退出全屏的需求&#xff0c;因此需要添加ESC脚本&#xff0c;当我们单击ESC脚本的过程中&#xff0c;退出全屏模式。 在Assets/Scenes下&#xff0c;创建esc.cs…

Python之PySpark简单应用

文章目录 一、介绍1.准备工作2. 创建SparkSession对象&#xff1a;3. 读取数据&#xff1a;4. 数据处理与分析&#xff1a;5. 停止SparkSession&#xff1a; 二、示例1.读取解析csv数据2.解析计算序列数据map\flatmap 三、问题总结1.代码问题2.配置问题 一、介绍 PySpark是Apa…

Linux离线安装Telnet

前言&#xff1a;由于服务器部署在内网环境&#xff0c;不能yum安装 1.先从网站下载好我们所需要到的三个rpm包http://www.rpmfind.net/linux/rpm2html/search.php?queryxinetd&submitSearch...&system&arch image.png 三个依赖包分别是&#xff1a; -rw-r--r-- 1…

Invicti Professional v24.1.0.43434

新的安全检查 添加了对 dotCMS 的检查添加了对 Ultimate Member WordPress 插件的检查添加了新的 mXSS 模式添加了新签名来检测 JWK 改进 改进了针对 Weak Ciphers Enabled 漏洞的建议改进了对 swagger.json 漏洞的检测添加了对 AWS WAFv2 规则的支持改进了更多错误和警告消…

探索Gin框架:Golang使用Gin完成文件上传

前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到网站https://www.captainbed.cn/kitie。 前言 在之前的文章中&#xff0c;我们讲解了Gin框架的快速入门使用&#xff0c;今天我们来聊聊如何使用…

golang的sqlite驱动不使用cgo实现 更换gorm默认的SQLite驱动

golang的sqlite驱动不使用cgo实现 更换gorm默认的SQLite驱动 最近在开发一个边缘物联网程序时使用Golang开发&#xff0c;用到GORM来操作SQLite数据库&#xff0c;GORM默认使用gorm.io/driver/sqlite这个库作为SQLite驱动&#xff0c;该库用CGO实现&#xff0c;在使用过程中遇…

OpenAI Gym 中级教程——多智能体系统

Python OpenAI Gym 中级教程&#xff1a;多智能体系统 在强化学习中&#xff0c;多智能体系统涉及到多个智能体相互作用的情况。在本篇博客中&#xff0c;我们将介绍如何在 OpenAI Gym 中构建和训练多智能体系统&#xff0c;并使用 Multi-Agent Deep Deterministic Policy Gra…

Unity_Shader

Unity_Shader 目录 Unity_Shader 带着问题开始: Shader Graph 开始吧!

【NLP冲吖~】一、朴素贝叶斯(Naive Bayes)

0、朴素贝叶斯法 朴素贝叶斯法是基于贝叶斯定理与特征条件独立假设的分类方法。对于给定的训练数据集&#xff0c;首先基于特征条件独立假设学习输入输出的联合概率分布&#xff0c;然后基于此模型&#xff0c;对给定的输入 x x x&#xff0c;利用贝叶斯定理求出后验概率最大的…

【Spring Boot 3】应用启动执行特定逻辑

【Spring Boot 3】应用启动执行特定逻辑 背景介绍开发环境开发步骤及源码工程目录结构总结背景 软件开发是一门实践性科学,对大多数人来说,学习一种新技术不是一开始就去深究其原理,而是先从做出一个可工作的DEMO入手。但在我个人学习和工作经历中,每次学习新技术总是要花…