zoukankan      html  css  js  c++  java
  • 第一节补充: 按键操作(CubeMX加HAL库学STM32系列)

    第一节补充:按键操作


    《用CubeMX学习STM32》

    注释 点击上面蓝字进入完整专栏,这个系列所有文章都会整合到这个专栏


    这一篇是补充第一篇的按键操作, 因为第一篇很多地方很详细了, 写了很大的篇幅, 所以单独写一篇用CubeMX配置STM32使用自带按键的操作

    提示 : 仍然按照先Cube配置再IAR或者Keil编程, CubeMX里面关于时钟的配置跟我上一篇写的一样, RCC和SYS设置以及时钟树(Clock Configuration)都按照第一篇配置即可, 没有什么特别的需求, 是从始至终不需改变这个地方的配置的。

    1-2. 使用核心板自带按键

    操作简介 :    通过板子上的两个按钮控制LED灯的亮灭 WK_UP按键按下则LED0闪烁, 松开停止闪烁并熄灭, 即WK_UP按键长按LED0才会持续闪烁    KEY0按下再松手, LED1就亮, 再按下一次LED1就灭, 类似于开关的功能,每按一次KEY0键, LED1状态翻转一次

    Step1 <CubeMX配置>


    (1) 新建工程(New Project)---->搜索自己所用的MCU型号(我的是STM32F407zg系列)

    这里我直接把前面的工程拿来用, 添加对按键对应引脚的配置即可
    在这里插入图片描述

    这里关于引脚上拉下拉解释一下: 可以看到, 当WK_UP按下时, +3.3v就进入PA0,   而KEY0按下时, PE4就会变为低电平。 所以WK_UP相当于有一个下拉电阻. 我在图里标注了两个额外的上下拉电阻, 便于理解清晰

    此外, 电阻是上拉还是下拉是看通过这个电阻, 电流是注入引脚 (就是下拉) 还是从引脚流出 (即上拉)

    1、比如WK_UP对应那个地方, 通过那个电阻将WK_UP那一边钳在了低电平, 所以是下拉电阻
    2、同理, KEY0那个对应引脚, 相当于是有一个另一端接VCC的电阻, 从而在KEY0那个按键没有按下的时候, KEY0引脚被钳在了高电平, 那个电阻还起着限流的作用

    (2) 引脚配置

    这里我们将按键都设置为输入引脚, 因为对应按键按下之后, 一个会给对应引脚输入高电平, 一个会输入低电平, 都会给引脚输入一个信号, 所以设置为输入GPIO_Input
    在这里插入图片描述
    根据前面的上下拉讲解, 应该知道, WK_UP对应的PA0引脚应设置为内部下拉(Pull-down)
    KEY0对应PE4引脚内部设置为上拉(Pull-up) 具体配置见下图展示


    在这里插入图片描述

    同理配置KEY0对应的PE4

    在这里插入图片描述

    • 配置完成后点击 Generate Code---->Open Project
    (3) 部分初始化代码展示

    打开工程后, 我们先看一下多了哪些东西
    在这里插入图片描述

    在main.h 这里面也多了对引脚的宏定义, 因为我们自己给它起了个别名

    在这里插入图片描述

    Step2 <IAR或者Keil编程>

    (1) 功能代码编写

    在这里插入图片描述

    下面我直接把代码打出来, 便于复制
    在这里插入图片描述

    /* USER CODE BEGIN 3 */
    			// 在while(1)里面循环扫描, 判断读取的按键引脚状态
    			// 先读取WKUP引脚的电平   若为GPIO_PIN_SET(即WKUP得到了高电平, 表示这个按键按下了)
    			if (HAL_GPIO_ReadPin(WKUP_GPIO_Port, WKUP_Pin) == GPIO_PIN_SET)
    			{
    					HAL_Delay(10);	// 延时10ms, 做一个软件的消抖, 防止因抖动而检测到按键按下
    					if (HAL_GPIO_ReadPin(WKUP_GPIO_Port, WKUP_Pin) == GPIO_PIN_SET)
    					{
    							HAL_GPIO_WritePin(LED0_GPIO_Port, LED0_Pin, GPIO_PIN_RESET);// 点亮LED0
    							HAL_Delay(100);
    							HAL_GPIO_WritePin(LED0_GPIO_Port, LED0_Pin, GPIO_PIN_SET);  // 点亮LED0
    							HAL_Delay(100);
    					}
    			}
    			
    			// 下面扫描KEY0按键的引脚信号
    			if (HAL_GPIO_ReadPin(KEY0_GPIO_Port, KEY0_Pin) == GPIO_PIN_RESET)
    			{
    					HAL_Delay(10);	// 延时10ms, 做一个软件的消抖, 防止因抖动而检测到按键按下
    					if (HAL_GPIO_ReadPin(KEY0_GPIO_Port, KEY0_Pin) == GPIO_PIN_RESET)
    					{
    							// 做一个松手检测, 若KEY0一直是RESET(低电平),则一直在死循环
    							// 当KEY0位SET才会跳出,进而继续执行下面的对 LED1 的操作
    							while(HAL_GPIO_ReadPin(KEY0_GPIO_Port, KEY0_Pin) == GPIO_PIN_RESET);
    							HAL_GPIO_TogglePin(LED1_GPIO_Port, LED1_Pin);
    					}
    			}
      }
      /* USER CODE END 3 */
    
    HAL_GPIO_ReadPin这个函数就是去读取引脚的状态, 读取引脚是RESET(0)还是SET(非0)

    在while(1)里面循环扫描, 如果发现按键按下, 就执行其内部的函数, 每次读取引脚电平后还要用HAL_Delay()函数做一个小延时, 作为软件消抖,消除按键意外抖动出现的结果

    (2) 功能函数解释

    在这里插入图片描述

    (3) 实际效果展示

    在这里插入图片描述

    我来过, 我战斗过, 我不在乎结局! 加油
    Author : 李光辉
    date : Thu Dec 26 12:43:45 CST 2019
    blog ID: Kevin_8_Lee
    blog site : https://blog.csdn.net/Kevin_8_Lee/
  • 相关阅读:
    Java反射机制源码分析及知识点总结
    Dubbo admin 在Windows下的安装和服务发现
    Redis知识点总结
    Error:(xx) java: -source 1.5 中不支持
    Java中的线程间通信
    linux主机名显示bogon问题
    Linux(CentOS)上安装Apache Hadoop
    Java虚拟机(JVM)及其体系结构
    在微服务领域中处理分布式事务
    Redis持久化
  • 原文地址:https://www.cnblogs.com/kevin-nancy/p/12569383.html
Copyright © 2011-2022 走看看