【STM32】狀態機(State Machine)

這篇博客介紹 狀態機(State Machine),適合用于嵌入式開發、驅動開發、協議解析、按鍵識別等多種場景。

一、什么是狀態機(State Machine)?

狀態機(State Machine)是一種用于描述系統行為的抽象模型,它能夠根據當前狀態和輸入條件,轉換到下一個狀態,并執行相應操作。

在這里插入圖片描述

使用場景常見有:

  • 按鍵消抖與識別
  • 通信協議(如 UART、Modbus、CAN)
  • 嵌入式流程控制(菜單系統、流程調度等)(我們此前的文章為貪吃蛇小游戲設計菜單系統 和 貪吃蛇的狀態改變 便用到了狀態機)
  • Linux 驅動狀態切換
  • UI 界面狀態設計
  • …等
二、狀態機的基本組成
元素說明
狀態(State)系統可能處于的狀態集合,例如:IDLE、WAIT、RUN
事件/輸入(Event)觸發狀態轉移的條件,例如:按鍵按下、超時、數據接收
動作(Action)狀態轉移時執行的操作,例如:發送數據、點亮LED
轉移(Transition)狀態 + 輸入 → 新狀態 + 動作
狀態機分類
類型說明示例
有限狀態機(FSM)狀態數量有限,事件驅動型按鍵識別
Mealy 狀態機輸出依賴于狀態 + 輸入通信協議
Moore 狀態機輸出只依賴當前狀態電梯狀態控制
層級狀態機狀態嵌套,適合復雜系統UI 菜單系統
三、狀態機圖示(例:按鍵識別)
+---------+      按下      +---------+
|  空閑態 | -------------> | 按下態  |
+---------+               +---------+^                         ||                         | 松開|                         v
+---------+ <------------- +---------+
| 單擊處理 |               | 松開態  |
+---------+      超時      +---------+
四、代碼模版說明(結構體 + 函數指針實現)

? 1. 狀態定義

typedef enum {STATE_IDLE,STATE_PRESS,STATE_RELEASE,STATE_CLICK,STATE_MAX
} State_t;

? 2. 事件定義

typedef enum {EVENT_NONE,EVENT_KEY_DOWN,EVENT_KEY_UP,EVENT_TIMEOUT
} Event_t;

? 3. 狀態處理函數指針表

typedef void (*ActionFunc)(void);typedef struct {State_t current_state;Event_t event;State_t next_state;ActionFunc action;
} StateTable_t;

? 4. 狀態轉移表

void do_nothing(void) {}
void handle_click(void) { printf("Click!\n"); }StateTable_t state_table[] = {{STATE_IDLE,    EVENT_KEY_DOWN,   STATE_PRESS,    do_nothing},{STATE_PRESS,   EVENT_KEY_UP,     STATE_CLICK,    handle_click},{STATE_CLICK,   EVENT_TIMEOUT,    STATE_IDLE,     do_nothing},{STATE_PRESS,   EVENT_TIMEOUT,    STATE_IDLE,     do_nothing},
};

? 5. 狀態機執行函數

State_t current_state = STATE_IDLE;void state_machine_run(Event_t evt) {for (int i = 0; i < sizeof(state_table)/sizeof(StateTable_t); ++i) {if (state_table[i].current_state == current_state &&state_table[i].event == evt) {if (state_table[i].action) {state_table[i].action();}current_state = state_table[i].next_state;break;}}
}
狀態機的實際作用:
場景						狀態說明
按鍵處理					IDLE → PRESS → RELEASE → CLICK
通信協議					WAIT_RX → RECEIVING → PARSE → REPLY
UI 界面					主界面 → 設置界面 → 子菜單 → 返回
電機控制					停止 → 加速 → 穩速 → 減速

使用狀態機時需要注意:① 狀態機邏輯清晰,避免 if/else 嵌套過深;② 使用結構體+函數指針提高可擴展性;③ 可配合定時器、事件隊列使用;④ 狀態機應保持單一職責,避免過度復雜。

狀態機調試方法:

狀態打印					每次狀態切換打印當前狀態
圖示輔助					畫狀態圖幫助理清邏輯
加日志					用 log 函數記錄狀態流轉
使用斷點					在 state_machine_run() 中下斷點觀察轉移

狀態機是嵌入式開發中最實用的控制邏輯模型之一,掌握它能幫助在程序邏輯中有效管理復雜流程、提高代碼可讀性與可維護性。

