【蓝牙5.2 PB-03教程】SDK二次开发入门,认识架构,开始点亮一盏LED

[复制链接]
查看582 | 回复0 | 2024-10-23 14:40:55 | 显示全部楼层 |阅读模式
一、PB-03系列二次开发架构说明
1.1 模块启动流程
首先,要了解芯片的启动流程,如下图所示看到我手上的PB-03模组是支持OTA的。
1.png
ROM 部分:启动并引导-或者 Boot loader 或者 Application 和 BLE 协议栈 API,PB-03是没有 TM 引脚的,通过上电后特定的时间内配合上位机实现进去烧录模式。而像 PB-02模组,启动是通过 TM 管脚的高低电平选择编程模式(高电平)还是正常启动模式(低电平)。
OTA Boot loader:用于引导 Application 以及处理 OTA 升级。
Application:应用代码,绝大部分二次开发工作都集中在 Application 部分。
1.2 SDK介绍
2.png
可二次开发的 SDK 没有使用第三方的 RTOS,不过在应用层抽象了 Task 概念,对于 BLE 应用,以下 Task 是必须的,每个 Task 分别包括一个初始化函数和一个事件处理函数,具体说明请参考下资料文件《PHY62XX_SDK_Application_Guide_v1.0.pdf》。
3.png
应用一般定义一到多个 Task,典型场景(例程)一般只用一个应用 Task。人机交互,外设 控制,BLE 广播和连接的配置,GATT Profile 的加载等事务都在应用 Task 实现。任务以内以及任务之间可以通过 OSAL 提供的 API 进行交互和通信。

二、快速入门,点亮一颗LED

首先我们打开 my_example/gpio 这个工程,找到任务分配函数 osalInitTasks();,为了方便用户开发业务程序,每个业务要以一个 Task 单独存在,Task 的唯一标准用其 ID 组成,像下面这个的写法。
  1. void osalInitTasks( void )
  2. {
  3.     uint8 taskID = 0;
  4.     tasksEvents = (uint16*)osal_mem_alloc( sizeof( uint16 ) * tasksCnt);
  5.     osal_memset( tasksEvents, 0, (sizeof( uint16 ) * tasksCnt));
  6.     LL_Init( taskID++);
  7.     Blink_Init(taskID);
  8. }
复制代码
最重要的如何定义一个任务回调函数,注意这数组的的顺序,即每个子元素所在的下标,对应 osalInitTasks() 方法的任务传参顺序。
  1. // The order in this table must be identical to the task initialization calls below in osalInitTask.
  2. const pTaskEventHandlerFn tasksArr[] =
  3. {
  4.     LL_ProcessEvent,
  5.     Blink_ProcessEvent,
  6. };
复制代码
任务使用,闪烁一盏LED。
  1. void Blink_Init(uint8 task_id)
  2. {
  3.     LOG("%s task_id=%d \n", __FUNCTION__, task_id);
  4.     Blink_TaskID = task_id;

  5.     // LED 转换
  6.     hal_gpio_pin_init(LED_GPIO, OEN);
  7.     hal_gpio_write(LED_GPIO, 1);

  8.     osal_start_timerEx(Blink_TaskID, Blink_Task_EVT, 1000);
  9. }

  10. uint16 Blink_ProcessEvent(uint8 task_id, uint16 events)
  11. {
  12.     //判断是否这个任务ID
  13.     if (task_id != Blink_TaskID)
  14.     {
  15.         return 0;
  16.     }
  17.    //判断所在的ID是否一致
  18.     if (events & Blink_Task_EVT)
  19.     {
  20.         // LED 转换
  21.         LED_Toggle(LED_GPIO);
  22.         //延迟一秒
  23.         WaitMs(1000);
  24.         LOG("%s \n", __FUNCTION__);
  25.         osal_start_timerEx(Blink_TaskID, Blink_Task_EVT, 2000);
  26.         return (events ^ Blink_Task_EVT);
  27.     }
  28.     return 0;
  29. }
复制代码
本文对应的源码下载:https://github.com/xuhongv/PHY6252_6222_SDK/tree/main/my_examples/peripheral/gpio
用心做好保姆工作
回复

使用道具 举报

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

本版积分规则