HAL库RTOS按键检测1min快速移植

EC11旋转编码器状态机驱动设计:从4状态到事件触发的RTOS实践 本文详细介绍了EC11旋转编码器的状态机驱动设计,从基础原理到RTOS集成,提供了一套完整的模块化解决方案。通过四状态机模型和事件驱动架构,实现了高效稳定的信号处理,适用于嵌入式系统开发。文章还涵盖了硬件优化、软件抗干扰措施及测试验证方法,帮助开发者快速掌握EC11旋转编码器的驱动设计。 阅读详情

此文方便我手抄hhh

way 1:

        提前在CUBEMX中将对应按键勾选为输入模式,并根据按键检测的电平将IO配置为上拉或下拉,并命名KEY1(我这里是KEY1,其他的对照.c.h文件自行修改名称)。(这种配置方式,在文件生成时会自动将初始化代码放在main中,只需要田间按键检测的代码即可)

way 1——key.c (通用的单次检测函数)

#include "key.h"

/**
 * @brief 按键扫描函数,实现按键按下的稳定检测(消抖+单次触发)
 * @param mode 模式参数:1-重置按键状态(强制认为按键已释放),0-正常扫描模式
 * @return uint8_t 按键值:0-无按键操作,1-按键被稳定按下
 */
uint8_t KeyScan(uint8_t mode)
{
    // 静态变量,用于记录按键状态:1表示按键已释放(可检测新按下),0表示按键未释放(避免重复触发)
    // 静态特性确保函数调用后状态不丢失,跨调用维持状态记忆
    static uint8_t key_up = 1;
    
    // 按键返回值,默认0(无操作)
    uint8_t keyvalue = 0;
    
    // 模式判断:若mode为1,强制重置按键为"已释放"状态(用于初始化或强制刷新)
    if (mode) 
        key_up = 1;
    
    // 核心检测逻辑:当按键处于"已释放"状态,且当前检测到按键按下(!KEY1表示按键闭合,假设KEY1为高电平常态)
    if (key_up && (!KEY1))
    {
        osDelay(3);         // 延时3ms消除机械抖动(按键按下时的瞬时不稳定状态)
        if (!KEY1)          // 延时后再次检测,确认按键确实稳定按下(排除抖动干扰)
            keyvalue = 1;   // 确认按下,设置返回值为1
        
        // 若已检测到有效按下,标记按键为"未释放"状态,避免一次按下被重复识别
        if (keyvalue)       
            key_up = 0;
    }
    // 分支:当按键处于"未释放"状态(key_up=0),检测是否已松开
    else
    {
        osDelay(3);         // 延时3ms消除松开时的机械抖动
        if (KEY1)           // 延时后检测到按键恢复高电平,确认已稳定松开
            key_up = 1;     // 重置为"已释放"状态,允许下次按下检测
    }
    
    return keyvalue;   // 返回按键状态(0或1)
}

way 1——key.h

#ifndef __KEY_H__
#define __KEY_H__

#ifdef __cplusplus
extern "C" {
#endif

#include "main.h"

//KEY1
#define KEY1_PORT	GPIOE                      //在这里修改引脚
#define KEY1_PIN	GPIO_PIN_3                 //在这里修改引脚
#define KEY1 HAL_GPIO_ReadPin(KEY1_PORT,KEY1_PIN)

//KEY2
#define KEY2 0

void Key_Port_Init(void);
void Key_Interrupt_Callback(void);
uint8_t KeyScan(uint8_t mode);




#ifdef __cplusplus
}
#endif
#endif

way 2:

        懒得去CUBEMX中配置的话,就去看好对应的按键是哪个,创建key.c文件准备进行后续初始化函数和检测函数的编写

way 2——key.c

相较于way 1的.c文件增加了 void Key_Port_Init(void),初始化,记得在主函数中初始化即可

#include "key.h"
#include "cmsis_os.h"

void Key_Port_Init(void)
{
  GPIO_InitTypeDef GPIO_InitStruct = {0};

  /* GPIO Ports Clock Enable */
  __HAL_RCC_GPIOE_CLK_ENABLE();

  /*Configure GPIO pin : PA0 */
  GPIO_InitStruct.Pin = KEY1_PIN;
  GPIO_InitStruct.Mode = GPIO_MODE_IT_FALLING;
  GPIO_InitStruct.Pull = GPIO_PULLUP;
  HAL_GPIO_Init(KEY1_PORT, &GPIO_InitStruct);

  /* EXTI interrupt init*/
//	HAL_NVIC_SetPriority(EXTI0_IRQn, 0, 0);
//  HAL_NVIC_EnableIRQ(EXTI0_IRQn);
}

