当前位置: 首页 > wzjs >正文

正在建设的网站可以随时进入吗全国疫情实时动态

正在建设的网站可以随时进入吗,全国疫情实时动态,郑州商城网站开发,龙岗外贸网站建设【星云 Orbit-F4 开发板】03b. 按键玩法二:独立按键双击触发 引言 在嵌入式系统中,按键是常用的输入设备。通过检测按键的状态变化,可以实现多种功能,例如单击、双击、长按等。本文将详细介绍如何使用STM32F103的GPIO引脚检测独…

【星云 Orbit-F4 开发板】03b. 按键玩法二:独立按键双击触发

引言

在嵌入式系统中,按键是常用的输入设备。通过检测按键的状态变化,可以实现多种功能,例如单击、双击、长按等。本文将详细介绍如何使用STM32F103的GPIO引脚检测独立按键的双击事件,并通过HAL库实现模块化设计。通过本教程,读者将能够掌握独立按键的双击检测方法以及模块化编程的基本技巧。


硬件准备

在开始编程之前,确保您已经准备好以下硬件:

  1. STM32F103开发板:板载STM32F103RET6(Cortex-M3/72MHz)作为主控芯片。
  2. 独立按键:1个独立按键。
  3. 限流电阻:1个220Ω至330Ω的电阻,用于保护电路。
  4. 连接线:用于连接按键和开发板。

硬件连接

将独立按键连接到STM32F103的PB0引脚:

  1. 连接按键的正极

    • 按键的正极通过电阻连接到PB0。
  2. 连接按键的负极

    • 按键的负极连接到GND(地)。

GPIO配置

在STM32F103中,GPIO引脚可以配置为多种模式,以适应不同的应用需求。以下是一些常见的GPIO模式:

  1. 输入模式

    • 浮空输入(Floating Input):引脚处于高阻态,适用于不需要上拉或下拉的情况。
    • 上拉输入(Pull-Up Input):引脚内部连接上拉电阻,适用于外部信号为低电平有效的情况。
    • 下拉输入(Pull-Down Input):引脚内部连接下拉电阻,适用于外部信号为高电平有效的情况。
  2. 输出模式

    • 推挽输出(Push-Pull Output):引脚可以输出高电平或低电平,适用于直接驱动小电流负载,如LED灯。
    • 开漏输出(Open-Drain Output):引脚输出低电平或高阻态,适用于需要外部上拉电阻的场合。
  3. 复用模式

    • 用于将GPIO引脚配置为特定的外设功能,如UART、SPI等。

在本教程中,我们将使用上拉输入模式来检测按键的状态,因为这种模式可以直接检测按键的按下和释放状态。

配置GPIO时钟

在使用GPIO引脚之前,需要先使能相应的GPIO时钟。对于PB0引脚,需要使能GPIOB时钟。

// 使能GPIOB时钟
__HAL_RCC_GPIOB_CLK_ENABLE();

配置GPIO引脚

使用GPIO_InitTypeDef结构体配置GPIO引脚的模式、上下拉、速度等参数。

GPIO_InitTypeDef GPIO_InitStruct = {0};// 配置PB0为上拉输入模式
GPIO_InitStruct.Pin = GPIO_PIN_0;
GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
GPIO_InitStruct.Pull = GPIO_PULLUP; // 上拉输入模式
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW; // 低速HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);

按键控制模块

为了实现模块化设计,我们将按键的控制功能封装到bsp/KEY目录下的bsp_key.cbsp_key.h文件中。

1. 创建KEY目录

  1. 打开文件管理器

    • 导航到STM32F103项目目录下的Drivers/BSP文件夹。
  2. 创建新目录

    • 右键点击空白区域,选择新建文件夹
    • 输入目录名称KEY,并按回车键确认。

2. 创建bsp_key.cbsp_key.h文件

  • 确保bsp_key.cbsp_key.h文件当前位于Drivers/BSP目录下。

3. 更新项目包含路径

  1. 打开Keil MDK

    • 加载当前的STM32F103项目。
  2. 进入项目设置

    • 右键点击工程名称,选择Options for Target
  3. 添加新的包含路径

    • 在弹出的窗口中,选择C/C++选项卡。
    • Include Paths字段中,添加以下路径:
      Drivers/BSP/KEY
      
    • 确保路径正确无误,点击OK保存设置。

4. 更新main.c文件

  1. 打开main.c文件

    • 在Keil MDK的项目资源管理器中,找到并双击main.c文件。
  2. 包含新的头文件

    • 在文件顶部,添加以下包含语句:
      #include "bsp_key.h"
      
    • 确保路径正确,以便编译器能够找到该头文件。

5. 重新编译项目

  1. 编译工程

    • 点击工具栏中的Build按钮(或按F7键)。
    • 确保编译过程中没有错误和警告。
  2. 处理编译错误

    • 如果出现包含路径错误,请检查Include Paths设置是否正确。
    • 确保bsp_key.h文件位于Drivers/BSP/KEY目录下。

6. 更新项目分组

  1. 添加新的文件夹分组

    • 在Keil MDK的项目资源管理器中,右键点击BSP分组,选择Add Group
    • 输入分组名称KEY,点击OK
  2. 添加文件到分组

    • 右键点击新的KEY分组,选择Add New Item to Group
    • 选择Add Existing File,导航到Drivers/BSP/KEY目录,选择bsp_key.cbsp_key.h文件,点击OK
  3. 确保文件可见性

    • 确保bsp_key.cbsp_key.h文件在KEY分组下可见,并且路径正确。

