4.4 LED 实验
本节导读
API 学完了,动手!这一节我们把 LED 用起来:三个实验,由浅入深——
- 点亮 LED1(最简,验证 API 通路)
- LED1 闪烁(体验事件驱动的 Blink)
- 多灯组合(编号按位组合的实际应用)
原站本节内容已失效,本站按 GEC2530 开发板(对照底板原理图)与 SampleSwitch 工程重写。
实验前:接线与配置
不用接线! GEC2530 开发板的 4 个 LED 已经焊在底板上(对照原理图 Sheet 8):
| LED | 引脚 | 点亮方式 |
|---|---|---|
| LED1 | P1_0 | 低电平点亮(330Ω 限流) |
| LED2 | P1_1 | 低电平点亮 |
| LED3 | P1_4 | 低电平点亮 |
| LED4 | P0_1 | 低电平点亮 |
配置确认:SampleSwitch 工程默认已经定义了 HAL_LED=TRUE(在 hal_board_cfg.h 中),所以 LED 驱动会被初始化——直接能用。
生活类比:灯已装好、电已接通(HAL_LED=TRUE),你只需要学会"按开关"(调 API)。
实验一:点亮 LED1
在应用层初始化函数 zclSampleSw_Init() 末尾添加:
void zclSampleSw_Init(byte task_id) {
// ……原有初始化代码……
// 点亮 LED1
HalLedSet(HAL_LED_1, HAL_LED_MODE_ON);
}编译下载运行:LED1 常亮。
代码解析:HalLedSet(HAL_LED_1, HAL_LED_MODE_ON) = "告诉 HAL:让 LED1 处于点亮状态"。底层会把 P1_0 拉低(低电平点亮),你不用管引脚电平——这就是 HAL 封装的意义。
实验二:LED1 闪烁(亮 0.5s 灭 0.5s)
把上一句换成:
void zclSampleSw_Init(byte task_id) {
// ……原有初始化代码……
// LED1 闪烁 10 次:周期 1000ms、亮 50%
HalLedBlink(HAL_LED_1, 10, 50, 1000);
}编译下载运行:LED1 以 1 秒为周期闪烁 10 次(亮 500ms → 灭 500ms),闪完停住。
| 参数 | 值 | 含义 |
|---|---|---|
numBlinks | 10 | 闪 10 次 |
percent | 50 | 每个周期亮 50%(500ms) |
period | 1000 | 周期 1000ms(1 秒) |
想让它一直闪下去? 一个"偷懒"的小技巧——numBlinks 填 255 附近的数(例如 0xFF),或者直接在事件处理函数里用 3.3 节学过的"处理完再触发自己"套路,让闪烁状态持续更新。
想一想:为什么
HalLedBlink不卡住 CPU?因为闪烁是 HAL 任务的HAL_LED_BLINK_EVENT事件驱动的(4.2 讲过)——HAL 每到一个时间点更新一次 LED 状态,其他任务照常运行。这就是"事件驱动"的价值。
实验三:多灯组合(跑马灯预热)
LED 编号是按位编码的,可以组合。让 LED1 和 LED2 同时闪烁,然后全部点亮:
void zclSampleSw_Init(byte task_id) {
// ……原有初始化代码……
// LED1 和 LED2 一起闪 5 次
HalLedBlink(HAL_LED_1 | HAL_LED_2, 5, 50, 500);
// 1 秒后全部点亮(示意,可配合定时器事件实现)
HalLedSet(HAL_LED_1 | HAL_LED_2 | HAL_LED_3 | HAL_LED_4, HAL_LED_MODE_ON);
}拆解
HAL_LED_1 | HAL_LED_2:0x01 | 0x02 = 0x03,传给 API 后,API 按位判断——"0x03 里有 0x01 和 0x02,所以 LED1、LED2 都要操作"。组合的秘诀就是按位或|。
编译下载三步走
- 编译:在 IAR 中右键工程名 → Rebuild All,确认输出
0 Error(s);

- 下载仿真:连接仿真器,单击 Download and Debug(Ctrl+D)下载并进入仿真;
- 运行:单击 Go(F5)运行,观察 LED 效果。
变式挑战(课后)
| 挑战 | 提示 |
|---|---|
| 让 LED1 快闪、LED2 慢闪 | 调 period:一个 200ms、一个 1000ms |
| 让 4 个 LED 依次点亮 | HalLedSet + 定时器事件(3.3 节的套路) |
| 按一下按键切换 LED 状态 | 见第 5 章按键实验 |
小结
| 实验 | 代码 | 效果 |
|---|---|---|
| 点亮 | HalLedSet(HAL_LED_1, HAL_LED_MODE_ON) | LED1 常亮 |
| 闪烁 | HalLedBlink(HAL_LED_1, 10, 50, 1000) | 1s 周期闪 10 次 |
| 组合 | `HAL_LED_1 | HAL_LED_2` |
一句话总结:LED 实验 = 三个 API 走天下(Set 点亮 / Blink 闪烁 / 按位组合多灯),配合"Rebuild All → Download and Debug → Go"三连,LED 就乖乖听你指挥了。下一步,让它听按键的指挥!
内容来源:紫甲 IoT《ZigBee 3.0 开发指南》第三部分·4.4 节(原站已失效),本站按 GEC2530 开发板与教学实践重写;原站链接