STM32不使用 cubeMX实现外部中断
这篇文章将介绍如何不使用 cubeMX完成外部中断的配置和实现。
文章目录
- 前言
- 一、文件加入工程
- 二、代码解析
- exti.c
- exti.h
- main.c
- `注意`:
- 总结
前言
- 实验开发板:STM32F103C8T6。
- 所需软件:keil5 , cubeMX 。
- 实验目的:如何不使用 cubeMX实现外部中断 。
- 实验:使用外部中断控制 key 点亮 led.
如果大家想了解如何 cubeMX实现外部中断,可以参考我之前的文章:最详细STM32,cubeMX外部中断
一、文件加入工程
这里采用封装的思想,将编写的两个文件 exti.c 和 exti.h 放到自己创建的文件夹 user 中。
- 将文件夹加入工程。
点击 KEY 文件夹,右击选择 Manage Project Items.

这里点击新建,命名后,点击 OK 即可。

- 将 .c 文件加入工程。(双击刚刚创建的文件夹,即可将 .c 文件加入工程)

- 添加头文件路径。(选择“魔法棒”,选择 C/C++, 点击 “…”)

这里点击 新建,即可加入头文件路径。

二、代码解析
exti.c
- 首先创建一个
GPIO_InitTypeDef结构体,这个结构体中包含了 端口号,工作模式,是否上拉/下拉电阻等。 - 调用
__HAL_RCC_GPIOA_CLK_ENABLE函数使能端口。(这里按键对应的是 PA0 ,led 对应 PB4, 所以使能 GPIOA ,GPIOB) - 配置 GPIO_InitTypeDef 结构体,调用
HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);函数完成初始化。 - 使用
HAL_NVIC_SetPriority(EXTI0_IRQn, 0, 0);设置优先级。使用HAL_NVIC_EnableIRQ(EXTI0_IRQn);使能中断。 - 发生中断时,先调用 EXTI0_IRQHandler( ) , 执行里面的函数 HAL_GPIO_EXTI_IRQHandler 时,再会自动调用 中断回调函数 HAL_GPIO_EXTI_Callback( uint16_t GPIO_Pin )。
#include "exti.h"/* exti 初始化函数 */
void exti_Init(void)
{GPIO_InitTypeDef GPIO_InitStruct = {0};/* GPIO Ports Clock Enable */__HAL_RCC_GPIOD_CLK_ENABLE();__HAL_RCC_GPIOA_CLK_ENABLE();__HAL_RCC_GPIOB_CLK_ENABLE();/*Configure GPIO pin : PA0 */GPIO_InitStruct.Pin = GPIO_PIN_0;GPIO_InitStruct.Mode = GPIO_MODE_IT_RISING_FALLING; // 双边沿触发中断GPIO_InitStruct.Pull = GPIO_PULLDOWN; // 下拉电阻HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);/*Configure GPIO pin : PB4 */GPIO_InitStruct.Pin = GPIO_PIN_4;GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;GPIO_InitStruct.Pull = GPIO_NOPULL;GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);HAL_NVIC_SetPriority(EXTI0_IRQn, 0, 0);HAL_NVIC_EnableIRQ(EXTI0_IRQn);
}/* 中断处理函数 */
void EXTI0_IRQHandler()
{HAL_GPIO_EXTI_IRQHandler(GPIO_PIN_0);
}/* 中断回调函数 */
void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
{if(GPIO_Pin == GPIO_PIN_0){key_value = HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_0);}
}/* 获取按键的电平状态 */
uint8_t Get_key(void)
{return key_value;
}
exti.h
这里的 key_value 变量要设置为 静态 static 的,只能在本文件中使用。
#ifndef _EXTI_H_
#define _EXTI_H_#include "main.h"static int key_value = 0;void exti_Init(void);
uint8_t Get_key(void);#endif
main.c
当按键按下时 led 点亮,按键松开时 led 熄灭。
if(Get_key() == 0)
{HAL_GPIO_WritePin(GPIOB,GPIO_PIN_4,GPIO_PIN_SET);
}
else if(Get_key() == 1)
{HAL_GPIO_WritePin(GPIOB,GPIO_PIN_4,GPIO_PIN_RESET);
}
注意:
之前我们使用的是 延时函数 HAL_Delay(10); 这里为什么使用 外部中断控制 按键 点亮 led 呢?
前面我们使用 延时函数进行按键的消抖。但是延时函数在项目工程中最好是少使用,延时函数的大量使用会造成系统的卡顿。所以,这里我们使用外部中断来改进按键消抖。
使用 延时函数消抖的文章我之前写过:最详细STM32,cubeMX 按键点亮 led
总结
下篇文章为大家介绍 STM32 的 定时器。
相关文章:
STM32不使用 cubeMX实现外部中断
这篇文章将介绍如何不使用 cubeMX完成外部中断的配置和实现。 文章目录 前言一、文件加入工程二、代码解析exti.cexti.hmain.c 注意:总结 前言 实验开发板:STM32F103C8T6。所需软件:keil5 , cubeMX 。实验目的:如何不…...
Nautilus Chain 与 Coin98 生态达成合作,加速 Zebec 生态亚洲战略进
目前,行业内首个模块化 Layer3 架构公链 Nautilus Chain 已经上线主网,揭示了模块化区块链领域迎来了全新的进程。在主网上线后,Nautilus Chain 将扮演 Zebec 生态中最重要的底层设施角色,并将为 Zebec APP 以及 Zebec Payroll 规…...
method.isAnnotationPresent(Xxx.class)一直为null
package com.dj.springtest.aspect;import com.dj.springtest.annotation.RequireRoles; import lombok.extern.slf4j.Slf4j; import org.junit.Test; import org.junit.runner.RunWith; import org.springframework.beans.factory.annotation.Autowired; import org.s…...
基于CNN实现谣言检测 - python 深度学习 机器学习 计算机竞赛
文章目录 1 前言1.1 背景 2 数据集3 实现过程4 CNN网络实现5 模型训练部分6 模型评估7 预测结果8 最后 1 前言 🔥 优质竞赛项目系列,今天要分享的是 基于CNN实现谣言检测 该项目较为新颖,适合作为竞赛课题方向,学长非常推荐&am…...
MySQL——七、MySQL备份恢复
MySQL 一、MySQL日志管理1、MySQL日志类型2、错误日志3、通用查询日志4、慢查询日志5、二进制日志5.1 开启日志5.2 二进制日志的管理5.3 日志查看5.4 二进制日志还原数据 二、MySQL备份1、备份类型逻辑备份优缺点 2、备份内容3、备份工具3.1 MySQL自带的备份工具3.2 文件系统备…...
iOS如何实现语音转文字功能?
1.项目中添加权限 Privacy - Speech Recognition Usage Description : 需要语音识别权限才能实现语音转文字功能 2.添加头文件 #import <AVFoundation/AVFoundation.h> #import<Speech/Speech.h> 3.实现语音转文字逻辑: 3.1 根据wav语音文件创建请求 SFSpeechU…...
【下载器篇】获取微软应用商店应用安装包的方法
【下载器篇】获取微软应用商店应用安装包的方法 微软应用商店历史版本应用下载方法,部分历史版本无法搜索到—【蘇小沐】 文章目录 【下载器篇】获取微软应用商店应用安装包的方法1.实验环境 (一)微软商店的在线链接生成器1、复制该应用的在…...
云安全—集群攻击入口攻与防
0x00 前言 说到云安全肯定不能避免的是集群相关的内容,最出色的就是Kubernetes,也就是k8s。当然docker相关的内容也算是集群的一部分。但是docker容器本身的问题还是归属于容器本身。 0x01 概述 在集群攻击入口处的内容主要为: 应用安全恶…...
“传统”开发与AI开发的区别与联系(更新了GPT3.5的反馈)
1、传统开发的算法和软件整体,也可以看成是一个“大模型”,其中有不同层次的处理,最终能够完成从输入到输出的计算,不过,其中的计算都是人工定义的,一般依赖于研究成果的应用。研究成果在实际中的应用处理。…...
Unity 文字显示动画(2)
针对第一版的优化,自动适配文字大小,TextMeshPro可以拓展各种语言。第一版字母类语言效果更好。 using System.Collections; using System.Collections.Generic; using TMPro; using UnityEngine; using UnityEngine.UI;public partial class TextBeat…...
力扣每日一题53:最大子数组和
题目描述: 给你一个整数数组 nums ,请你找出一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。 子数组 是数组中的一个连续部分。 示例 1: 输入:nums [-2,1,-3,4,-1,2,1,…...
图论04-【无权无向】-图的广度优先遍历
文章目录 1. 代码仓库2. 广度优先遍历图解3.主要代码4. 完整代码 1. 代码仓库 https://github.com/Chufeng-Jiang/Graph-Theory 2. 广度优先遍历图解 3.主要代码 原点入队列原点出队列的同时,将与其相邻的顶点全部入队列下一个顶点出队列出队列的同时,将…...
layui的一些问题
为什么table.render, ins1.config有时候获取的值是上一次的?例如ins1.conf.page.curr? 这是一段table.render代码 let ins1 table.render({...})一般情况下ins1.conf可以获得表格的当前页,页数等;但是有时候获得的页数是上一次的;主要是因为在table.reload后没有继续赋值的…...
设计模式_中介者模式
中介者模式 介绍 设计模式定义案例问题堆积在哪里解决办法中介者代替了多个对象之间的互动 使对象1 2 3 之间的互动 变为: 对象1->中介 对象2->中介 对象3->中介好友之间 约饭好友1 通知 好友2 -3 -4 等等加一个群 谁想吃饭就 通知一下 类图 代码 角色 …...
062:mapboxGL通过jumpTo方式跳转到某位置
第062个 点击查看专栏目录 本示例的目的是介绍演示如何在vue+mapbox中通过jumpTo方式跳转到某位置。 直接复制下面的 vue+mapbox源代码,操作2分钟即可运行实现效果 文章目录 示例效果配置方式示例源代码(共122行)相关API参考:专栏目标示例效果 配置方式 1)查看基础设置…...
学成在线第一天-课程内容管理服务搭建以及查询课程接口设计
目录 一、搭建课程内容管理服务 二、设计接口 三、面试题 四、总结 一、搭建课程内容管理服务 没什么好说的,直接就是创建内容模块 然后这个继承父模块,然后再课程内容模块下面创建三个子模块,model、sevice、controller model依赖base…...
4.7 IP多播
思维导图: **4.7.1 IP多播的基本概念** --- **1. 定义和背景** - IP多播:从一个源点发送信息至多个终点的技术。 - 1988年:Steve Deering首次提及IP多播。 - 1992年:IETF进行了首次IP多播试验,当时有20个网点参与。 …...
XML与html解析,区别,如何使用
目录 简介: HTML(超文本标记语言): 如何使用HTML: XML(可扩展标记语言): 如何使用XML: 区别: 简介: XML(可扩展标记语言)和 HTMLÿ…...
【广州华锐互动】利用VR开展建筑塔吊安全操作学习的好处?
随着科技的不断发展,虚拟现实(VR)技术已经逐渐渗透到各个领域,为人们的生活带来了前所未有的便利。在工程教育领域,VR建筑塔吊安全操作学习作为一种新型的教学手段,正逐渐成为提高教学质量和培养高素质工程…...
分享一下怎么开发一个陪诊小程序
开发一个陪诊小程序需要综合考虑许多方面,包括但不限于市场需求、用户体验、技术实现和运营策略。以下是一篇以开发陪诊小程序为主题的文章。 一、背景介绍 随着社会的发展和人口老龄化的加剧,越来越多的老年人、病患和孕妇需要就医,而由于各…...
使用docker在3台服务器上搭建基于redis 6.x的一主两从三台均是哨兵模式
一、环境及版本说明 如果服务器已经安装了docker,则忽略此步骤,如果没有安装,则可以按照一下方式安装: 1. 在线安装(有互联网环境): 请看我这篇文章 传送阵>> 点我查看 2. 离线安装(内网环境):请看我这篇文章 传送阵>> 点我查看 说明:假设每台服务器已…...
龙虎榜——20250610
上证指数放量收阴线,个股多数下跌,盘中受消息影响大幅波动。 深证指数放量收阴线形成顶分型,指数短线有调整的需求,大概需要一两天。 2025年6月10日龙虎榜行业方向分析 1. 金融科技 代表标的:御银股份、雄帝科技 驱动…...
【Oracle APEX开发小技巧12】
有如下需求: 有一个问题反馈页面,要实现在apex页面展示能直观看到反馈时间超过7天未处理的数据,方便管理员及时处理反馈。 我的方法:直接将逻辑写在SQL中,这样可以直接在页面展示 完整代码: SELECTSF.FE…...
Xshell远程连接Kali(默认 | 私钥)Note版
前言:xshell远程连接,私钥连接和常规默认连接 任务一 开启ssh服务 service ssh status //查看ssh服务状态 service ssh start //开启ssh服务 update-rc.d ssh enable //开启自启动ssh服务 任务二 修改配置文件 vi /etc/ssh/ssh_config //第一…...
UDP(Echoserver)
网络命令 Ping 命令 检测网络是否连通 使用方法: ping -c 次数 网址ping -c 3 www.baidu.comnetstat 命令 netstat 是一个用来查看网络状态的重要工具. 语法:netstat [选项] 功能:查看网络状态 常用选项: n 拒绝显示别名&#…...
select、poll、epoll 与 Reactor 模式
在高并发网络编程领域,高效处理大量连接和 I/O 事件是系统性能的关键。select、poll、epoll 作为 I/O 多路复用技术的代表,以及基于它们实现的 Reactor 模式,为开发者提供了强大的工具。本文将深入探讨这些技术的底层原理、优缺点。 一、I…...
全面解析各类VPN技术:GRE、IPsec、L2TP、SSL与MPLS VPN对比
目录 引言 VPN技术概述 GRE VPN 3.1 GRE封装结构 3.2 GRE的应用场景 GRE over IPsec 4.1 GRE over IPsec封装结构 4.2 为什么使用GRE over IPsec? IPsec VPN 5.1 IPsec传输模式(Transport Mode) 5.2 IPsec隧道模式(Tunne…...
Java 二维码
Java 二维码 **技术:**谷歌 ZXing 实现 首先添加依赖 <!-- 二维码依赖 --><dependency><groupId>com.google.zxing</groupId><artifactId>core</artifactId><version>3.5.1</version></dependency><de…...
基于TurtleBot3在Gazebo地图实现机器人远程控制
1. TurtleBot3环境配置 # 下载TurtleBot3核心包 mkdir -p ~/catkin_ws/src cd ~/catkin_ws/src git clone -b noetic-devel https://github.com/ROBOTIS-GIT/turtlebot3.git git clone -b noetic https://github.com/ROBOTIS-GIT/turtlebot3_msgs.git git clone -b noetic-dev…...
Linux 中如何提取压缩文件 ?
Linux 是一种流行的开源操作系统,它提供了许多工具来管理、压缩和解压缩文件。压缩文件有助于节省存储空间,使数据传输更快。本指南将向您展示如何在 Linux 中提取不同类型的压缩文件。 1. Unpacking ZIP Files ZIP 文件是非常常见的,要在 …...
