CN / EN
CN / EN

写技术文章

从0开始移植OTA<以ble_app_uart工程为例代码级讲解移植小升大升级方式>

Chester

2022-06-22 10:45:57

准备工作:SDK、手机一台、Keil集成开发工具、SK开发板。

需要的例程:SDK中projects\ble\dfu\ble_dfu_boot工程和projects\ble\ble_peripheral\ble_app_uart工程,其中ble_dfu_boot未做任何改动,所有的软件改动都是在ble_app_uart工程中。

软件移植步骤:

1、在主函数中调用dfu_schedule自行调度dfu程序并添加相应的头文件#include "gr55xx_dfu.h",如下代码:

while (1)
{
app_log_flush();
transport_schedule();
dfu_schedule();//add dfu schedule
pwr_mgmt_schedule();
}


2、在custom_config.h文件中修改APP_CODE_LOAD_ADDR和APP_CODE_RUN_ADDR使其和boot固件不会产生覆盖的情况,如下代码:

// <o> Code load address
// <i> Default: 0x01002000
#define APP_CODE_LOAD_ADDR 0x01040000

// <o> Code run address
// <i> Default: 0x01002000
#define APP_CODE_RUN_ADDR 0x01040000

3、在user_periph_setup.c文件中修改蓝牙MAC地址以及名称,防止跳转到boot之后无法搜索到相应的蓝牙信号,可将地址修改为和boot固件地址不相同的任意地址,如下代码:

static const uint8_t s_bd_addr[SYS_BD_ADDR_LEN] = {0x16, 0x00, 0xcf, 0x3e, 0xcb, 0xea};//Modify the Bluetooth address

4、在gr_libraries和gr_profiles工程文件夹下分别添加dfu_port.c和otas.c文件,如下图所示:


5、在 user_periph_setup.c 文件的app_periph_init函数中初始化dfu的端口并包含相应的头文件#include "dfu_port.h",如下代码所示:

void app_periph_init(void)
{
SYS_SET_BD_ADDR(s_bd_addr);
uart_init();
app_log_assert_init();
pwr_mgmt_mode_set(PMR_MGMT_ACTIVE_MODE);
dfu_port_init(NULL, &dfu_pro_call);//add dfu port
}

6、由于在第4个步骤中需要调用dfu_pro_call,该结构体需要自己重新定义,请参考ble_app_template_dfu工程中相关实现,如下图代码所示:

static void dfu_program_start_callback(void);
static void dfu_programing_callback(uint8_t pro);
static void dfu_program_end_callback(uint8_t status);

static dfu_pro_callback_t dfu_pro_call =
{
.dfu_program_start_callback = dfu_program_start_callback,
.dfu_programing_callback = dfu_programing_callback,
.dfu_program_end_callback = dfu_program_end_callback,
};

static void dfu_program_start_callback(void)
{
APP_LOG_DEBUG("Dfu start program");
}

static void dfu_programing_callback(uint8_t pro)
{
APP_LOG_DEBUG("Dfu programing---%d%%", pro);
}

static void dfu_program_end_callback(uint8_t status)
{
APP_LOG_DEBUG("Dfu program end");
if (0x01 == status)
{
APP_LOG_DEBUG("status: successful");
}
else
{
APP_LOG_DEBUG("status: error");
}
}

7、 在user_app.c文件的services_init函数中将dfu的服务初始化:dfu_service_init(dfu_enter);并添加相应的头文件#include "dfu_port.h"和#include "dfu_check.h",如下图代码所示:

static void services_init(void)
{
sdk_err_t error_code;
gus_init_t gus_init;

gus_init.evt_handler = gus_service_process_event;

error_code = gus_service_init(&gus_init);
APP_ERROR_CHECK(error_code);

dfu_service_init(dfu_enter);//add dfu service
}

8、将dfu_check.c和dfu_check.h文件拷贝至当前需要移植dfu功能的目录,并在user_app工程文件夹下添加dfu_check.c文件,如下图所示:



至此,ble_app_uart工程就具备OTA功能了,和ble_dfu_boot固件一同下载至SK开发板,按照如下步骤升级即可:

app实际操作步骤:

1、连接ble_app_uart蓝牙,此处是我自己将Goodix_UART蓝牙名称改成了Goodix_OTA_TEST方便测试,点击右上角的小火箭图标,准备进入boot固件:


2、设置好相关的跳转信息,此处需要按照软件移植步骤3中的设置蓝牙地址进行设置,如下图:


3、此时如果未成功跳转,请检查相关的地址和跳转指令是否正确,如果成功跳转到boot固件,会显示出如下画面:


4、选择需要升级的固件并点击完成后重启,等待升级完成,查看MAC和蓝牙名称查看是否升级成功,如下图:



至此,OTA升级功能移植完成。

1收藏

4赞成

8条评论
您的评论
我们时刻倾听您的声音
联系销售

扫描关注公众号

打开微信,使用“扫一扫”即可关注