STM32开发(十三)STM32F103 片内资源 —— 外部中断 按键 详解

news2025/3/10 10:48:32

文章目录

    • 一、基础知识点
    • 二、开发环境
    • 三、STM32CubeMX相关配置
    • 四、Vscode代码讲解
    • 五、结果演示


一、基础知识点

外部中断/事件控制器主要特征:

  • 每个中断/事件都有独立的触发和屏蔽
  • 每个中断线都有专用的状态位
  • 支持多达20个软件的中断/事件请求
  • 检测脉冲宽度低于APB2时钟宽度的外部信号

内部框图
在这里插入图片描述
边沿检测电路可以通过配置上升沿触发选择寄存器或者下降触发选择寄存器来检测输入的信号
触发信号可以从边沿检测电路获取到也可以通过配置软件中断事件寄存器来触发中断事件
若有触发信号产生就会请求挂起(配置请求挂起寄存器
事件屏蔽寄存器配置则会结合触发信号产生脉冲发生器
若配置中断屏蔽寄存器并且有中断挂起就会触发NVIC中断控制产生中断事件

外部中断通路选择
在这里插入图片描述
共有16根外部中断线
PA0-PG0引脚都能触发EXTI0中断,当是注意的是,如EXTI0有选择位,选择哪个引脚线上的中断。
换言之,选择PA0触发EXTI0中断,那么接在EXTI0上的其他引脚就不能再用了。 所以在设计原理图的时候一定要注意。

了解STM32 片内资源外部中断。本实验基于STM32F103开发 实现 按键功能。


二、开发环境

1、硬件开发准备
主控:STM32F103ZET6
在这里插入图片描述
2、软件开发准备
软件开发使用虚拟机 + VScode + STM32Cube 开发STM32,在虚拟机中直接完成编译下载。
该部分可参考:软件开发环境构建


三、STM32CubeMX相关配置

1、STM32CubeMX基本配置
本实验基于 CubeMX详解构建基本框架进行开发。

2、GPIO 配置
在这里插入图片描述
本实验以按键为例确定外部触发模式为:下降沿触发

2、NVIC 优先级配置
在这里插入图片描述
配置四个按键外部触发等级。(数值越小,优先等级越高)


四、Vscode代码讲解

1、定义按键相关结构体,以及初始化

typedef struct Key_s
{
  uint32_t volatile key_flag;        // 触发标志位
  uint32_t key_press;                // 单机按键
  uint32_t key_hold;                 // 长按按键
  void (*Key_Monitoring_Function)(void);    // 按键监测函数
} Key_t;

extern Key_t Key1;
extern Key_t Key2;
extern Key_t Key3;
extern Key_t Key4;

Key_t Key1 = {FALSE, FALSE, FALSE, Key1_Monitoring_Function };
Key_t Key2 = {FALSE, FALSE, FALSE, Key2_Monitoring_Function };
Key_t Key3 = {FALSE, FALSE, FALSE, Key3_Monitoring_Function };
Key_t Key4 = {FALSE, FALSE, FALSE, Key4_Monitoring_Function };

2、按键具体监测函数(以一个key1为例🌰)

static void Key1_Monitoring_Function(void)
{
  if(Key1.key_flag == TRUE)                                // 监测按键按下
  {
    Key1.key_press = FALSE;                                // 初始化按键状态:长按状态
    Key1.key_hold = TRUE;

    for(int i=0; i<200; i++)                                // 循环2s,如果中间没有检测到高电平(按键松开),即长按状态
    {
      HAL_Delay(10);
      if(GPIO_PIN_SET == HAL_GPIO_ReadPin(KEY1_GPIO_Port, KEY1_Pin))    // 监测到按键松开,即单击按键
      {
        Key1.key_press = TRUE;                               // 配置单击按键状态,跳出循环
        Key1.key_hold = FALSE;
        break;
      }
    }
  }

  if( Key1.key_press == TRUE )                        // 判断为单击按键,做的具体动作(这里继电器翻转)
  {
    Relay.Filp();
  }

  if( Key1.key_hold == TRUE )                        // 判断为长按按键,做的具体动作(这里继电器开关一次)
  {
    Relay.On();
    HAL_Delay(500);
    Relay.Off();
  }

  Key1.key_flag = FALSE;                            // 按键状态初始化
  Key1.key_press = FALSE;
  Key1.key_hold = FALSE;
}

3、外部中断触发,改变按键flag状态 (先了解下外部触发中断处理函数,以一个key1为例🌰)

// Core/Src/stm32f1xx_it.c
void EXTI0_IRQHandler(void)                // 外部触发函数
{
  /* USER CODE BEGIN EXTI0_IRQn 0 */

  /* USER CODE END EXTI0_IRQn 0 */
  HAL_GPIO_EXTI_IRQHandler(GPIO_PIN_0);
  /* USER CODE BEGIN EXTI0_IRQn 1 */

  /* USER CODE END EXTI0_IRQn 1 */
}

void HAL_GPIO_EXTI_IRQHandler(uint16_t GPIO_Pin)
{
  /* EXTI line interrupt detected */
  if (__HAL_GPIO_EXTI_GET_IT(GPIO_Pin) != 0x00u)       // 外部中断线检测
  {
    __HAL_GPIO_EXTI_CLEAR_IT(GPIO_Pin);                // 检测到外部中断线后,先清除中断标志位
    HAL_GPIO_EXTI_Callback(GPIO_Pin);                  // 调用回调函数(具体实现)
  }
}

__weak void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)        // 这里回调函数是弱函数,可以重新构建
{
  /* Prevent unused argument(s) compilation warning */
  UNUSED(GPIO_Pin);
  /* NOTE: This function Should not be modified, when the callback is needed,
           the HAL_GPIO_EXTI_Callback could be implemented in the user file
   */
}