/**
 * @brief 按键扫描函数,实现按键按下的稳定检测(消抖+单次触发)
 * @param mode 模式参数:1-重置按键状态(强制认为按键已释放),0-正常扫描模式
 * @return uint8_t 按键值:0-无按键操作,1-按键被稳定按下
 */
uint8_t KeyScan(uint8_t mode)
{
    // 静态变量,用于记录按键状态:1表示按键已释放(可检测新按下),0表示按键未释放(避免重复触发)
    // 静态特性确保函数调用后状态不丢失,跨调用维持状态记忆
    static uint8_t key_up = 1;
    
    // 按键返回值,默认0(无操作)
    uint8_t keyvalue = 0;
    
    // 模式判断:若mode为1,强制重置按键为"已释放"状态(用于初始化或强制刷新)
    if (mode) 
        key_up = 1;
    
    // 核心检测逻辑:当按键处于"已释放"状态,且当前检测到按键按下(!KEY1表示按键闭合,假设KEY1为高电平常态)
    if (key_up && (!KEY1))
    {
        osDelay(3);         // 延时3ms消除机械抖动(按键按下时的瞬时不稳定状态)
        if (!KEY1)          // 延时后再次检测,确认按键确实稳定按下(排除抖动干扰)
            keyvalue = 1;   // 确认按下,设置返回值为1
        
        // 若已检测到有效按下,标记按键为"未释放"状态,避免一次按下被重复识别
        if (keyvalue)       
            key_up = 0;
    }
    // 分支:当按键处于"未释放"状态(key_up=0),检测是否已松开
    else
    {
        osDelay(3);         // 延时3ms消除松开时的机械抖动
        if (KEY1)           // 延时后检测到按键恢复高电平,确认已稳定松开
            key_up = 1;     // 重置为"已释放"状态,允许下次按下检测
    }
    
    return keyvalue;   // 返回按键状态(0或1)
}

way 2——key.h 

        与way 1的文件相同

STM32学习笔记汇总:从零到实战的嵌入式开发指南 嵌入式系统开发是连接硬件与软件的核心技术领域,其核心在于微控制器的程序设计与外设驱动。STM32作为基于ARM Cortex-M内核的微控制器代表,以其丰富的外设和强大的性能,广泛应用于物联网、工业控制、消费电子等领域。理解其工作原理,如时钟树配置、中断机制和DMA数据传输,是进行高效嵌入式开发的基础。这些技术能显著提升系统实时性和能效,对于实现复杂功能至关重要。本文围绕STM32学习笔记,系统梳理了从开发环境搭建到外设驱动的关键知识点,并深入探讨了PWM输出、ADC采样等热门外设应用。通过剖析智能台灯等综 阅读详情

相关推荐

电赛控制类赛题备战指南:从PID算法到STM32通用框架搭建

在嵌入式系统与自动控制领域,实时控制系统是实现精确运动与稳定运行的核心。其基本原理是通过传感器采集环境或自身状态信息,经由控制器算法(如经典的PID控制及其串级、模糊等变种)进行计算,输出指令驱动执行机构,从而构成一个闭环反馈系统。这项技术的核心价值在于能够使被控对象快速、准确地达到并维持期望状态,对系统鲁棒性和实时性要求极高。在机器人、智能车、工业自动化等应用场景中,稳定的控制框架是项目成功的基础。本文聚焦于电子设计竞赛(电赛)控制类题目,深入探讨如何构建以STM32为核心、融合**互补滤波**与**状态

weixin_34161029的博客 413

从DHT11温湿度检测到嵌入式系统设计:协议、架构与工程化实践

在嵌入式系统开发中,传感器数据采集是基础且关键的技术环节,其核心在于实现稳定可靠的通信协议与系统架构设计。以常见的单总线温湿度传感器为例,其通信协议对时序要求极为严格,需要开发者深入理解微秒级时序控制、超时处理与数据校验等原理。通过状态机与任务调度机制,可以将简单的数据读取任务转化为可维护、可扩展的系统服务,实现模块化解耦与资源合理分配。这种设计方法不仅提升了系统的稳定性与实时性,也为后续集成显示、存储、通信等模块奠定了工程基础。本文以STM32和DHT11为例,探讨了从传感器驱动到系统架构的完整实现路径,

