Skip to content

由 大锤子 贡献,Ai-Thinker 进行整理

【WB2蓝牙学习-3】实现链接状态指示

前边的文章入门了蓝牙的基本知识,和回调函数。这次实现蓝牙控制LED灯。

1、通过蓝色LED灯闪烁状态指示蓝牙的链接状态;

2、链接后,控制红色LED灯的亮灭;

创建工程

这里直接复制 /Ai-Thinker-WB2/applications/bluetooth 目录下的 ble_slave 工程,重命名为ble_slave_led。

编译,烧录验证工程的正确;然后在该工程的基础上添加需要的功能;

添加灯闪烁任务

在目录 /Ai-Thinker-WB2/applications/bluetooth/ble_slave_led/ble_slave_led 目录下添加两个文件:

led.c 和 led.h

led.h

📜 点击展开完整代码
html
#ifndef __LED_H_
#define __LED_H_

void blink_test(void *param);

#endif // !__LED_H_

led.c

📜 点击展开完整代码
c
#include <stdio.h>

#include <string.h>

#include <FreeRTOS.h>

#include <task.h>

#include <bl_gpio.h>

#include "led.h"

#define GPIO_LED_PIN 3

void blink_test(void *param)
{
    uint8_t value = 1;
    while (1)
    {
        bl_gpio_enable_output(GPIO_LED_PIN, 0, 0);
        printf("Turning the LED %s! \r\n", value == 1 ? "ON" : "OFF");
        bl_gpio_output_set(GPIO_LED_PIN, value);
        value = !value;
        vTaskDelay(1000);
    }
}

在main.c 文件中添加led 闪烁任务:

📜 点击展开完整代码
html
void main()
{
    bl_sys_init();
    puts("[OS] proc_main_entry task...\r\n");
    xTaskCreate(TaskUart, "TaskUart", 2048, NULL, 15, NULL);
    xTaskCreate(proc_main_entry, (char *)"main_entry", 1024, NULL, 15, NULL);
    xTaskCreate(blink_test, "blink", 1024, NULL, 15, NULL);
}

这一步完成之后我们将得到一个带有蓝色LED闪烁的蓝牙slave程序。

接下来我们添加LED 指示程序:

当蓝牙链接成功LED停止闪烁;当断开链接LED重新开始闪烁;

添加LED状态指示代码

由于demo中使用了FreeRTOS, 上一步添加的灯闪烁程序是创建了一个FreeRTOS任务。 需要通过任务间通信的方式实现。在链接成功后发送消息给闪灯程序暂停闪灯。 如果断开链接发送消息开始闪灯;

在上一步中创建LED闪烁任务时没有指定闪烁任务句柄。 也就没法控制任务的运行状态。

声明任务句柄

在led.h 中声明一个任务句柄变量,通过句柄来控制任务的运行状态。

创建任务指定句柄

根据FreeRTOS的api 在创建任务时,最后一个参数就是所创建任务的句柄;

使用句柄来控制任务

在链接成功的回调函数中挂起任务

在断开链接的回调函数中重新唤醒任务

添加LED控制代码

添加LED控制代码:

特性写回调函数中实现控制LED功能;

功能演示

Released under the MIT License. Build Time 2026-09-11 14:52:23