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.mzph.cn/news/115842.shtml

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

相关文章

Python 测试框架unittest和pytest的优劣

一、Unittest Unittest是Python标准库中自带的单元测试框架,Unittest有时候也被称为PyUnit,就像JUnit是Java语言的标准单元测试框架一样,Unittest则是Python语言的标准单元测试框架。 Unittest支持自动化测试,测试用例的初始化、…

【单片机学习笔记】Windows+Vscode+STM32F4+freeRTOS+FatFs gcc环境搭建

为摒弃在接受keil邮件,研究了下gun编译,以STM32F407为例,简单记录 1. 软件包准备 Git 选择对应版本直接安装即可https://git-scm.com/download/winmakegcc ​ 1)将上述软件包放置于C盘根目录 2)添加环境变量 3&am…

循环神经网络(Recurrent Neural Network)

1. 为什么需要循环神经网络 RNN 上图是一幅全连接神经网络图,我们可以看到输入层-隐藏层-输出层,他们每一层之间是相互独立地,(框框里面代表同一层),每一次输入生成一个节点,同一层中每个节点之间又相互独立的话&#…

07、Python -- 序列相关函数与封包解包

目录 使用函数字符串也能比较大小序列封包序列解包多变量同时赋值 最大值、最小值、长度 序列解包与封包 使用函数 len()、max()、min() 函数可获取元组、列表的长度、最大值和最小值。 字符串也能比较大小 字符串比较大小时,将会依次按字符串中每个字符对应的编…

GB28181学习(十二)——报警事件通知和分发

要求 发生报警事件时,源设备将报警信息发送给SIP服务器;报警事件通知和分发使用MESSAGE方法;源设备包括: SIP设备网关SIP客户端联网系统综合接处警系统以及卡口系统 目标设备包括: 具有接警功能的SIP客户端联网系统综…

学习pytorch14 损失函数与反向传播

神经网络-损失函数与反向传播 官网损失函数L1Loss MAE 平均MSELoss 平方差CROSSENTROPYLOSS 交叉熵损失注意code 反向传播在debug中的显示code B站小土堆pytorch视频学习 官网 https://pytorch.org/docs/stable/nn.html#loss-functions 损失函数 L1Loss MAE 平均 import to…

Linux使用find命令查找文件

find命令 简介语法格式基本参数 参考实例根目录下文件名称的例子指定路径下特定类型的例子指定路径、文件类型特定文件名称的例子指定路径、文件类型特定文件大小的例子指定路径、文件类型 查找近期修改时间的例子指定路径、文件类型 查找空文件或目录的例子指定路径、文件类型…

nginx安装详细步骤和使用说明

下载地址: https://download.csdn.net/download/jinhuding/88463932 详细说明和使用参考: 地址:http://www.gxcode.top/code 一 nginx安装步骤: 1.nginx安装与运行 官网 http://nginx.org/1.1安装gcc环境 # yum install gcc-c…

RustDay06------Exercise[71-80]

71.box的使用 说实话这题没太看懂.敲了个模板跟着提示就过了 // box1.rs // // At compile time, Rust needs to know how much space a type takes up. This // becomes problematic for recursive types, where a value can have as part of // itself another value of th…

2022最新版-李宏毅机器学习深度学习课程-P26 Recurrent Neural Network

RNN 应用场景:填满信息 把每个单词表示成一个向量的方法:独热向量 还有其他方法,比如:Word hashing 单词哈希 输入:单词输出:该单词属于哪一类的概率分布 由于输入是文字序列,这就产生了一个问…

如何能够获取到本行业的能力架构图去了解自己的能力缺陷与短板,从而能清晰的去弥补差距?

如何能够获取到本行业的能力架构图去了解自己的能力缺陷与短板,从而能清晰的去弥补差距? 获取并利用能力架构图(Competency Model)来了解自己在特定行业或职位中的能力缺陷和短板,并据此弥补差距,是一个非常…

【PyTorch实战演练】自调整学习率实例应用(附代码)

目录 0. 前言 1. 自调整学习率的常用方法 1.1 ExponentialLR 指数衰减方法 1.2 CosineAnnealingLR 余弦退火方法 1.3 ChainedScheduler 链式方法 2. 实例说明 3. 结果说明 3.1 余弦退火法训练过程 3.2 指数衰减法训练过程 3.3 恒定学习率训练过程 3.4 结果解读 4. …

软件工程第七周

内聚 耦合 (Coupling): 描述的是两个模块之间的相互依赖程度。控制耦合是耦合度的一种,表示一个模块控制另一个模块的流程。高度的耦合会导致软件维护困难,因为改变一个模块可能会对其他模块产生意外的影响。 内聚 (Cohesion): 描述的是模块内部各个元素…

虚拟机weblogic服务搭建及访问(物理机 )

第一、安装环境: weblogic10.3.6.jar, jdk1.6.bin(开始安装jdk1.8后,安装域的时候报错 ,版本很重要) centos7虚拟机(VMware9) 本机系统windows7 以上安装包如果需要可以私信我,上传资源提示…

yolov8x-p2 实现 tensorrt 推理

简述 在最开始的yolov8提供的不同size的版本,包括n、s、m、l、x(模型规模依次增大,通过depth, width, max_channels控制大小),这些都是通过P3、P4和P5提取图片特征; 正常的yolov8对象检测模型输出层是P3、…

【WCA-KELM预测】基于水循环算法优化核极限学习机回归预测研究(Matlab代码实现)

💥💥💞💞欢迎来到本博客❤️❤️💥💥 🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。 ⛳️座右铭&a…

springboot实现消息通知需求

springboot实现消息通知需求 参考: Springboot整合Websocket(推送消息通知) SpringBoot使用SSE进行实时通知前端 vuespringbootwebsocket实现消息通知,含应用场景

CNN记录】pytorch中flatten函数

pytorch原型 torch.flatten(input, start_dim0, end_dim- 1) 作用:将连续的维度范围展平维张量,一般写再某个nn后用于对输出处理, 参数: start_dim:开始的维度 end_dim:终止的维度,-1为最后…

Python实现一个简单的http服务,Url传参输出html页面

摘要 要实现一个可以接收参数的HTTP服务器,您可以使用Python标准库中的http.server模块。该模块提供了一个简单的HTTP服务器,可以用于开发和测试Web应用程序。 下面是一个示例代码,它实现了一个可以接收参数的HTTP服务器: 代码…

关于单机流程编排技术——docker compose安装使用的问题

最近在学习docker相关的东西,当我在docker上部署了一个nest应用,其中该应用中依赖了一个基于mysql镜像的容器,一个基于redis镜像的容器。那我,当我进行部署上线时,在启动nest容器时,必须保证redis容器和mys…