STM32不使用 cubeMX实现外部中断

这篇文章将介绍如何不使用 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.hqwc.cn/news/145488.html

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

相关文章

1024程序员狂欢节有好礼 | 前沿技术、人工智能、集成电路科学与芯片技术、新一代信息与通信技术、网络空间安全技术

🌹欢迎来到爱书不爱输的程序猿的博客, 本博客致力于知识分享,与更多的人进行学习交流 1024程序员狂欢节有好礼 🚩🚩🚩点击直达福利前言一、IT技术 IT Technology《速学Linux:系统应用从入门到精通》《Pytho…

基于springboot+vue网上图书商城54

大家好✌!我是CZ淡陌。一名专注以理论为基础实战为主的技术博主,将再这里为大家分享优质的实战项目,本人在Java毕业设计领域有多年的经验,陆续会更新更多优质的Java实战项目,希望你能有所收获,少走一些弯路…

顶级玩家:一招搞定 App 自动化老大难问题

很多人在学习 App 自动化或者在项目中落地实践 App 自动化时,会发现编写的自动化脚本无缘无故的执行失败、不稳定。 而导致其问题很大原因是因为应用的各种弹窗(升级弹窗、使用过程提示弹窗、评价弹窗等等),比如这样的&#xff1a…

深入篇【Linux】学习必备:进程环境变量/进程切换

深入篇【Linux】学习必备:进程环境变量/进程切换 Ⅰ.环境变量Ⅱ.深层意义Ⅲ.全局属性Ⅳ.进程切换 Ⅰ.环境变量 1.环境变量是什么?:环境变量是系统提供的一组name/value形式的变量,不同的环境变量有不同的用户。 一般是用来指定操作…

YOLOV8目标检测——最全最完整模型训练过程记录

文章目录 前言1 下载yolov8([网址](https://github.com/ultralytics/ultralytics))2 配置conda环境3 用pycharm打开文件3 训练自己的YOLOV8数据集4 run下运行完了之后没有best.pt文件5 导出为onnx文件6 yolov8应用完整案例(免费且包含源代码、…

springboot 程序设计优雅退出

一 springboot优雅退出 1.1 概述 在springboot2.3版本后,实现了优雅退出功能。当server.shutdowngraceful启用时,在 web 容器关闭时,web 服务器将不再接收新请求,并将剩余活动执行完成给设置一个缓冲期。缓冲期 timeout-per-shu…

基础MySQL的语法练习

基础MySQL的语法练习 create table DEPT(DEPTNO int(2) not null,DNAME VARCHAR(14),LOC VARCHAR(13) );alter table DEPTadd constraint PK_DEPT primary key (DEPTNO);create table EMP (EMPNO int(4) primary key,ENAME VARCHAR(10),JOB VARCHAR(9),MGR …

100 # mongoose 的使用

mongoose elegant mongodb object modeling for node.js https://mongoosejs.com/ 安装 mongoose npm i mongoose基本示例 const mongoose require("mongoose");// 1、连接 mongodb let conn mongoose.createConnection("mongodb://kaimo313:kaimo313loc…

城市正视图(Urban Elevations, ACM/ICPC World Finals 1992, UVa221)rust解法

如图5-4所示,有n(n≤100)个建筑物。左侧是俯视图(左上角为建筑物编号,右下角为高度),右侧是从南向北看的正视图。 输入每个建筑物左下角坐标(即x、y坐标的最小值)、宽度…

Linux基础命令1——Linux的命令格式与命令分类

目录 Linux命令格式 Linux命令分类 如何判断命令的类型——Type命令 内置命令 外部命令 alias命令 命令的执行效率与过程 Linux命令格式 命令格式 完整的命令格式分为三部分:命令、参数、对象 其中命令与参数、参数与参数、参数与对象之间最少要有一个空格做…

有哪些比较好用的协同办公软件

在疫情期间,协同办公大放异彩,解决了很多公司线上办公的问题,所以在后疫情时代,协同办公软件成为了提高工作效率和团队协作的重要工具。 随着科技的不断进步,越来越多的协同办公软件涌现出来。在本文中,我们…

NFTScan | 10.16~10.22 NFT 市场热点汇总

欢迎来到由 NFT 基础设施 NFTScan 出品的 NFT 生态热点事件每周汇总。 周期:2023.10.16~ 2023.10.22 NFT Hot News 01/y00ts:迁移回以太坊的跨链桥已上线,将承担第一天所有 Gas 费 10 月 16 日,y00ts 发推称,将 y00…