STM32 模块化开发指南 · 第 4 篇 用状态机管理 BLE 应用逻辑:分层解耦的 ...

打印 上一主题 下一主题

主题 1485|帖子 1485|积分 4455



   本文是《STM32 模块化开发实战指南》第 4 篇,聚焦于 BLE 模块中的状态管理题目。我们将先容如何通过有限状态机(Finite State Machine, FSM)架构,实现 BLE 广播、扫描、毗连等行为的解耦与可控,并配合事故队列驱动完成主从共存、低功耗友爱、状态清晰的 BLE 应用。
  <hr> 一、为什么必要状态机?

在裸机 STM32 项目中,BLE 功能往往涉及多种模式:广播、扫描、毗连、断开等。假如直接在主循环中判断标记位处置惩罚,会出现以下题目:


  • 状态跳转混乱,难以追踪

  • 功能逻辑耦合,影响扩展

  • 难以保障操作时序(如扫描未停就开始毗连)
因此,使用 FSM 管理 BLE 应用逻辑,是构建可靠嵌入式蓝牙模块的核心
<hr> 二、BLE 模块的典范状态图(主从共存)

  1. [INIT]
  2.   ↓
  3. [IDLE] ←→ [ADV](被动广播)
  4.    ↓        ↑
  5. [SCAN]     |
  6.    ↓        |
  7. [CONNECT] ←→ [CONNECTED]
复制代码
  每个状态有清晰职责,状态转移由事故触发控制,如:下令输入、BLE 堆栈事故、超时触发。
  <hr> 三、状态界说(ble_fsm.h)

  1. #ifndef BLE_FSM_H
  2. #define BLE_FSM_H
  3. typedef enum {
  4.     BLE_STATE_INIT = 0,
  5.     BLE_STATE_IDLE,
  6.     BLE_STATE_ADV,
  7.     BLE_STATE_SCAN,
  8.     BLE_STATE_CONNECTING,
  9.     BLE_STATE_CONNECTED,
  10. } ble_state_t;
  11. typedef enum {
  12.     BLE_EVT_NONE = 0,
  13.     BLE_EVT_START_ADV,
  14.     BLE_EVT_STOP_ADV,
  15.     BLE_EVT_START_SCAN,
  16.     BLE_EVT_STOP_SCAN,
  17.     BLE_EVT_CONNECTED,
  18.     BLE_EVT_DISCONNECTED,
  19.     BLE_EVT_CMD_RESET
  20. } ble_event_t;
  21. void ble_fsm_init(void);
  22. void ble_fsm_handle_event(ble_event_t event);
  23. ble_state_t ble_fsm_get_state(void);
  24. #endif
复制代码
<hr> 四、状态机实现(ble_fsm.c)

  1. #include "ble_fsm.h"
  2. #include
复制代码
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

梦见你的名字

论坛元老
这个人很懒什么都没写!
快速回复 返回顶部 返回列表