HAL库:中断 方式按键检测:抬起执行、按下执行、长按短按检测、延时执行

news/2024/9/13 22:47:35/ 标签: stm32, 汇编, 单片机

目录

HAL库:中断 方式按键检测:抬起执行、按下执行、长按短按检测、延时执行

注意事项:

初始化部分:

回调函数部分


HAL库:中断 方式按键检测:抬起执行、按下执行、长按短按检测、延时执行

注意事项:

  • 中断线列表 在stm32xb.h中 有写

  • 中断函数 在.s汇编启动文件中 有写

  • HAL库在各个外设已经做好了检测外部中断等等的函数。对回调函数这些不太理解的 具体见这篇博客HAL库中断处理函数 及 weak弱声明中断回调函数-CSDN博客

  • HAL_Delay阻塞问题

    在这里,消抖的方法时使用较为简单的HAL_Delay的延时函数。

    在ST官方中,对HAL_Delay是这样描述的:

    大概的意思是:HAL_Delay函数是基于系统滴答定时器中断来累增计数产生延时效果。是这表明如果该函数被调用别的中断处理函数里,系统滴答定时器的中断就必须比这个外设中断的优先级高,否则这个外设中断将被阻塞。 (可以理解为,滴答定时器被一个优先级更高的中断给阻塞了。而这个中断又需要大大定时器。)

    这里只学习使用,一般不用这种方式

初始化部分:

  • 输入值为模式。0为按下执行,1抬起执行
  • 根据选择的模式,设置检测上升沿、下降沿进入中断(按键低电平有效)
    • 按下执行:检测下降沿
    • 抬起执行:检测上升沿
  • HAL_Delay阻塞问题:设置滴答定时器为最高优先级
  • 配置优先级和使能中断线
void KEY_Init_IT(uint8_t mode)
{__HAL_RCC_GPIOB_CLK_ENABLE();   //开启GPIOB时钟GPIO_InitTypeDef GPIO_InitStructure;if(mode == 0)   //判断模式:是否为按下执行{GPIO_InitStructure.Mode = GPIO_MODE_IT_FALLING; //下降沿进入中断 模式}else    //否则为抬起执行{GPIO_InitStructure.Mode = GPIO_MODE_IT_RISING; //上升沿进入中断  模式}GPIO_InitStructure.Pin = GPIO_PIN_0 | GPIO_PIN_10;GPIO_InitStructure.Pull = GPIO_PULLUP; HAL_GPIO_Init(GPIOB,&GPIO_InitStructure);//配置PB 10 、 0的模式//HAL库默认中断分组为组4 抢占4 响应0HAL_NVIC_SetPriorityGrouping(NVIC_PRIORITYGROUP_4);//设置中断优先级HAL_NVIC_SetPriority(EXTI0_IRQn,4,0);   //抢占和响应HAL_NVIC_EnableIRQ(EXTI0_IRQn); //使能HAL_NVIC_SetPriority(EXTI15_10_IRQn,4,0);   //抢占和响应(这里设置的抢占优先级更高)HAL_NVIC_EnableIRQ(EXTI15_10_IRQn); //使能HAL_NVIC_SetPriority(SysTick_IRQn,0,0);//设置滴答定时器为最高优先级,否则会卡死在HAL_Delay函数中
}

回调函数部分

对抬起和按下分别判断。 在按下有效时只可能进入按下判断部分; 在抬起有效时,只可能进入抬起检测部分。 因为波动导致时间不够会直接退出中断。

