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

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


一、为什么需要状态机?

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

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

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

  • 难以保障操作时序(如扫描未停就开始连接)

因此,使用 FSM 管理 BLE 应用逻辑,是构建可靠嵌入式蓝牙模块的核心


二、BLE 模块的典型状态图(主从共存)

[INIT]
  ↓
[IDLE] ←→ [ADV](被动广播)
   ↓        ↑
 [SCAN]     |
   ↓        |
[CONNECT] ←→ [CONNECTED]

每个状态有清晰职责,状态转移由事件触发控制,如:命令输入、BLE 堆栈事件、超时触发。


三、状态定义(ble_fsm.h)

#ifndef BLE_FSM_H
#define BLE_FSM_H

typedef enum {
    BLE_STATE_INIT = 0,
    BLE_STATE_IDLE,
    BLE_STATE_ADV,
    BLE_STATE_SCAN,
    BLE_STATE_CONNECTING,
    BLE_STATE_CONNECTED,
} ble_state_t;

typedef enum {
    BLE_EVT_NONE = 0,
    BLE_EVT_START_ADV,
    BLE_EVT_STOP_ADV,
    BLE_EVT_START_SCAN,
    BLE_EVT_STOP_SCAN,
    BLE_EVT_CONNECTED,
    BLE_EVT_DISCONNECTED,
    BLE_EVT_CMD_RESET
} ble_event_t;

void ble_fsm_init(void);
void ble_fsm_handle_event(ble_event_t event);
ble_state_t ble_fsm_get_state(void);

#endif

四、状态机实现(ble_fsm.c)

#include "ble_fsm.h"
#include
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

damo王

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值