weixin_33922670的博客 341

嵌入式开发IO扩展实战:PCF8574与MCP23017选型、驱动与调试全解析

在嵌入式系统开发中,GPIO(通用输入输出)是连接微控制器与外部世界的基础接口。其工作原理是通过配置寄存器控制引脚的电平状态,实现数字信号的输入与输出。这项技术的核心价值在于以极低的硬件成本实现灵活的控制与感知,是构建人机交互、传感器网络和执行器控制等功能的基石。随着物联网和智能设备的普及,应用场景从简单的LED控制、按键读取,扩展到需要管理大量传感器和执行器的复杂系统,如智能家居控制面板、工业HMI等。当原生GPIO资源成为项目瓶颈时,基于I2C总线的IO扩展技术便成为务实的选择。本文聚焦于行业经典方案,

weixin_30786657的博客 352

STM32+LVGL智能手表界面开发:从移植到优化的完整实践指南

嵌入式GUI开发中,界面逻辑的组织往往比屏幕驱动更棘手。在MCU资源受限的环境下,传统的裸机绘图方式难以支撑多页面、多状态、可交互的复杂界面。LVGL作为一种面向对象的开源图形库,通过组件树、事件驱动与局部刷新机制,将界面代码从主循环泥潭中解放出来,极大提升了UI工程的维护性与扩展性。STM32F103等主流MCU上,LVGL配合SPI接口屏、DMA传输及适当的缓冲区配置,即可实现流畅的菜单切换与数据刷新。智能手表因其小屏、高信息密度、短交互链路的特性,成为掌握嵌入式GUI开发的最佳实践载体。本文系统讲解L

weixin_34332905的博客 355

嵌入式GUI输入驱动实战:从emWin PID框架到触摸屏与鼠标集成

在嵌入式系统开发中,图形用户界面(GUI)是人机交互的核心,而稳定高效的输入驱动是其流畅体验的基石。输入驱动的工作原理是将物理设备的信号(如触摸坐标、按键状态)转换为GUI系统能识别的事件数据。其技术价值在于实现硬件与GUI应用的解耦,提升开发效率和系统可靠性。常见的应用场景包括工业控制面板、医疗设备、智能家居面板等需要触摸屏、鼠标或摇杆交互的嵌入式设备。本文聚焦于emWin图形库的指针输入设备(PID)驱动框架,深入解析其分层架构与核心API,并通过实战案例,详细讲解如何为四线电阻屏和PS/2鼠标等设备实

cique2620的博客 406

基于STM32与FreeRTOS的六自由度机械臂:总线舵机与PS2手柄控制实战

实时操作系统(RTOS)是嵌入式开发中实现多任务并行与实时响应的核心技术,其核心原理在于通过任务调度、优先级管理和进程间通信,确保关键任务能在确定时间内完成。在机器人控制领域,这种实时性尤为重要,它直接决定了系统的响应速度和稳定性。FreeRTOS作为一款轻量级、开源的RTOS,凭借其可裁剪性和丰富的组件,成为嵌入式实时系统开发的理想选择。结合**总线舵机**这类通过串行总线通信、可精准控制位置与速度的执行器,以及**PS2手柄**这类直观的输入设备,开发者能够构建出交互灵活、控制精准的机电一体化系统。这种

cuixie2370的博客 532

基于RT-Thread与STM32的RTC数字时钟:从硬件驱动到多线程应用实战

实时时钟(RTC)是嵌入式系统中实现精准时间基准的核心外设,它通过独立的电源域和BCD码计时机制,确保系统在掉电后仍能持续走时。其工作原理依赖于外部低速晶振(如32.768kHz LSE)提供时钟源,结合后备电池供电,为各类计时应用提供硬件保障。在技术价值上,RTC使得设备能够脱离网络独立运行,并支持定时唤醒、事件记录等关键功能。在应用场景中,它广泛用于智能家居、工业控制、穿戴设备等需要持续计时的领域。本文以STM32F407的RTC外设和1602 LCD模块为例,深入探讨了在RT-Thread实时操作系统

weixin_34072458的博客 363

STM32驱动大彩串口屏:HAL库UART通信与界面交互开发实战

