STM32不使用 cubeMX实现外部中断

news2024/11/15 21:07:29

这篇文章将介绍如何不使用 cubeMX完成外部中断的配置和实现。

文章目录

  • 前言
  • 一、文件加入工程
  • 二、代码解析
      • exti.c
      • exti.h
      • main.c
  • `注意`:
  • 总结


前言

  • 实验开发板:STM32F103C8T6。
  • 所需软件:keil5 , cubeMX 。
  • 实验目的:如何不使用 cubeMX实现外部中断 。
  • 实验:使用外部中断控制 key 点亮 led.

如果大家想了解如何 cubeMX实现外部中断,可以参考我之前的文章:最详细STM32,cubeMX外部中断

一、文件加入工程

这里采用封装的思想,将编写的两个文件 exti.c 和 exti.h 放到自己创建的文件夹 user 中。

  1. 将文件夹加入工程。
    点击 KEY 文件夹,右击选择 Manage Project Items.
    在这里插入图片描述
    这里点击新建,命名后,点击 OK 即可。
    在这里插入图片描述
  2. 将 .c 文件加入工程。(双击刚刚创建的文件夹,即可将 .c 文件加入工程)
    在这里插入图片描述
  3. 添加头文件路径。(选择“魔法棒”,选择 C/C++, 点击 “…”)
    在这里插入图片描述
    这里点击 新建,即可加入头文件路径。
    在这里插入图片描述

二、代码解析

exti.c

  1. 首先创建一个 GPIO_InitTypeDef 结构体,这个结构体中包含了 端口号,工作模式,是否上拉/下拉电阻等。
  2. 调用 __HAL_RCC_GPIOA_CLK_ENABLE 函数使能端口。(这里按键对应的是 PA0 ,led 对应 PB4, 所以使能 GPIOA ,GPIOB)
  3. 配置 GPIO_InitTypeDef 结构体,调用 HAL_GPIO_Init(GPIOA, &GPIO_InitStruct); 函数完成初始化。
  4. 使用 HAL_NVIC_SetPriority(EXTI0_IRQn, 0, 0); 设置优先级。使用 HAL_NVIC_EnableIRQ(EXTI0_IRQn); 使能中断。
  5. 发生中断时,先调用 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 的 定时器。

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

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

相关文章

【【萌新的FPGA学习之分频器的介绍】】

萌新的FPGA学习之分频器的介绍 分频器的介绍 分频就是生成一个新时钟,该新时钟的频率是原有时钟频率的整数分之一倍,新周期是原有周期的整数倍。再简单来说,让你手撕一个四分频电路,就是写代码生成一个周期是原来四倍的时钟&…

PMP的智慧(2) - 系统性思考及复杂性

PMP的智慧(2) - 系统性思考及复杂性 在2021年推出的第七版《管理专业知识体系指南》中,PMI在传统的过程和ITTO的基础上,重新增加了12大项目管理原则。 管家式管理 stewardship团队 team干系人 stakeholders价值 value系统思考 system thinking领导力 l…

Excel函数中单元格的引用方式

如下图在D列第一行输入sum(A1:C1); 回车之后结果如下;先要输入等号,然后输入sum,以及左括号,这是调用了sum求和函数; A1表示A列第一行,C1表示C列第一行; A1:C1,中间是冒号…

实践DDD模拟电商系统总结