以上所诉,回调函数是弱函数,可以重新构建。重构之后的回调函数会被真正被调用。

 void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)        // 回调函数重构
 {
    switch (GPIO_Pin)                                    // 判断是哪个引脚触发的中断,对应设置flag标志位
    {
        case KEY1_Pin: Key1.key_flag = TRUE; break;
        case KEY2_Pin: Key2.key_flag = TRUE; break;
        case KEY3_Pin: Key3.key_flag = TRUE; break;
        case KEY4_Pin: Key4.key_flag = TRUE; break;

        default: break;
    }
 }

五、结果演示

 大家可以按照步骤实现功能,实现效果可以在评论区交流学习哦!!!!

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

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

相关文章

校园一键报警柱的作用

校园一键报警柱是一种用于校园安全的紧急报警系统&#xff0c;可以随时随地向校园安全管理部门发送紧急警报。这种系统通常采用带有紧急按钮的电缆或无线警报装置&#xff0c;使学生、教师和工作人员可以在出现紧急情况时轻松报告安全问题&#xff0c;迅速地通知校园安全人员&a…

彻底理解java中泛型

一、什么是泛型&#xff1f; 泛型是JDK5引入的一种特性&#xff0c;是一种类型安全检测机制&#xff0c;开发者在编译阶段发现类型相关的报错。 泛型即参数类型化&#xff0c;将操作的数据类型定义为参数&#xff0c;可定义在类、接口、方法中。 可以把类型参数看作是使用参数化…

CorelDRAW2023中文版矢量制图及设计软件更新发布

矢量制图及设计软件&#xff0c;CorelDRAW Graphics Suite 2023中文版&#xff08;以下简称CorelDRAW 2023&#xff09;对新手来说&#xff0c;对于自己多久才能学会cdr软件这个问题是比较关心的。如果你的学习能力比较强&#xff0c;一周时间是有可能完全学会cdr的。但由于每个…

您可以找到的 5 种最佳数据恢复软件

数据恢复软件对很多人来说是一个非常有价值的工具。无论您是否意识到&#xff0c;宝贵的数据都有被删除的风险&#xff0c;而且很多人直到丢失数据才知道数据的价值。 5 种数据恢复软件 如果发生这种情况&#xff0c;您需要最好的软件来恢复数据并确保这种情况不会再次发生。这…

PostgreSQL 函数(一) 数学函数和字符串函数

1.数学函数 1.1.符号函数sign 用于判断正负 1.2.求余函数mod 1.3.圆周率函数pi 1.4.平方根函数sqrt 1.5.向上取整函数ceil和ceiling 1.6.向下取整函数floor 1.7.绝对值函数abs 1.8.四舍五入函数round 第2位参数为保留位数 1.9.其他函数 正弦函数sin, 反正弦函数asin, 余弦…

考研复试确认神操作!

终于进行到了研究生考试的尾声&#xff0c;但让考生感到无力吐槽的事情&#xff0c;却还在继续上演&#xff0c;比如苏科大&#xff0c;再比如中地大、苏大&#xff0c;三所学校的神操作&#xff0c;着实让无数考生忍不住调侃&#xff1a;原来考研不仅拼实力&#xff0c;还得拼…

类ChatGPT代码级解读:如何从零起步实现Transformer、llama/ChatGLM

前言 最近一直在做类ChatGPT项目的部署 微调&#xff0c;关注比较多的是两个&#xff1a;一个LLaMA&#xff0c;一个ChatGLM&#xff0c;会发现有不少模型是基于这两个模型去做微调的&#xff0c;说到微调&#xff0c;那具体怎么微调呢&#xff0c;因此又详细了解了一下微调代…

欧拉回路问题

文章目录 欧拉回路程序设计程序分析欧拉回路 有一条名为Pregel的河流经过Konigsberg城。城中有7座桥,把河中的两个岛与河岸连接起来。当地居民热衷于一个难题:是否存在一条路线,可以不重复地走遍7座桥。这就是著名的七桥问题。它由大数学家欧拉首先提出,并给出了完美的解答…

