正点原子--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,一经查实,立即删除!

相关文章

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 …

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

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

Linux(一)

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

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

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

Unity中开发程序打包发布

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

Python之PySpark简单应用

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

Linux离线安装Telnet

前言:由于服务器部署在内网环境,不能yum安装 1.先从网站下载好我们所需要到的三个rpm包http://www.rpmfind.net/linux/rpm2html/search.php?queryxinetd&submitSearch...&system&arch image.png 三个依赖包分别是: -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完成文件上传

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

element-ui button 仿写 demo

基于上篇 button 源码分享写了一个简单 demo&#xff0c;在写 demo 的过程中&#xff0c;又发现了一个小细节&#xff0c;分享一下&#xff1a; 1、组件部分&#xff1a; <template><buttonclass"yss-button"click"handleClick":class"[ty…

STM32目录结构

之前一直头疼的32目录&#xff0c;比51复杂&#xff0c;又没有C规律&#xff0c;也不像python脚本文件关联不强&#xff0c;也不像工整的FPGA工程&#xff0c;编的时候到处放&#xff0c;爆出的错千奇百怪。短暂整理了一个&#xff0c;还是没有理得很轻。 startup_stm32f10x_m…

基于python+django,我开发了一款药店信息管理系统

功能介绍 平台采用B/S结构&#xff0c;后端采用主流的Python语言进行开发&#xff0c;前端采用主流的Vue.js进行开发。 功能包括&#xff1a;药品管理、分类管理、顾客管理、用户管理、日志管理、系统信息模块。 代码结构 server目录是后端代码web目录是前端代码 部署运行…

基于SpringBoot+Redis的前后端分离外卖项目-苍穹外卖(十六)

商家端订单管理模块 1. 订单搜索1.1 需求分析和设计1.2 代码实现1.2.1 admin/OrderController1.2.2 OrderService1.2.3 OrderServiceImpl 2. 各个状态的订单数量统计2.1 需求分析和设计2.2 代码实现2.2.1 admin/OrderController2.2.2 OrderService2.2.3 OrderServiceImpl2.2.4 …

浅谈UI自动化测试

为了让对自动化技术感兴趣的朋友们有真实案例的支持&#xff0c;今天我们给大家带来一期适合新手的UI自动化测试介绍。我们的目标是让大家能够轻松理解UI自动化测试的概念&#xff0c;并且能够亲自动手去实践。通过这个介绍&#xff0c;大家能够对UI自动化测试有一个整体的理解…

【Linux C | I/O模型】Unix / Linux系统的5种IO模型 | 图文详解

&#x1f601;博客主页&#x1f601;&#xff1a;&#x1f680;https://blog.csdn.net/wkd_007&#x1f680; &#x1f911;博客内容&#x1f911;&#xff1a;&#x1f36d;嵌入式开发、Linux、C语言、C、数据结构、音视频&#x1f36d; &#x1f923;本文内容&#x1f923;&a…

2016年苏州大学837复试机试C/C++

2016年苏州大学复试机试 第一题 题目 公鸡5元一只&#xff0c;母鸡3元一只&#xff0c;幼鸡1元3只。若100元钱买了100只鸡&#xff0c;问其中公鸡、母鸡、幼鸡各多少只&#xff1f; 博主注&#xff1a;此题经典百元买百鸡问题&#xff0c;出自&#xff1a;公元5世纪末&#…

模拟钉钉官网动画

实现思路&#xff1a;利用粘性定位sticky&#xff0c;以及滚动事件实现。首先我们应该设置滚动动画开始位置和结束位置 &#xff0c;然后根据位置计算透明度或者transform&#xff0c;scale的值。 首先根据上述图线计算属性值&#xff0c;代码如下&#xff1a; function creat…

PHP漏洞查询

CVE - Search CVE List (mitre.org) 美国国家漏洞数据库&#xff08;需要梯子&#xff09; NATIONAL VULNERABILITY DATABASE NVD - Search and Statistics (nist.gov) 基本都能查询到&#xff0c;传结果详情页里面会有一些解决方案的连接 PHP的官方网站 PHP :: Bugs :: Se…

C语言探索:水仙花数的奥秘与计算

摘要&#xff1a; 水仙花数&#xff0c;一种特殊的三位数&#xff0c;其各位数字的立方和等于该数本身。本文将详细介绍水仙花数的定义、性质&#xff0c;以及如何使用C语言来寻找100至999范围内的水仙花数。 目录 一、水仙花数的定义与性质 二、用C语言寻找100至999范围内的…