CH582使用OTA给自己的APP程序升级以及扩展APP空间修改教程(不带库升级)(图解)

OTA程序修改部分:

1.先准备好下方红圈这三个文件和需要给固件升级的APP程序文件

如果把这三个文件单独提到外面,可能会出现文件缺失,需要设置下公共文件夹的路径,建议放在例程文件夹中编译较为省心。

如果单拎出去,不要忘记把SRC、LIB、HAL三个文件夹一起带出去。

如果移植文件位置后编译出现文件缺失的报错,一般是文件相对路径不对,可参考这篇博客进行修改处理:Mounriver Studio文件移植报错示例及解决方法

 

2.JumpIAP程序修改如图:

 

3.修改APP文件(此处以Three-mode_kbd为例作APP修改讲解)

①预处理:目的让APP文件不带库编译,有的工程可能不会设置CH58xBLE_ROM = 1这个宏,如果添加了这个宏之后,编译后的RAM大小并没有缩减,一律自己动手屏蔽代码中所有的#include "CH58xBLE_LIB.h"

#include "CH58xBLE_ROM.h"这个库文件替换,这样就能确保APP不带库编译,能大幅降低RAM使用率。

 

 上图第⑤步除了LIB_FLASH_BASE_ADDRESSS=0x00040000还需要另外添加一项CH58xBLE_ROM=1

 

 

②Link文件修改

 

复制过去后,在键盘的link代码中修改

 

③startup启动文件修改

 

 复制之后,在键盘启动文件中修改:

 

④添加函数Jump_OTA

 

 找到上图中的红圈圈中的所有代码,选中复制到我们键盘代码中的

 



 

 这个Jump_OTA函数就是触发固件进OTA升级的关键,我们可以写一个串口中断或者按键IO中断或者别的一些方式调用一下这个函数,之后就会进入OTA升级模式;

比如void GPIOA_IRQHandler(void)
{

.........

printf("jump OTA!\r\n");

jump_OTA();

.........
}这种只是举个例子,这样我们触发GPIOA中断之后就会进入OTA升级模式。



 

⑤在main.c中添加下图内容,否则升级时,app会认为你放入的hex是非法的。如果用的ota例程,就无需添加,例程中已有这部分内容。

 

/* 用于APP判断文件有效性 */
const uint32_t Address = 0xFFFFFFFF;

__attribute__((aligned(4))) uint32_t Image_Flag __attribute__((section(".ImageFlag"))) = (uint32_t)&Address;

将这段代码放到APP主函数声明;

 4.修改IAP文件

①工程预处理:582添加LIB_FLASH_BASE_ADDRESSS=0x00040000

 

 ②link文件修改

 

③startup_CH583.S文件如APP一样修改即可:583将将j 0x10000修改为j 0x40000

 

 ④ota.h文件修改

这样代码部分就修改完毕了

接下来我们需要将文件全部编译后生成.hex文件,准备四合一烧录

四合一烧录工具链接:WCH_AssemblingFileTool.ZIP - 南京沁恒微电子股份有限公司

手机端OTA工具链接:BLE_OTA_Android.ZIP - 南京沁恒微电子股份有限公司 (wch.cn)

注意:JUMP_IAP,APP(例如这里的键盘程序),IAP三者的库文件都必须使用相同版本的ROMx库文件,否则会出现头文件类型不一致导致程序出现问题跑不通。

合并文件后生成一个新的BIN文件,将这个BIN文件烧录进芯片即可;



 

OTA升级流程:

先将我们需要升级的APP的hex文件提前放入手机文件夹,这里不要再放合成的文件了,只放APP部分的hex!

注意:这个需要固件升级的APP必须跟四合一中的APP一样是不带库编译处理过的文件!

 

放置完毕后,开始我们的升级流程;

我们利用程序中设置的中断入口,触发jump_OTA函数,如图,已经成功进入OTA,

 这时候拿出我们的手机,打开BLE_OTA_Android手机应用程序,会出现OTAOTAOTA的字样的蓝牙广播设备,

 点进去,之后点击GETINFO按钮,

之后会亮起IMAGEA或者IMAGEB的按钮,我这里就点击IMAGEA选择我要升级的固件了,

这样我们固件就升级完毕了,可以看下打印,

打印中也显示IAP_END表示升级完毕,流程到此结束。

 

posted on 2023-05-12 14:57  ZDeST  阅读(1091)  评论(0编辑  收藏  举报