专项:STM32状态机结构简述

news/2025/3/6 22:35:07/

前言

在 STM32 开发中,状态机是一种常用的编程结构,用于处理复杂的逻辑流程和事件驱动的系统。状态机通过定义不同的状态以及状态之间的转换条件,使得程序逻辑更加清晰、易于维护和扩展。如果没有自己的编程习惯,可以使用状态机结构编程。

基本结构

1. 状态(State)

状态是状态机在某一时刻所处的情况。例如,在 LED 亮灭控制状态机中,有led亮和led灭两个状态[struct{on,off};],每个状态都有其特定的行为控制和可能的转换方式。

2. 事件(Event)

事件是触发状态转换的条件(类似于QT信号传递)。它可以是外部输入(如按键按下、传感器信号变化)、定时器超时等。例如,在 LED 控制状态机中,“按下按键” 这个事件可以触发从 “LED 熄灭” 状态转换到 “LED 点亮” 状态[if(key==1){state=on}else{state=off}]。

3. 转换(Transition)

转换定义了状态之间的迁移规则,即当某个事件发生时,状态机从一个状态转换到另一个状态[state=on/state=off]。每个转换都与一个特定的事件相关联。

4. 动作(Action)

动作是状态机在进入某个状态、离开某个状态或在状态转换过程中执行的操作(执行事件)。例如,在进入 “LED 点亮” 状态时,执行点亮 LED 的操作。

实现方式

1. 枚举定义状态

使用枚举类型来定义状态机的所有可能状态[不可使用{1,2,3,4}这种定义,维护比较困难]。

typedef enum {STATE_IDLE,      // 空闲STATE_RUNNING,   // 运行STATE_ERROR      // 错误
} State_t;
2. 状态处理函数

为每个状态编写对应的处理函数(事件),这些函数负责处理该状态下的具体操作和状态转换逻辑。

//空闲
void StateIdleHandler(void) {if (events1()) {//其他需要执行的事件currentState = STATE_RUNNING; // 转换到运行状态}
}//运行
void StateRunningHandler(void) {if (events2()) {//运行事件currentState = STATE_ERROR; // 如果错误转换到错误状态,没有的话进进入正常状态机}
}//错误
void StateErrorHandler(void) {TurnOnErrorLED();// 错误处理if (errorevents()) {//处理完成,进入空闲currentState = STATE_IDLE; // 转换到空闲状态}
}
3. 主循环中的状态机调度

在main中,根据当前状态调用相应的状态处理函数。

State_t currentState = STATE_IDLE;//在系统启动时,自动进入一个待机状态int main(void) {while (1) {switch (currentState) {//状态机切换状态。case STATE_IDLE:StateIdleHandler();break;case STATE_RUNNING:StateRunningHandler();break;case STATE_ERROR:StateErrorHandler();break;default:// 处理未知状态,最后回到状态中,不能死循环break;}}
}

总结

通过状态机结构,可以将复杂的系统逻辑分解为多个简单的状态和状态转换,使得代码的可读性和可维护性大大提高。在 STM32 开发中,状态机常用于处理按键输入、传感器数据处理、通信协议解析等场景,使用和学习中尽量多使用状态机模式。


http://www.ppmy.cn/news/1577192.html

相关文章

论坛系统测试报告

目录 一、项目背景二、论坛系统测试用例思维导图三、论坛系统测试3.1界面测试3.2登陆测试3.3主页测试3.4个人中心测试 四、自动化测试脚本4.1配置驱动4.2创建浏览器类4.3功能测试4.3.1登陆测试4.3.2注册测试4.3.3主页测试4.3.4帖子编辑4.3.5运行主代码 五、BUG分析六、测试总结…

【后端开发面试题】每日 3 题(六)

✍个人博客:Pandaconda-CSDN博客 📣专栏地址:https://blog.csdn.net/newin2020/category_12903849.html 📚专栏简介:在这个专栏中,我将会分享后端开发面试中常见的面试题给大家~ ❤️如果有收获的话&#x…

BambuStudio学习笔记:Extruder 类

Extruder 类文档 概述 Extruder 类用于管理3D打印过程中的挤出机状态,包括挤出量计算、回抽操作、耗材统计等功能。支持多挤出机配置及共享挤出机模式。 头文件 #ifndef slic3r_Extruder_hpp_ #define slic3r_Extruder_hpp_ // ... #endif成员函数 构造函数 E…

docker本地部署ollama

启动ollama容器 1.使用该命令启动CPU版运行本地AI模型 docker run -d -v ollama:/root/.ollama -p 11434:11434 --name ollama ollama/ollama 2.此命令用于启动GPU版本运行AI模型 前提是笔记本已配置NVIDIA的GPU驱动,可在shell中输入nvidia-smi查看详细情况…

安全渗透测试的全面解析与实践

引言 随着网络安全威胁的日益增加,企业和组织对自身系统的安全性提出了更高的要求。安全渗透测试(Penetration Testing,简称渗透测试)作为主动发现和修复系统安全漏洞的重要手段,已成为安全防护体系中的关键环节。本文…

JS基础之对象

对象使用 目标:掌握对象语法,用它保存多个数据 1.对象声明语法 let 对象名 {} let 对象名 new 0bject() 对象本质是无序的数据集合,操作数据无非就是 增 删 改 查 语法: 属性-查 声明对象,并添加了若干属性后,可以使用.获得…

市场趋势解析与交易策略优化

市场趋势解析与交易策略优化 在市场环境不断变化的情况下,理解市场趋势并优化交易策略是交易者稳健发展的关键。通过科学的方法识别市场动向,结合数据分析优化交易方案,可以提高交易效率并降低风险。本文将探讨趋势分析的要点,并介…

Tomcat 是什么?有什么功能和作用?为什么启动 Spring 或 Spring Boot 项目需要 Tomcat?

本文的内容是博主学习并记录关于 Tomcat 的基本知识,介绍了 Tomcat 为什么是一个 Web 应用服务器,为什么是 Servlet 容器,同时总结了 Tomcat 的一些功能原理,并详细介绍了 Tomcat 在 Spring 和SpringBoot 项目中的使用原理。本文不…