串口通信作为嵌入式系统中最基础、最可靠的通信方式之一,广泛应用于设备间数据交换。在HMI人机交互场景中,借助串口屏可以实现低成本、高效率的界面开发。STM32系列微控制器凭借丰富的外设资源和成熟的HAL库,成为驱动串口屏的常见选择。通过VisualTFT上位机配置界面,MCU仅需按协议发送指令帧即可完成页面切换、数据刷新和按键响应,有效降低开发复杂度。这种方案适用于工业监控、智能仪表、设备参数设置等场景,满足中小型项目快速交付的需求。本文围绕大彩屏与STM32F407的UART通信实战,详细阐述硬件接线、协

weixin_34075268的博客 373

STM32CubeMX 和 Keil5 (MDK) 的 FreeRTOS 项目

在跑完流水灯、调通串口打印之后,很多初学者都会陷入一个困惑:“任务倒是创建了一堆,可它们到底怎么协同工作?” 这正是我们设计这个项目的初衷——不搞虚的,直接模拟一个微型环境监测终端。通过这套组合拳,你能一次性跑通消息队列、二值信号量、互斥锁、这三大FreeRTOS核心通信机制。更重要的是,代码结构清晰,做完这个项目,你拿到任何FreeRTOS工程都能快速上手。下面,我们就从CubeMX的配置延续开始,把前面生成的工程骨架,一步步填充成这个完整的控制系统。· 监控任务:实时检测各任务栈余量,防止内存溢出。

2301_81943288的博客 755

基于STM32F103C8T6与MAX30102的心率血氧检测系统设计与实现

光电容积脉搏波描记法(PPG)是当前可穿戴健康监测设备中广泛使用的非侵入式信号采集技术,其原理是利用特定波长的光透过皮肤组织,通过检测血液容量变化引起的反射光强度波动来提取生理参数。在嵌入式系统中,实现心率与血氧检测需要将传感器数据采集、信号预处理、特征提取与结果呈现完整串联。本内容以STM32F103C8T6为主控芯片,结合集成式光学传感器MAX30102,通过I2C总线获取红光与红外双通道信号,并采用数字滤波、动态阈值峰值检测与R值经验公式完成心率及血氧饱和度计算,最终在OLED屏幕上实时显示。整个方案

weixin_30780649的博客 364

STM32嵌入式多级菜单设计:基于菜单树与事件驱动的OLED交互方案

嵌入式GUI中的多级菜单系统,本质是资源受限环境下的人机交互状态管理问题。其核心原理在于解耦界面层级与硬件响应,避免全局状态变量引发的竞态与路径耦合。技术价值体现在确定性响应、极低RAM占用(<128字节)和强抗干扰能力,适用于STM32F103等无RTOS、小Flash(≤64KB)、小RAM(≤20KB)平台。典型应用场景包括智能手表、工控HMI、传感器终端等需稳定按键导航与OLED显示的设备。本文聚焦‘菜单树结构’与‘事件队列驱动’两大关键技术,结合SSD1306 OLED刷新特性与EXTI按键消抖时

weixin_29172963的博客 298

嵌入式开发IO口扩展实战:I2C总线驱动PCF8574与MCP23017芯片详解

在嵌入式系统开发中,通用输入输出(GPIO)引脚资源紧张是常见瓶颈。I2C总线作为一种两线制串行通信协议,以其引脚占用少、支持多设备寻址和中等通信速率的特点,成为解决IO扩展问题的关键技术。其工作原理基于主从架构和开漏输出,通过SCL时钟线和SDA数据线实现全双工通信,技术价值在于能以极低的引脚成本扩展出数十甚至上百个IO口,大幅提升系统灵活性和可扩展性。该技术广泛应用于需要连接多传感器、按键、LED阵列或驱动多路继电器的智能家居、工业控制及机器人等场景。本文聚焦于基于I2C的IO扩展芯片,深入解析PCF8

weixin_30482383的博客 284

STM32+FreeRTOS驱动12864液晶实现多级菜单系统设计

