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

news2024/12/24 8:08:44

目录

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 响应0
    HAL_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.coloradmin.cn/o/2076796.html

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

相关文章

如何在CMD/PowerShell中使用命令行管理IIS

使用通用IIS命令行管理工具: C:\Windows\System32\inetsrv\appcmd.exe 查看现有站点 1 appcmd list site 添加一个新站点 1 appcmd add site /name:"My New Site" /id:2 /bindings:http/*:81: /physicalPath:"c:\inetpub\mynewsite" /name …

559. N 叉树的最大深度(迭代法)

目录 一:题目: 二:代码: 三:结果: 一:题目: 给定一个 N 叉树,找到其最大深度。 最大深度是指从根节点到最远叶子节点的最长路径上的节点总数。 N 叉树输入按层序遍历…

学习系列三:V8目标检测与分割自动化标注

学习系列三:YOLOv8目标检测与分割自动化标注 提示:本次文章主要介绍yolov8目标检测与自动化标注(较简单,通用性比较强,标签格式txt),yolov8实例分割与自动化标注(程序较复杂,自动化标注效果有待提升,标签格…

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

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

柔版印刷版市场前景:预计2030年全球市场规模将达到20.9亿美元

一、当前市场状况 目前,柔版印刷版市场呈现出较为稳定的发展态势。随着全球经济的逐步复苏,包装印刷等领域对柔版印刷版的需求持续增长。柔版印刷版具有环保、高效、印刷质量高等特点,在食品包装、标签印刷等行业中得到广泛应用。 全球前四…

微信聊天记录删除怎么恢复?两个抱藏方法快速恢复数据

微信作为我们日常沟通的重要工具,存储了大量的聊天记录,这些记录往往承载着珍贵的记忆或重要的工作信息。我们在日常使用微信时不小心左滑删除了和领导的聊天记录!里面还有很重要的工作内容,删除的微信聊天记录怎么恢复啊&#xf…

环境问题处理:Python写工具,转换excel内容合并到xml中(openpyxllxml)

问题描述 提示报错,但是没有像java代码的解决方案推荐。 Note:PycharmProjects\项目名\venv\Scripts 创建项目时自带的脚本,也包含python.exe 查看python文件有输出路径,使用python也能打开python3.8,但是无法查找pyt…

Java学习_22_网络编程

文章目录 前言网络编程网络编程三要素IPInetAddress 端口号协议OSI七层模型TCP/IP模型UDP协议TCP协议 综合练习多发多收接收和反馈上传文件上传文件重名问题上传文件多线程问题上传文件线程池问题BS架构 总结 前言 博客仅记录个人学习进度和一些查缺补漏。 学习内容&#xff1…

软考:一个月拿下软件设计师

前言 软考我满打满算也就准备了一个月不到,期间也走了不少弯路;特地做个博客记录一下,也给其它备考的人一些建议。 我是24年上半年参加的考试,说实在的这年下午题有几道不好写。 只要上午成绩和下午成绩都过45就算及格了。 正文…

【Git保姆级使用教程】Git从入门到精通超级详细的使用教程,一套教程带你搞定Git(高见龙版本)。

目录 Git下载与安装设置GitGit的用户设置 使用Git新增初始Repository将文件交给Git管控(将文件加入暂存区)查看Git文件记录查找commit记录更改提交commit的记录撤销提交commit 将某些文件取消Git版控Git中删除或更改文件名Git查看某个文件的某一行代码是谁写的.git目录中有什么…

Tower for Mac Git客户端管理软件

Mac分享吧 文章目录 效果一、下载软件二、开始安装1、双击运行软件,将其从左侧拖入右侧文件夹中,等待安装完毕2、应用程序显示软件图标,表示安装成功 三、运行测试1、打开软件,测试2、克隆项目,测试 安装完成&#xf…

港股震荡中保持乐观,市场信心回来了!

港股上午盘三大指数集体上涨,恒生科技指数一度冲高至1.54%,最终收涨0.98%,恒生指数上涨1.06%。盘面上,大型科技股多数维持上涨行情,百度、腾讯涨超1.5%,快手、美团小幅上涨,阿里巴巴、京东飘绿&…

Java:Date类

文章目录 Date类常用方法代码演示 SimpleDateFormat常用方法代码演示时间格式常见符号SimpleDateFormat解析字符串为Date对象代码总结 案例:秒杀活动: 黑马学习笔记 这些方法在API文档都能查到 Date类 常用方法 代码演示 package Time;import java.uti…

杰发科技AC7801——Flash模拟EEP内存(2)

1. 默认配置在1000个地址存储1000个数据 配置如下 计算地址 查看地址内容,等到打印完成 计算符合,从0-999共计1000 2. 修改配置在65536地址存储65536个数据 配置还是这个 因为传进去的地址是uint16_t,因此最大值是65536,写65536…

mp总结 mybatisPlus

一、准备 1.引入依赖&#xff08;引入后可以不再引mybatis依赖&#xff09; <dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus-boot-starter</artifactId><version>3.4.2</version> </dependency> 2.…

Leetcode JAVA刷刷站(95)不同的二叉搜索数 ||

一、题目概述 二、思路方向 为了生成所有由 n 个节点&#xff08;值从 1 到 n&#xff09;组成的不同二叉搜索树&#xff08;BST&#xff09;&#xff0c;我们可以采用递归的方式。核心思想在于&#xff0c;对于每个数字 i&#xff08;从 1 到 n&#xff09;&#xff0c;我们可…

【C语言报错已解决】 `Buffer Overflow`

&#x1f3ac; 鸽芷咕&#xff1a;个人主页 &#x1f525; 个人专栏: 《C干货基地》《粉丝福利》 ⛺️生活的理想&#xff0c;就是为了理想的生活! 文章目录 引言一、问题描述&#x1f469;‍&#x1f52c;报错示例&#x1f4da;报错分析&#x1f4da;解决思路 二、解决方法&a…

麒麟V10(x86_64)安装部署MySQL-5.1.70

麒麟V10(x86_64)安装部署MySQL-5.1.70 1. 主机信息 [kalamikysrv1 ~]$ uname -a Linux kysrv1 4.19.90-24.4.v2101.ky10.x86_64 #1 SMP Mon May 24 12:14:55 CST 2021 x86_64 x86_64 x86_64 GNU/Linux [kalamikysrv1 ~]$ [kalamikysrv1 ~]$ uname -m x86_64 [kalamikysrv1 ~…

深度学习模板方法设计模式

文章目录 前言一、介绍二、特点三、详细介绍1.核心组成2.代码示例3.优缺点优点缺点 4.使用场景 总结 前言 模板方法设计模式是行为型设计模式&#xff0c;主要是定义算法框架&#xff0c;并将一些步骤的实现延迟到子类&#xff0c;重新定义算法的步骤。 一、介绍 模板设计模式…

项目初始化踩坑记录

dependence not found: D:/yupiProject/yubi-bi-frontend/node_modules/umijs/plugins/node_modules/react-intl 这个没有在github上找到解决方法&#xff0c;于是我在命令行 npm install 执行这个之后&#xff0c;就可以重新运行了 思考过程&#xff1a;突然空了个文件我…