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表示升级完毕,流程到此结束。