在嵌入式系统开发中,实时操作系统(RTOS)和人机交互界面(HMI)是提升产品用户体验的关键技术。RTOS通过任务调度与通信机制,实现了多任务并行处理,确保了系统的实时响应与可靠性。而基于点阵液晶屏的菜单系统,则是嵌入式设备实现复杂参数设置与状态显示的核心交互方式。其技术价值在于,能在RAM和Flash资源有限的微控制器上,构建出稳定、可维护的图形化操作界面,广泛应用于工控设备、仪器仪表等场景。本文以STM32微控制器和FreeRTOS为基础,结合状态机设计思想,详细解析了驱动12864液晶屏实现多级菜单系

weixin_33946020的博客 406

FreeRTOS配置文件FreeRTOSConfig.h详解:从内核配置到内存管理实战

实时操作系统(RTOS)是嵌入式开发中实现多任务并发的核心技术,其通过任务调度、内存管理和中断处理等机制,确保系统在资源受限环境下满足实时性要求。FreeRTOS作为一款开源、可裁剪的RTOS,其配置文件FreeRTOSConfig.h是开发者根据具体硬件资源(如RAM、主频)和应用需求(如实时性、功耗)进行内核定制裁剪的关键。理解配置项背后的原理,如系统时钟节拍(Tick Rate)如何影响调度精度与CPU开销,内存堆大小(Heap Size)与栈溢出检测如何保障系统稳定性,以及抢占式调度与时间片轮转的适

weixin_30443813的博客 400

STM32H750音频播放器:SAI+DMA硬解MP3实战指南

嵌入式音频播放是实时性与资源约束并存的典型场景,其核心在于专用音频外设(如SAI)、高效DMA传输和轻量级软解算法的协同。SAI(Serial Audio Interface)作为Cortex-M系列中少有的硬件I2S控制器,可彻底卸载CPU的时序生成与数据搬运负担;结合DMA双缓冲机制,能实现低抖动、低CPU占用的连续PCM流输出。MP3软解则依赖minimp3等零堆内存、帧级可控的库,在H750的L1 Cache与FPU加持下达成毫秒级解码能力。该方案广泛适用于便携音乐盒、工业HMI提示音、智能终端本地

weixin_28727975的博客 316

基于STM32的智能农业监控系统:从传感器采集到物联网应用实战

嵌入式系统开发是连接物理世界与数字世界的核心技术,其核心原理在于通过微控制器(MCU)实时采集、处理外部传感器数据,并驱动执行机构。这项技术的价值在于能够实现自动化监控与智能控制,广泛应用于工业自动化、智能家居以及智慧农业等领域。在智慧农业场景中,环境监控系统通过温湿度、土壤湿度、光照强度等传感器,实时监测作物生长环境,并利用STM32等主流MCU进行数据处理与设备控制。本文聚焦于**STM32**和**农业大棚监控**这两个热点,详细拆解如何从零构建一个稳定可靠的智能农业监控终端,涵盖硬件选型、传感器驱动

weixin_29169505的博客 235

STM32环境监测系统:多传感器集成与GSM远程报警实现

嵌入式系统作为物联网技术的核心基础,通过微控制器协调各类传感器和执行器实现智能化控制。其工作原理基于实时数据采集、处理与通信三大模块的协同运作,在环境监测领域具有重要技术价值。STM32系列单片机凭借丰富的外设接口和低功耗特性,成为构建智能监测系统的理想平台。通过集成温度、CO2浓度、人体红外等多种传感器,结合GSM通信模块实现远程报警功能,该系统可广泛应用于智能家居、农业大棚等场景。本文以STM32环境监测项目为例,详细解析多传感器数据融合和远程通信的具体实现方案,为嵌入式开发者提供完整的物联网系统设计参

weixin_34327223的博客 340

基于STM32的CNC控制器DIY:从运动控制算法到实时系统设计

运动控制是自动化与嵌入式领域的核心技术,其原理在于通过算法将目标轨迹分解为电机可执行的精确指令。这项技术的核心价值在于实现高精度、高效率的定位与轨迹跟踪,广泛应用于数控机床、3D打印机和机器人等场景。在工程实践中,实时操作系统(RTOS)和G代码解释器是实现稳定、高效运动控制系统的关键组件。RTOS通过多任务调度确保脉冲生成、规划计算等关键操作的时序确定性,而G代码解释器则负责将加工指令转化为内部运动参数。本文聚焦于如何利用STM32微控制器的丰富外设(如高级定时器)和强大生态,结合FreeRTOS与前瞻算

weixin_34168880的博客 289
上一篇: HAL库串口printf函数配置
下一篇: 匿名结构体与带标签名的结构体
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值