首页 > 其他分享 >STM32G431RBT6按键模块04

STM32G431RBT6按键模块04

时间:2024-03-22 21:33:18浏览次数:18  
标签:HAL sta 04 STM32G431RBT6 interrupt key 按键 judge GPIO

按键用法:

  •  短按
  • 长按
  • 双击/三击

按键电平变化:按下为0,弹起为1

  1. cubeMX中配置按键引脚并将其设置为上拉

     

  2. 设置定时器,时钟源,分频系数,重装载值

     时钟源:Internal Clock; Prescaler:79; Counter Period:9999 ;  这样的设置是10ms中断一次

  3. 使能中断

     

  4. interrupt.c && interrupt.h
    重写中断处理函数

     

  5. interrupt.h
    #ifndef _INTERRUPT_H
    #define _INTERRUPT_H
    #include "main.h"
    #include "stdbool.h"
    struct keys
    {
        uchar judge_sta;
        bool key_sta;
        bool single_flag;
    };
    void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim);
    

    #endif

     

  6. interrupt.c

     

    #include "interrupt.h"
    

    struct keys key[4]={0,0,0};
    void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
    {
    if(htim->Instance==TIM3)
    {
    key[0].key_sta=HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_0);
    key[1].key_sta=HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_1);
    key[2].key_sta=HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_2);
    key[3].key_sta=HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_0);
    }

    for(int i=0;i<4;i++)
    {
        switch(key[i].judge_sta)
        {
            case 0:
            {
                if(key[i].key_sta==0)
                    key[i].judge_sta=1;
            }
            break;
            case 1:
            {
                if(key[i].key_sta==0)
                {
                    key[i].judge_sta=2;
                    key[i].single_flag=1;
                }else{
                    key[i].judge_sta=0;
                }
            }
            break;
            case 2:
            {
                if(key[i].key_sta==1)
                    key[i].judge_sta=0;
            }
            break;
        }
    }
    

    }

      

  7. main.c
    用extern导入外部变量
    注意格式不是:struct keys key[4]={0,0,0};
    而是:struct keys key[4];

     开中断

     

  8. 注意LED对应的数据
    LED1 0X01
    LED2 0X02
    LED3 0X04
    LED4 0X08
    LED5 0X10
    LED6 0X20
    LED7 0X40
    LED8 0X80

标签:HAL,sta,04,STM32G431RBT6,interrupt,key,按键,judge,GPIO
From: https://www.cnblogs.com/WangLiy/p/18069765

相关文章

  • STM32G431RBT6之LCD03
    导入三个文件lcd.c&&lcd.h&&fonts.h  初始化&&界面显示LCD_Init();LCD_Clear(Black);LCD_Clear(Black);LCD_SetBackColor(Black);LCD_SetTextColor(White);chartemp[20];LCD_DisplayStringLine(Line1,(u8)"DATA");spri......
  • vue或react项目上线刷新出现404的原因以及解决办法
    问题描述:vue/react项目,正常的页面操作跳转,不会出现404的问题,但是一旦刷新,就会出现404报错。产生原因:我们打开vue/react打包后生成的dist文件夹,可以看到只有一个index.html文件及一些静态资源,这个是因为vue/react是单页应用(SPA),只有一个index.html作为入口文件,其它的路由都是通......
  • Java 04 杂
    1.Scannerjava.io包的PrintWriter类可用于以通常可读的形式(文本)写入输出数据。java.util包的Scanner类用于从不同的源(例如输入流,用户,文件等)读取输入数据Scannerinput=newScanner(System.in);System.out.print("输入姓名:");//从键盘接收输入......
  • 算法练习Day04
    有hr说什么现在软件谁还用c++,都是rust了虽然但是他也太以偏概全了,,((烧饼吧1.两两交换链表中的节点思路:将链表中相邻的节点两两交换,则交换的步骤是eg:[0]->[1]->[2]->[3]->[4]交换1和2,3和4;则交换的步骤是,先让0指向2,再让2指向1,最后让1指向3,即完成了一次交换;此时需要......
  • AT_agc044_c
    problem&blog由于看到和三进制有关的操作,可以想到建造每个结点都有三个儿子的Trie。考虑维护两种操作。1.Salasa舞对于这种操作,就是把每一个节点的第一个儿子和第二个儿子交换。所以两个节点打个标记即可2.Rumba舞本质即为\(0\to1,1\to2,2\to0\)。前两者不用进......
  • 基于STM32单片机图书馆智能节能灯热释人体感应光照设计21-304
    21-304、STM32图书馆智能节能灯设计-LCD1602-热释-光敏-拨动-KEY-RELAY产品功能描述:本设计由STM32F103C8T6单片机核心板电路+拨动开关电路+按键电路+2路继电器控制电路+热释人体红外模块电路+光照检测电路+LCD1602液晶显示电路+电源电路组成1、通过拨动开关选择系统工作模式......
  • C语言-教案04(从小白到劝退之运算符)
    算术运算符运算符功能说明举例+加法,一目取正a+b-减法,一目取负a-b*乘法a*b/除法a/b%取模(求余)a%b++自加1a++,++b--自减1a--,--b关注点:减号也是负号,比如-a是取变量a的相反数。取模运算要求左右两边操作数必须是整型数据......
  • Ubuntu2204 GUI root用户无法登录的处理方法
    Ubuntu2204GUIroot用户无法登录的处理方法背景今天上午同事cloneubuntu2204之后想通过GUI登录修改IP以及进行一些安全设置发现root用户登录输入密码后就会返回登录界面.会进入一个无线死循环的额状态.这里记录一下进行地址设置和解决root登录的问题.解决IP地址的设......
  • 代码随想录算法训练营第十七天| 110. 平衡二叉树 257. 二叉树的所有路径 404. 左叶
    110.平衡二叉树https://leetcode.cn/problems/balanced-binary-tree/description/publicbooleanisBalanced(TreeNoderoot){intbalance=balance(root);returnbalance==-1?false:true;}publicintbalance(TreeNodenode){i......
  • VHDL实现2048游戏及仿真
    设计2048游戏的思路如下:1.确定数据表示:在设计过程中,我们需要确定如何表示游戏的棋盘状态和移动方向。一种常见的表示方法是使用一个二维数组来表示棋盘,每个单元格可以存储一个数字(用4个bit表示)。移动方向可以使用一个2位的向量表示。2.定义游戏规则:了解2048游戏的规则是非......