MapReduce简介

MapReduce是一个编程模型&#xff0c;用于处理和生成大数据。用户通过编写Map函数处理输入键值对生成中间键值对&#xff0c;通过编写Reduce函数来合并所有的中间键值对并生成结果。在我们的日常生活中&#xff0c;大部分的任务都可以被抽象成一个MapReduce模型&#xff0c;并通…

6.1 总体和样本

学习目标&#xff1a; 要学习总体和样本&#xff0c;可以按照以下步骤进行&#xff1a; 了解总体和样本的概念&#xff1a;总体是指研究对象的全体&#xff0c;样本是从总体中随机抽取的一部分。了解它们的概念有助于后续学习。 掌握简单随机抽样的方法&#xff1a;简单随机…

HTML学习(1)

文章目录HTML初识第一个HTML程序HTML元素HTML属性HTML标题HTML段落HTML样式格式化标签HTML引用HTML注释HTMLCSSHTML链接HTML图片HTML表格HTML列表HTML块我的个人博客&#xff1a;欢迎来逛逛 HTML初识 HTML全称是&#xff1a;Hyper Text Markup Language HTML不是一种编程语言…

如何在Windows系统上制作U盘启动盘?

使用U盘重装Windows电脑系统&#xff0c;对于熟悉电脑的人来说十分常见&#xff0c;但是不少电脑小白并不会制作U盘启动盘。U盘启动盘是包含操作系统的外部硬盘驱动器&#xff0c;可用于启动计算机或笔记本电脑。下面我们就来了解一下如何制作U盘启动盘。 注意&#xff1a; U …

在芯片行业,想要达到年薪百万难吗?

近两年芯片行业爆火&#xff0c;受到了方方面面的关注。新的一年新的开始&#xff0c;现在这个行业的真实情况到底如何&#xff1f;从事芯片行业有没有前途&#xff1f;下面就来具体谈一谈&#xff0c;希望能给想入高薪行业的你一些帮助。 芯片工程师为什么这么贵&#xff1f;…

ControlNet 1.1重磅发布,14个模型全部开源!

来源&#xff1a;https://github.com/lllyasviel/ControlNet-v1-1-nightly ControlNet 1.1 与 ControlNet 1.0 具有完全相同的体系结构,ControlNet 1.1 包括所有以前的模型&#xff0c;具有改进的稳健性和结果质量,并添加了几个新模型。 模型命名规则更新 从 ControlNet 1.1 开…

英汉互译在线翻译-英文翻译中文的翻译

您是否曾经遇到需要翻译英语文件&#xff0c;但被繁琐的翻译过程所拖慢了工作进度&#xff1f;或者遭遇了机器翻译的低准确率和翻译错误困扰&#xff1f;如果是这样&#xff0c;那么我们的英语翻译中文转换器将是您在这方面的最佳选择&#xff01; 我们的英语翻译中文转换器是…

CSS学习(2) - 边距与高宽 + 框模型

文章首发于&#xff1a;欢迎大佬们前来逛逛 文章目录CSS边框边框样式边框宽度边框颜色单独设置边框边框属性简写圆角边框CSS边距外边距外边距合并CSS内边距内边距与内容宽度CSS高度与宽度CSS框模型CSS边框 border 属性能够设置边框的属性&#xff0c;包括样式&#xff0c;颜色…

vscode连接Linux开发

vscode远程开发Linux项目 1、首先在vscode中下载安装 Remote SSH。 安装完成后 vscode 左侧就会出现下面的图标。 2、配置远程Linux的信息 # Read more about SSH config files: https://linux.die.net/man/5/ssh_config # Host centos # HostName 192.168.88.10 # …

14. unity粒子特效--速度、粒子环绕、力(重力、阻力、风力等)、噪音

1. 渐变速度&#xff08;Velocity over Time&#xff09; 可以分别指定x,y,z三个方向的速度&#xff0c;最终的速度是三个方向的速度合成&#xff0c;点击右侧的下拉三角&#xff0c;也可以使用曲线进行速度的控制调节&#xff0c;如下图所示&#xff1a; 2. 粒子环绕 粒子…

数据治理:1分钟教你认识和识别主数据

​我们讲元数据是企业数据管理的基石&#xff0c;主数据是企业经营运作的主体对象。一般而言&#xff0c;都是从元数据或主数据切入&#xff0c;再逐步展开数据治理的其他领域。企业数据的范围很广而且在不断的增加和演变&#xff0c;哪些数据应该作为主数据加以合理的管理&…

【JSON学习笔记】1.JSON 简介及语法

前言 本章介绍JSON及其语法。 JSON 教程 JSON: JavaScript Object Notation(JavaScript 对象表示法) JSON 是存储和交换文本信息的语法&#xff0c;类似 XML。 JSON 比 XML 更小、更快&#xff0c;更易解析。 JSON 易于人阅读和编写。 C、Python、C、Java、PHP、Go等编程…