以上,歡迎有從事同行業的電子信息工程、互聯網通信、嵌入式開發的朋友共同探討與提問,我可以提供實戰演示或模板庫。希望內容能夠對你產生幫助!

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/922103.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/922103.shtml
英文地址,請注明出處:http://en.pswp.cn/news/922103.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

深度學習在離崗檢測中的應用

離崗檢測技術正逐步成為現代企業精細化管理和安全生產的重要工具。這項基于計算機視覺和人工智能的應用&#xff0c;通過自動化、實時化的監測方式&#xff0c;有效提升了工作紀律性和運營效率&#xff0c;為項目管理者和企業提供了創新的監管解決方案。在許多工作場景中&#…

Spring緩存(二):解決緩存雪崩、擊穿、穿透問題

1. 緩存穿透問題與解決方案 1.1 什么是緩存穿透 緩存穿透是指查詢一個不存在的數據&#xff0c;由于緩存中沒有這個數據&#xff0c;每次請求都會直接打到數據庫。 如果有惡意用戶不斷請求不存在的數據&#xff0c;就會給數據庫帶來巨大壓力。 這種情況下&#xff0c;緩存失去了…

PHP 與 WebAssembly 的 “天然隔閡”

WebAssembly&#xff08;簡稱 WASM&#xff09;是一種低級二進制指令格式&#xff0c;旨在為高級語言提供高性能的編譯目標&#xff0c;尤其在瀏覽器環境中實現接近原生的執行效率。它主要用于前端性能密集型場景&#xff08;如游戲引擎、視頻編解碼、3D 渲染等&#xff09;&am…

unity中通過拖拽,自定義scroll view中子物體順序

1.在每個content的子物體上掛載DragHandler腳本&#xff0c;并且添加Canvs Group組件&#xff0c;設置見圖2.DragHandler腳本內容&#xff1a;using UnityEngine; using UnityEngine.UI; using UnityEngine.EventSystems; using System.Collections.Generic; using System.Coll…

用 Matplotlib 繪制餅圖:從基礎語法到實戰美化,全面掌握分類數據可視化技巧

用 Matplotlib 繪制餅圖:從基礎語法到實戰美化,全面掌握分類數據可視化技巧 在數據分析與可視化的世界里,**“圖勝千言”**早已成為共識。而在眾多圖表類型中,餅圖(Pie Chart)以其直觀的比例展示方式,成為展示分類數據分布的常見選擇。無論是業務報表、用戶畫像,還是市…

基礎算法之二分算法 --- 2

大家好&#xff0c;不同的時間&#xff0c;相同的地點&#xff0c;時隔多日我們又見面了。繼上次的二分算法后&#xff0c;我們這次要來學習的是二分答案了。這個部分相較于前面的二分算法難度有相當的提升&#xff0c;希望大家有所準備。雖然難度增加了&#xff0c;但是博主還…

發揮nano banana的最大能力

1. 概述Nano Banana 簡介&#xff1a;Nano Banana 是 Google DeepMind 開發的 AI 圖像生成與編輯模型&#xff0c;集成在 Google Gemini 平臺中&#xff08;具體為 Gemini 2.5 Flash 版本&#xff09;。它以高效的圖像編輯能力聞名&#xff0c;尤其在角色一致性、光影理解和快速…

leetcode 面試題01.02判定是否互為字符重排

一、問題描述二、解題思路解法一&#xff1a;對s1和s2進行sort排序&#xff0c;返回s1是否等于s2&#xff1b;解法二&#xff1a;用哈希表分別來記錄s1和s2中字符出現的次數&#xff0c;統計完后&#xff0c;判斷兩個哈希表是否相等;三、代碼實現解法一&#xff1a;時間復雜度&…

Python Yolo8 物體識別

支持單張圖片/圖片目錄批量預標注 默認使用cuda GPU .env HTTP_PROXYhttp://192.168.2.109:10808 HTTPS_PROXYhttp://192.168.2.109:10808pyproject.toml [project] name "yolo-test" version "0.1.0" description "Add your description here&quo…

LeetCode100-234回文鏈表

本文基于各個大佬的文章上點關注下點贊&#xff0c;明天一定更燦爛&#xff01;前言Python基礎好像會了又好像沒會&#xff0c;所有我直接開始刷leetcode一邊抄樣例代碼一邊學習吧。本系列文章用來記錄學習中的思考&#xff0c;寫給自己看的&#xff0c;也歡迎大家在評論區指導…