目录 一、事件风暴 二、系统用例 三、领域上下文 四、架构设计 (一)六边形架构 (二)系统分层 五、系统实现 (一)项目结构 (二)提交订单功能实现 (三&#xff0…

【Objective-C】浅析Block及其捕获机制

目录 Block的基本使用Block的声明Block的实现Block的调用 Block作为形参使用Block作为属性使用给Block起别名Block的copy Block的捕获机制auto类型的局部变量__block浅析static类型的局部变量全局变量 其他问题 Block的基本使用 什么是Block? Block (块…

【深度学习实验】循环神经网络(五):基于GRU的语言模型训练(包括自定义门控循环单元GRU)

文章目录 一、实验介绍二、实验环境1. 配置虚拟环境2. 库版本介绍 三、实验内容(一)自定义门控循环单元(GRU,Gated Recurrent Unit)1. get_params2. init_gru_state3. gru (二)创建模型0. 超参数…

[AUTOSAR][诊断管理][$11] 复位服务

文章目录 一、简介(1) 应用场景(2) 请求格式(3) 重启类型 二、示例代码(1) 11_ecu_reset.c 一、简介 ECU复位服务就是可以此诊断指令来命令ECU执行自复位,复位有多种形式,依据子功能参数来区分&#xff08…

【Javascript】构造函数之new的作用

目录 new的作用 把对象返回了回来 无new 有new 把构造函数的this指向了要返回的对象 无new​编辑 有new new的执行流程 new的作用 创建了新空对象将构造函数的作用域赋值给新对象(this指向新对象)执行构造函数代码 (为这个新对象添加属性)返回新对…

网络协议--Ping程序

7.1 引言 “ping”这个名字源于声纳定位操作。Ping程序由Mike Muuss编写,目的是为了测试另一台主机是否可达。该程序发送一份ICMP回显请求报文给主机,并等待返回ICMP回显应答(图6-3列出了所有的ICMP报文类型)。 一般来说&#x…

HTML+CSS+JS+Django 实现前后端分离的科学计算器、利率计算器

🧮前后端分离计算器 📚git仓库链接和代码规范链接💼PSP表格🎇成品展示🏆🏆科学计算器:1. 默认界面与页面切换2. 四则运算、取余、括号3. 清零Clear 回退Back4. 错误提示 Error5. 读取历史记录Hi…

​CUDA学习笔记(三)CUDA简介

本篇博文转载于https://www.cnblogs.com/1024incn/tag/CUDA/,仅用于学习。 前言 线程的组织形式对程序的性能影响是至关重要的,本篇博文主要以下面一种情况来介绍线程组织形式: 2D grid 2D block 线程索引 矩阵在memory中是row-major线性…

Cannot load from short array because “sun.awt.FontConfiguration.head“ is null

错误描述 在使用Easyexcel时发生了报错,请求返回空白 但是只在Linux上出现了该报错,在本地windows环境没有出现 JDK都使用的是17版本 错误原因 由于在linux上缺失Easyexcel使用的字体导致 解决办法 下载一个jdk1.8 在其jre/lib目录里复制fontconfi…

聊聊昨日ChatGPT全球宕机事件,带给我们的警示

作者 | 卖萌酱,王二狗 昨日,ChatGPT崩了! 大模型研究测试传送门 GPT-4传送门(免墙,可直接测试,遇浏览器警告点高级/继续访问即可):https://gpt4test.com 许多人发现无论是 ChatGPT…

腾讯云创建了jenkins容器,但无法访问

1、首先,查看本机能不能ping通你的腾讯云服务器 如果ping的通那就下一步 2、查看腾讯云服务器的防火墙关了没,没关关掉、 firewall-cmd --state not running 3、那就在云服务器的控制台开放端口

自然语言处理---注意力机制

注意力概念 观察事物时,之所以能够快速判断一种事物(当然允许判断是错误的),是因为大脑能够很快把注意力放在事物最具有辨识度的部分从而作出判断,而并非是从头到尾的观察一遍事物后,才能有判断结果。正是基于这样的理论&#xf…

【数据结构】线性表(九)队列:链式队列及其基本操作(初始化、判空、入队、出队、存取队首元素)

文章目录 一、队列1. 定义2. 基本操作 二、顺序队列三、链式队列0. 链表1. 头文件2. 队列结构体3. 队列的初始化4. 判断队列是否为空5. 入队6. 出队7. 存取队首元素8. 主函数9. 代码整合 堆栈Stack 和 队列Queue是两种非常重要的数据结构,两者都是特殊的线性表&…

面试二总结

bean的生命周期: 数据库采用行级锁索引(使用排他锁): mysql事务隔离级别 未提交读(Read uncommitted)是最低的隔离级别。通过名字我们就可以知道,在这种事务隔离级别下,一个事务可以读到另外一个事务未提交…

微信小程序自定义组件及会议管理与个人中心界面搭建

一、自定义tabs组件 1.1 创建自定义组件 新建一个components文件夹 --> tabs文件夹 --> tabs文件 创建好之后win7 以上的系统会报个错误:提示代码分析错误,已经被其他模块引用,只需要在 在project.config.json文件里添加两行配置 &…

gltf和glb格式模型用什么软件处理

.gltf格式本质上是一个JSON文件。它能描述一整个3D场景,比如一个模型使用多少个网格,网格的旋转、位移等信息。 .glb 文件是gltf 资源格式的二进制格式,一般情况它将所有依赖的资源打包在一起形成一个 xxx.glb 的资源文件,但是如…

Leetcode刷题解析——串联所有单词的子串

1. 题目链接:30. 串联所有单词的子串 2. 题目描述: 给定一个字符串 s 和一个字符串数组 words。 words 中所有字符串 长度相同。 s 中的 串联子串 是指一个包含 words 中所有字符串以任意顺序排列连接起来的子串。 例如,如果 words ["…