按键控制模块实现

bsp_key.h文件

#ifndef __BSP_KEY_H
#define __BSP_KEY_H#include "stm32f103xx_hal.h"#define KEY_DEBOUNCE_DELAY 20  // 按键消抖延迟时间(单位:ms)
#define KEY_DOUBLE_CLICK_DELAY 500  // 双击延迟时间(单位:ms)/*** @brief 初始化按键*/
void KEY_Init(void);/*** @brief 检测按键状态* @return 按键状态(0:未按下,1:单击,2:双击)*/
uint8_t KEY_GetState(void);#endif /* __BSP_KEY_H */

bsp_key.c文件

#include "bsp_key.h"
#include "stm32f103xx_hal.h"static uint8_t key_state = 0;
static uint32_t key_press_time = 0;
static uint32_t key_release_time = 0;/*** @brief 初始化按键*/
void KEY_Init(void)
{GPIO_InitTypeDef GPIO_InitStruct = {0};// 使能GPIOB时钟__HAL_RCC_GPIOB_CLK_ENABLE();// 配置PB0为上拉输入模式GPIO_InitStruct.Pin = GPIO_PIN_0;GPIO_InitStruct.Mode = GPIO_MODE_INPUT;GPIO_InitStruct.Pull = GPIO_PULLUP;GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
}/*** @brief 检测按键状态* @return 按键状态(0:未按下,1:单击,2:双击)*/
uint8_t KEY_GetState(void)
{static uint32_t last_press_time = 0;static uint8_t press_count = 0;if (HAL_GPIO_ReadPin(GPIOB, GPIO_PIN_0) == GPIO_PIN_RESET){// 按键按下if (key_state == 0){// 消抖key_press_time = HAL_GetTick();key_state = 1;}else if (key_state == 1){// 检测是否为双击if ((HAL_GetTick() - key_press_time) > KEY_DEBOUNCE_DELAY){press_count++;last_press_time = HAL_GetTick();key_state = 2;}}}else{// 按键释放if (key_state == 2){// 检测双击if ((HAL_GetTick() - last_press_time) < KEY_DOUBLE_CLICK_DELAY){press_count++;if (press_count >= 2){press_count = 0;return 2; // 双击}}else{press_count = 0;}key_state = 0;}}return 0; // 未按下
}

主程序实现

#include "stm32f103xx_hal.h"
#include "bsp_key.h"int main(void)
{// 系统初始化HAL_Init();SystemClock_Config();// 按键初始化KEY_Init();while (1){uint8_t state = KEY_GetState();if (state == 1){// 单击处理// 在此处添加单击事件的处理代码}else if (state == 2){// 双击处理// 在此处添加双击事件的处理代码}}
}

测试与验证

  1. 编译与下载

    • 将代码编译并下载到STM32F103开发板中。
  2. 观察按键状态

    • 连接好硬件后,按下按键,观察是否能够正确检测单击和双击事件。如果按键状态没有正确检测,请检查硬件连接和代码配置是否正确。

总结

通过本教程,您已经掌握了如何使用STM32F103的PB0引脚检测独立按键的双击事件,并通过HAL库实现模块化设计。按键状态的检测是关键步骤,选择合适的消抖和双击检测逻辑可以确保按键的稳定工作。模块化设计使代码更加清晰和易于维护,为后续的项目扩展奠定了良好的基础。希望本教程对您有所帮助,祝您在嵌入式开发的道路上取得更大的成功!

http://www.dtcms.com/wzjs/218869.html

相关文章:

  • 大亚湾住建局网站建设工程规划网站建设全网营销
  • 有限责任公司和有限公司有啥区别关键词排名优化怎么样
  • 网站开发的职业分析宁德市地图
  • 用ip地址做网站外链链接平台
  • 做网站电话公司网页制作教程
  • 帮人做任务赚钱的网站搜索引擎优化指的是什么
  • 公司做网站的步骤产品营销策划
  • 做seo学网站编写网站
  • 色流网站如何做站长工具站长之家官网
  • 佛山新网站建设咨询友情链接网站源码
  • 河南网站建设公司 政府浏览广告赚佣金的app
  • 河北云网站建设武汉刚刚突然宣布
  • 旅游电子商务项目计划书优化关键词的步骤
  • 网站公司做的网站被攻击网站怎么优化排名的方法
  • 网站建设 软件服务百度竞价排名收费
  • 如何用自己公司网站做邮箱手机百度app
  • 知名b2b网站网站推广优化外包公司
  • 教育网站赏析合肥网站推广公司
  • 怎样使自己做的网站上线长尾关键词挖掘熊猫
  • 网站如何做二级栏目网站建站模板
  • 一个网站能多个域名做不同站点广告联盟平台入口
  • 大连网站建设设计公司哪家好变现流量推广app
  • 外贸网站建设推广优化产品网络推广
  • 常州网站建设公司如何引流推广多少钱一个
  • 室内设计联盟模型下载seo引擎搜索
  • 网站如何建设与安全管理制度品牌战略
  • 上海网站制作哪家好免费网络营销方式
  • 清河做网站多少钱seo内容优化心得
  • 河南住房城乡建设厅官方网站免费广告投放平台
  • 建站国外百元服务器关键词自助优化