//定义 (强声明的) HAL库回调函数
void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
{switch(GPIO_Pin)//根据进入时的Pin值来选择不同的动作{case GPIO_PIN_0 : {if(KEY1_IN == 0)//判断按下{HAL_Delay(10);      //消抖if(KEY1_IN == 0)    //确实按下{HAL_GPIO_TogglePin(GPIOB,GPIO_PIN_15);}}else if(KEY1_IN == 1)//判断抬起{HAL_Delay(10);      //消抖if(KEY1_IN == 1)    //确实抬起{HAL_GPIO_TogglePin(GPIOB,GPIO_PIN_15);}}break;}case GPIO_PIN_10 : {if(KEY2_IN == 0)//判断按下{HAL_Delay(10);      //消抖if(KEY2_IN == 0)    //确实按下{HAL_GPIO_TogglePin(GPIOB,GPIO_PIN_15);}}else if(KEY2_IN == 1)//判断抬起{HAL_Delay(10);      //消抖if(KEY2_IN == 1)    //确实抬起{HAL_GPIO_TogglePin(GPIOB,GPIO_PIN_15);}}break;}   }
}


http://www.ppmy.cn/news/1516271.html

相关文章

《黑神话·悟空》:国产3A大作背后是用什么语言开发的?

🎬 鸽芷咕:个人主页 🔥 个人专栏: 《C干货基地》《粉丝福利》 ⛺️生活的理想,就是为了理想的生活! 引言: 近年来,国产游戏产业发展迅速,涌现出了许多优秀的作品。《黑神话悟空》作为一款备受瞩…

LeetCode Hot100:128、最长连续序列