BUG排查流程

引言簡述Bug排查的重要性分享個人或團隊在Bug排查中的常見挑戰引出日記形式記錄的價值日記格式設計時間戳&#xff1a;記錄問題發現和解決的時間節點問題描述&#xff1a;清晰定義Bug的現象和影響范圍環境信息&#xff1a;操作系統、版本號、依賴庫等關鍵配置復現步驟&#xff…

汽車功能安全 Functional Safety ISO 26262 測試之一

汽車電子電氣系統的日益復雜使得功能安全成為保障車輛可靠性和駕乘安全的關鍵。 本文將圍繞ISO 26262標準的核心內容展開&#xff0c;幫助大家理解如何通過系統化的方法控制風險&#xff0c;進行測試&#xff0c;確保產品安全。 01 什么是功能安全&#xff1f; 首先&#xff0c…

人形機器人賽道的隱形勝負手:低延遲視頻鏈路如何決定機器人未來

一、引言&#xff1a;爆發前夜的人形機器人賽道 2025 年&#xff0c;被業內稱為“人形機器人量產元年”。政策與資本的合力&#xff0c;讓這條原本還帶著科幻色彩的產業賽道&#xff0c;驟然進入現實加速期。國家層面&#xff0c;《“機器人”行動計劃》明確提出要推動人形機器…

從iPhone 17取消SIM卡槽,看企業如何告別“數據孤島”

9月10日&#xff0c;蘋果公司如期召開秋季新品發布會&#xff0c;正式推出iPhone 17系列。除了性能和拍照的常規升級&#xff0c;一個看似不起眼但意義深遠的改變引起了廣泛關注——iPhone 17 Pro系列全面取消了實體SIM卡槽&#xff0c;只保留了eSIM功能。這一舉動不僅僅是技術…

【JavaWeb01】Web介紹

文章目錄1.導學2.Web開發介紹2.1 Web網站的工作流程2.2 前后端分離開發1.導學 2.Web開發介紹 2.1 Web網站的工作流程 瀏覽器根據請求的域名請求對應的前端服務器&#xff0c;前端服務器接收到請求之后&#xff0c;把對應的前端代碼返回給服務器。瀏覽器中有解析前端代碼的解析引…

鏈路預測算法MATLAB實現

鏈路預測算法MATLAB實現 鏈路預測是復雜網絡分析中的重要任務&#xff0c;旨在預測網絡中尚未連接的兩個節點之間未來產生連接的可能性。 程序概述 MATLAB程序實現了以下鏈路預測算法&#xff1a; 基于局部信息的相似性指標&#xff08;Common Neighbors, Jaccard, Adamic-Adar…

淘寶商品詳情 API 的安全強化與生態協同創新路徑

一、安全強化&#xff1a;從 “被動防御” 到 “主動免疫” 的體系升級動態身份認證與權限顆粒化構建 “生物特征 設備指紋 行為基線” 的三重認證機制&#xff1a;結合用戶操作習慣&#xff08;如點擊間隔、滑動軌跡&#xff09;生成動態令牌&#xff0c;對高權限接口&#…

快消26屆聯合利華校招AI測評及第二輪線上認知能力測評SHL筆試真題及評分要求

在求職的道路上&#xff0c;聯合利華作為一家全球知名企業&#xff0c;其招聘流程一直備受關注。尤其是其AI面試環節&#xff0c;更是讓許多求職者既期待又緊張。本文將詳細總結聯合利華AI面試的規律與應對策略&#xff0c;希望能為正在準備面試的你提供一些幫助。一、聯合利華…

使用Langchain生成本地rag知識庫并搭載大模型

準備設備&#xff1a; 手機aidlux2.0個人版 一、下載依賴pip install langchain langchain-community faiss-cpu pypdf二、安裝ollama并下載模型 curl -fsSL https://ollama.com/install.sh | sh #需要科學上網 ollama serve & #讓ollama服務在后臺運行安裝完畢可以查看oll…

L2-【英音】地道語音語調--語調

文章目錄語調英式語調四步法語調含義降調升調降升調升降語調如何正確表情達意1. 用降調的句型語調 英語里沒有任何一句話具有固定節奏模式 英式語調四步法 意群劃分重音核心語調&#xff08;重中之重&#xff09;語調的選擇 A French burglar broke-into-a flat while the o…