LED Blink 模块
模块简介
LED Blink 是一个 LED 灯效控制模块,提供了丰富的 LED 状态控制和闪烁效果。该模块支持多个 LED 的独立控制,包括常亮、常灭、快闪、慢闪、交替闪烁等多种状态,并支持错误优先级管理和闪烁时长控制。该模块封装了 GPIO 控制、定时器管理和状态机逻辑,为上层应用提供简单的 LED 控制接口。
核心特性
多 LED 支持: 支持最多 4 个 LED 独立控制
多种状态: 支持常亮、常灭、快闪、慢闪、交替闪烁
错误优先级: 支持错误类型优先级管理(严重错误 > 警告)
时长控制: 支持设置闪烁持续时间
状态投票: 支持多个状态源投票,自动选择最高优先级状态
线程安全: 使用互斥锁保护 LED 操作
模块架构
LED Blink 模块架构如下:
应用层 (Application)
↓
LED App API (led_app.h)
↓
LED Blink API (led_blink.h)
↓
LED 控制块 (LedControlBlock)
↓
GPIO 控制 (bk_gpio)
↓
LED 硬件
工作流程
初始化流程
led_driver_init() 详细流程:
1. 初始化互斥锁
- rtos_init_mutex(&led_mutex)
↓
2. 清零 LED 控制块数组
- memset(led_pool, 0, sizeof(led_pool))
↓
3. 注册红色 LED
- led_register(RED_LED)
↓
4. 注册绿色 LED
- led_register(GREEN_LED)
↓
初始化完成
LED 状态设置流程
led_app_set() 详细流程:
1. 解析操作类型
- 根据 led_operate_t 确定 LED 和状态
↓
2. 获取 LED 句柄
- 根据操作类型获取对应的 LED 句柄
↓
3. 设置 LED 状态
- led_set_state(led_handle, new_state, time)
↓
4. 更新控制块
- 更新 LedControlBlock 结构
- 设置闪烁间隔和持续时间
↓
5. 启动定时器
- 如果为闪烁状态,启动定时器
↓
状态设置完成
LED 闪烁流程
定时器回调流程:
1. 定时器到期触发回调
- timer_callback(led_handle)
↓
2. 检查持续时间
- 如果设置了持续时间且已到期,停止闪烁
↓
3. 检查错误状态
- 如果存在错误,按错误优先级闪烁
↓
4. 切换 LED 状态
- 翻转 led_status
- 更新 GPIO 输出
↓
5. 继续定时器
- 如果未到期,继续定时器
↓
循环步骤 1-5
LED 状态投票流程
led_blink() 详细流程:
1. 处理指示状态(绿色 LED)
- 检查 indicates_state 位掩码
- 按优先级选择状态
↓
2. 处理警告状态(红色 LED)
- 检查 warning_state 位掩码
- 按优先级选择状态
↓
3. 应用状态
- 调用 led_app_set() 设置 LED 状态
↓
状态更新完成
重要接口
初始化接口
/**
* @brief 初始化 LED 驱动
*
* 初始化互斥锁,注册红色和绿色 LED
*/
void led_driver_init(void);
LED 控制接口
/**
* @brief 设置 LED 状态
*
* @param oper LED 操作类型
* @param time 持续时间(毫秒),0xFFFFFFFF 表示永久
*/
void led_app_set(led_operate_t oper, uint32_t time);
/**
* @brief LED 状态投票
*
* 根据警告状态和指示状态自动选择 LED 状态
*
* @param warning_state 警告状态位掩码指针
* @param indicates_state 指示状态位掩码
*/
void led_blink(uint32_t *warning_state, uint32_t indicates_state);
LED 状态类型
typedef enum {
LED_OFF = 0, // 关闭
LED_ON, // 常亮
LED_FAST_BLINK, // 快闪
LED_SLOW_BLINK, // 慢闪
LED_ALTERNATE // 交替闪烁
} LedState;
LED 操作类型
typedef enum {
// 绿色 LED
LED_OFF_GREEN,
LED_ON_GREEN,
LED_FAST_BLINK_GREEN,
LED_SLOW_BLINK_GREEN,
// 红色 LED
LED_OFF_RED,
LED_ON_RED,
LED_FAST_BLINK_RED,
LED_SLOW_BLINK_RED,
// 交替闪烁
LED_REG_GREEN_ALTERNATE,
LED_REG_GREEN_ALTERNATE_OFF,
// 错误状态
LED_ERROR_CRITICAL,
LED_ERROR_WARNING,
LED_ERROR_CRITICAL_CLOSE,
LED_ERROR_WARNING_CLOSE,
} led_operate_t;
警告状态定义
enum {
WARNING_PROVIOSION_FAIL, // 配网失败(快闪红色)
WARNING_WIFI_FAIL, // Wi-Fi 失败(快闪红色)
WARNING_RTC_CONNECT_LOST, // RTC 连接丢失(快闪红色)
WARNING_AGENT_OFFLINE, // Agent 离线(快闪红色)
WARNING_AGENT_AGENT_START_FAIL, // Agent 启动失败(快闪红色)
WARNING_LOW_BATTERY, // 低电量(慢闪红色)
};
指示状态定义
enum {
INDICATES_WIFI_RECONNECT, // Wi-Fi 重连(快闪绿色)
INDICATES_PROVISIONING, // 配网中(红绿交替)
INDICATES_POWER_ON, // 上电(常亮绿色)
INDICATES_STANDBY, // 待机(慢闪绿色)
INDICATES_AGENT_CONNECT, // Agent 连接(快闪绿色)
};
主要宏定义
配置宏
// 启用 LED Blink 模块
CONFIG_LED_BLINK=y
硬件配置
// LED GPIO 定义
#define RED_LED 40 // 红色 LED GPIO
#define GREEN_LED 41 // 绿色 LED GPIO
// LED 数量限制
#define MAX_LED_NUM 4
闪烁时间配置
// 快闪间隔(毫秒)
#define LED_FAST_BLINK_TIME 200
// 慢闪间隔(毫秒)
#define LED_SLOW_BLINK_TIME 1000
// 永久闪烁
#define LED_LAST_FOREVER 0xFFFFFFFF
使用示例
基本使用
#include "led_app.h"
void example_usage(void)
{
// 初始化 LED
led_driver_init();
// 设置绿色 LED 快闪
led_app_set(LED_FAST_BLINK_GREEN, LED_LAST_FOREVER);
// 设置红色 LED 慢闪 5 秒
led_app_set(LED_SLOW_BLINK_RED, 5000);
// 关闭绿色 LED
led_app_set(LED_OFF_GREEN, 0);
}
状态投票使用
void state_voting_example(void)
{
uint32_t warning_state = 0;
uint32_t indicates_state = 0;
// 设置警告状态
warning_state |= (1 << WARNING_WIFI_FAIL);
// 设置指示状态
indicates_state |= (1 << INDICATES_STANDBY);
// 自动选择 LED 状态
led_blink(&warning_state, indicates_state);
// 结果:红色快闪(警告优先级高于指示)
}
注意事项
状态优先级: 警告状态优先级高于指示状态,严重错误优先级高于警告
闪烁间隔: 快闪间隔 200ms,慢闪间隔 1000ms,可在头文件中修改
状态投票: 使用
led_blink()时,会自动根据优先级选择状态