题目:最长连续序列 给定一个未排序的整数数组 nums ,找出数字连续的最长序列(不要求序列元素在原数组中连续)的长度。 请你设计并实现时间复杂度为 O(n) 的算法解决此问题。 方案一:哈希表 class Solution { public…

用爬虫玩转石墨文档细解

​ ​ 您好,我是程序员小羊! 前言 石墨文档是一款受欢迎的在线协作工具,它允许多人实时编辑和共享文档。通过爬虫技术,我们可以自动化地获取石墨文档中的内容,进行数据分析或备份。不过,在使用爬虫技术时&a…

Python 爬虫入门(十二):正则表达式「详细介绍」

Python 爬虫入门(十二):正则表达式 前言一、正则表达式的用途二、正则表达式的基本组成元素2.1 特殊字符2.2 量词2.3 位置锚点2.4 断言2.5 字符集2.6 字符类2.6.1 基本字符类2.6.2 常见字符类简写2.6.3 POSIX字符类2.6.4 组合使用 三、 正则表…

DVWA靶场通关(CSRF)

CSRF 是跨站请求伪造,是指利用受害者尚未失效的身份认证信息(cookie、会话等),诱骗其点击恶意链接或者访问包含攻击代码的页面,在受害人不知情的情况下以受害者的身份向(身份认证信息所对应的)服…

第七章 项目布局实现(7.4.4)——全屏功能

7.4.4 全屏功能 全屏功能通过 VueUse 实现。VueUse 基于 Vue 组合式 API 的实用工具集,功能非常丰富。 官网:https://vueuse.org/ 安装 npm i @vueuse/core当前 package.json 文件: {"name": "yumi-admin","private":

前端宝典十五:设计模式之前端开发5大设计原则

本文主要探讨前端开发设计原则: 单一职责原则 开闭原则 里氏替换原则 接口隔离原则 依赖倒置原则 一、单一职责原则(Single Responsibility Principle,SRP) 1、介绍: 一个类应该只有一个引起它变化的原因。这意味着…

基于Modbus的MFC智能控制

1. 系统概述 利用LabVIEW通过Modbus 485协议实现对七星(Sevenstar)品牌质量流量控制器(MFC)的智能化控制。该系统将自动控制多个MFC的流速,实时监控其状态,并根据需要进行调整。 2. 硬件配置 MFCs: 七星品…

Python和MATLAB梯度下降导图

🎯要点 寻找局部最小值普通最小二乘法和随机梯度下降的动量线性回归媒体广告销售光学字符识别和最小化均方误差男女医疗费用最快速下降方向函数优化等高线图可视化共轭梯度下降可视化损失函数、动量、涅斯特洛夫动量、权衰减量化不确定性拓扑结构算法分类中权重归一…

SE11 没有激活的名称表存 No active nametab exists for

背景: SE11中减少某个非空表的字段的长度后,在SE14中的操作不当,并且对该表进行了删除重建的操作后,发生SE11激活该表报错。 原因: 出现了一些未知原因,导致该表在底层数据库存在,但是运行时对…

cpu steal非常高

steal代表非自愿等待,这个值出现说明服务器cpu争用很严重,cpu资源不足 ctxt,这个值代表cpu上下文切换次数/proc/stat 是一个伪文件系统(procfs)中的文件,它提供了系统级别的统计信息。这个文件包含了CPU使用…

Spring + Boot + Cloud + JDK8 + Elasticsearch 单节点 模式下实现全文检索高亮-分页显示 快速入门案例

1. 安装elasticsearchik分词器插件 sudo wget https://release.infinilabs.com/analysis-ik/stable/elasticsearch-analysis-ik-8.13.4.zip sudo mkdir -p ./es_plugins/analysis-ik sudo mkdir ./es_data sudo unzip elasticsearch-analysis-ik-8.13.4.zip -d ./es_plugins/a…

数据结构-全部由1组成的子矩形数量

给定一个二维数组matrix, 其中的值不是0就是1, 返回全部由1组成的子矩形数量。 import java.util.Stack;public class CountSubmatricesWithAllOnes {public static void main(String[] args) {int[][] mat {{1,1,1,1,1,1},{1,1,1,1,1,1},{1,1,1,1,1,1}};System.o…

腾讯云是什么?为什么选择它?

腾讯云是什么? 腾讯云(Tencent Cloud)是全球领先的云计算服务提供商,凭借其强大的技术实力和丰富的行业经验,腾讯云为全球超过100万用户提供稳定、可靠、高效的云计算服务。无论是初创企业,还是大型企业&a…

22. K8S及DevOps

22. K8S及DevOps 一. 章节简介二. DevOps1. 简介2. CICD三. Kubernetes[1. 官网](https://kubernetes.io/zh-cn/)--------------------------------------------------------------------------------------------------------一. 章节简介 二. DevOps 1. 简介 2. CICD

element表格导出

element表格导出 使用了xlsx插件做表格下载 1、首先安装xlsx插件 import XLSX from ‘xlsx’ 2、在el-table上添加ref 3、导出方法 downloadFun() {const tableElement this.$refs.table.$elconst ws XLSX.utils.table_to_sheet(tableElement)// 创建工作簿并添加工作表…

Mybatis--其他查询操作和数据库连接池(下下)

序 准备工作: mysql数据库和表的信息更新: DROP TABLE IF EXISTS articleinfo;CREATE TABLE articleinfo (id INT PRIMARY KEY auto_increment,title VARCHAR ( 100 ) NOT NULL,content TEXT NOT NULL,uid INT NOT NULL,delete_flag TINYINT ( 4 ) DEF…

E. Linear Kingdom Races

https://codeforces.com/problemset/problem/115/E 线段树优化dp O(n2)->O(nlogn) 分析题意发现可以有暴力dp dp(i)是前i条路最大利润 dp(i)dp(i-1)不选第i条路 dp(i)max(dp(j)val(j)-cost(j))选这i条路 dp(i)max(dp(i-1),max(dp(j)val(j)-cost(j)) 显然右边值可以用…

每天一个数据分析题(四百九十六)- 决策树模型

回归树是可以用于回归的决策树模型,一个回归树对应着输入空间(即特征空间)的一个划分以及在划分单元上的输出值。以下哪个指标可用于回归树中的模型比较 A. Adjusted R2 B. F-measure C. AUC D. Precision & Recall 数据分析认证考试…

在rk设备上挂载windows上某个文件夹,通过SSH实时将打包的文件保存至windows上

一、简介 要实现将实时打包的镜像文件直接保存到Windows上,而不是先在RK3588设备上创建镜像然后再传输,你可以通过网络挂载Windows上的共享文件夹到RK3588设备上。这样你可以将镜像直接写入到Windows设备的存储中,而不占用RK3588设备的内存空间。 二、步骤1:在Windows上设…