例程中提供的两种OTA就不过多介绍了,在BLE目录下有一个PDF专门讲解:WCH蓝牙空中升级(BLE OTA)

方式一是带库升级,整个codeflash分成四个区域,Jump IAP,APP,OTA,IAP

Jump IAP为4K,这边分配4K是有讲究的,一开始我认为Jump IAP是没有作用的,可以省略,后面才知道,它有防止代码泄露的功能,固定大小4K,不要修改,

APP为216K,是用来放自己运行的代码的,需带有蓝牙功能,通过手机app蓝牙连接,将需要升级的固件放到OTA区域,

OTA为216K,是用来存放即将升级的固件,

IAP为12K,它的作用将OTA中的待升级固件写到APP区域完成升级,

使用此种升级方式,APP中带有蓝牙库,所以升级时带着蓝牙库一起升级,如果想要添加功能,可以在BackupUpgrade_OTA(APP)例程中修改,移植到自己的蓝牙代码中也很方便。

方式二是不带库升级,整个codeflash分成四个区域,Jump IAP,APP,IAP,LIB

Jump IAP为4K,用处和上面一样,此工程main中并无函数,会直接跳转到IAP,IAP的起始地址修改后,此工程启动文件中的地址也需对应修改,

APP为44K,设置这个大小的原因是为了使一些192Kflash的芯片也能直接使用OTA,此app可以不带蓝牙功能,

IAP为16K,它的作用就是将手机app发送的升级固件直接写到APP区域,

LIB为573的是128K,583的是192K。

那么就有一个问题,对于448Kflash的芯片,该如何扩大APP区域呢?

如果想要扩大,需要按照下面的步骤修改:

Jump IAP的修改十分简单,因为它的功能就只是跳转到IAP,因为APP要扩大,IAP要后移,只要如下图修改跳转地址即可:

582IAP起始地址为4+236=240k,填入0x0003C000 / 573IAP起始地址为4+300=304k,填入0x0004C000,截图修改的582,注意573有所不同,

APP需要修改四个地方,一是工程预处理,二是Link.ld,最后一个是启动文件startup_CH583.S,四是自己写的APP,那么还需额外添加Jump_OTA代码。

1.工程预处理:

582添加CH58xBLE_ROM=1 / 573添加CH57xBLE_ROM=1,如使用的OTA例程的APP,那么就无需再添加,因为本身就已经添加了,截图修改的582,注意573有所不同,

582添加LIB_FLASH_BASE_ADDRESSS=0x00040000/573添加LIB_FLASH_BASE_ADDRESSS=0x00050000,截图修改的582,注意573有所不同,

2.Link.ld修改:

如果是OTA例程的APP,那么就只需要修改一处,将原本给的44k按4k为单位扩大,建议直接给到最大,582为236k,573为300k,截图修改的582,注意573有所不同,

如果是自己的任意APP代码,那么将OTA例程的APP的Link.ld文件复制粘贴过来修改上面那一处即可。

3.startup_CH583.S修改:

如果是OTA例程的APP,那么也只需要修改一处,583将j 0x10000修改为j 0x40000,573将将j 0x10000修改为j 0x50000,截图修改的582,注意573有所不同,

如果是自己的任意APP代码,那么将OTA例程的APP的startup_CH583.S文件复制粘贴过来修改上面那一处即可。

4.添加Jump_OTA代码:可以按照自己的逻辑调用Jump_OTA跳入到IAP中开始升级,可以如下图,放在peripheral.c中,然后在蓝牙接收到数据后调用,当然,串口收到信息或按键触发调用也都是可以的。

/* OTA 升级标志 */
#define IMAGE_OTA_FLAG 0x03

/* 存放在DataFlash地址,不能占用蓝牙的位置 */
#define OTA_DATAFLASH_ADD 0x00077000 - FLASH_ROM_MAX_SIZE

/* flash的数据临时存储 */
__attribute__((aligned(8))) uint8_t block_buf[16];

/*********************************************************************
* @fn Jump_OTA
*
* @brief 跳转OTA升级
*
* @return none
*/
void Jump_OTA(void)
{
uint16_t i;
uint32_t ver_flag;

/* 读取第一块 */
EEPROM_READ(OTA_DATAFLASH_ADD, (uint32_t *)&block_buf[0], 4);

/* 擦除第一块 */
EEPROM_ERASE(OTA_DATAFLASH_ADD, EEPROM_PAGE_SIZE);

/* 更新Image信息 */
block_buf[0] = IMAGE_OTA_FLAG;

/* 编程DataFlash */
EEPROM_WRITE(OTA_DATAFLASH_ADD, (uint32_t *)&block_buf[0], 4);

/* 软复位 */
SYS_ResetExecute();
}

IAP需要修改四处,一是工程预处理,二是Link.ld,三是启动文件startup_CH583.S,最后一个是ota.h文件,

1.工程预处理:582添加LIB_FLASH_BASE_ADDRESSS=0x00040000/573添加LIB_FLASH_BASE_ADDRESSS=0x00050000,截图修改的582,注意573有所不同,

2.Link.ld文件:需要修改起始地址,582起始地址为4+236=240k,填入0x0003C000/573起始地址为4+300=304k,填入0x0004C000,截图修改的582,注意573有所不同,

3.ota.h文件:将APP大小修改为重新配置后的大小,截图修改的582,注意573有所不同,应修改为300 * 1024

4.startup_CH583.S文件如APP一样修改即可:583将将j 0x10000修改为j 0x40000,573将将j 0x10000修改为j 0x50000,截图修改的582,注意573有所不同,

LIB则是合并的时候选择带x后缀的hex文件,这个LIB是靠着flash最后的位置放的,可以让APP增大至最大。

将四个HEX合成一个之后使用isp工具烧录。

HEX合成工具链接:WCH_AssemblingFileTool.ZIP - 南京沁恒微电子股份有限公司

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

CH573 CH582 OTA例程讲解(使用固定库+扩大APP空间)的更多相关文章

  1. CH58X/CH57X/V208的Broadcaster(广播者)例程讲解

    在对ble进行应用的时候,每个用户的需求可能不尽相同.这里着重介绍从机Broadcaster例程,只广播不连接. 使用该例程时可以在手机使用APP上对Broadcaster进行调试. 安卓端在应用市场 ...

  2. 第三百三十六节,web爬虫讲解2—urllib库中使用xpath表达式—BeautifulSoup基础

    第三百三十六节,web爬虫讲解2—urllib库中使用xpath表达式—BeautifulSoup基础 在urllib中,我们一样可以使用xpath表达式进行信息提取,此时,你需要首先安装lxml模块 ...

  3. 第三百三十节,web爬虫讲解2—urllib库爬虫—实战爬取搜狗微信公众号—抓包软件安装Fiddler4讲解

    第三百三十节,web爬虫讲解2—urllib库爬虫—实战爬取搜狗微信公众号—抓包软件安装Fiddler4讲解 封装模块 #!/usr/bin/env python # -*- coding: utf- ...

  4. 第三百二十九节,web爬虫讲解2—urllib库爬虫—ip代理—用户代理和ip代理结合应用

    第三百二十九节,web爬虫讲解2—urllib库爬虫—ip代理 使用IP代理 ProxyHandler()格式化IP,第一个参数,请求目标可能是http或者https,对应设置build_opener ...

  5. 第三百二十八节,web爬虫讲解2—urllib库爬虫—状态吗—异常处理—浏览器伪装技术、设置用户代理

    第三百二十八节,web爬虫讲解2—urllib库爬虫—状态吗—异常处理—浏览器伪装技术.设置用户代理 如果爬虫没有异常处理,那么爬行中一旦出现错误,程序将崩溃停止工作,有异常处理即使出现错误也能继续执 ...

  6. 第三百二十七节,web爬虫讲解2—urllib库爬虫—基础使用—超时设置—自动模拟http请求

    第三百二十七节,web爬虫讲解2—urllib库爬虫 利用python系统自带的urllib库写简单爬虫 urlopen()获取一个URL的html源码read()读出html源码内容decode(& ...

  7. 实例讲解Oracle数据库设置默认表空间问题

    实例讲解Oracle数据库设置默认表空间问题   实例讲解Oracle数据库设置默认表空间问题,阅读实例讲解Oracle数据库设置默认表空间问题,DBA们经常会遇到一个这样令人头疼的问题:不知道谁在O ...

  8. 说说M451例程讲解之LED

    /**************************************************************************//** * @file main.c * @ve ...

  9. M451例程讲解之GPIO.H

    到了CORTEX-M4,几乎每一快都有很大的知识量,单单GPIO库文件这一项就有很长的章节要描述,加油吧 GPIO.h.是最基础的一个库文件,下面结合数据手册来一一进行讲解: 先把库文件粘上,方便一一 ...

  10. 一文为你详细讲解对象映射库【AutoMapper】所支持场景

    前言 在AutoMapper未出世前,对象与对象之间的映射,我们只能通过手动为每个属性一一赋值,时间长了不仅是我们而且老外也觉得映射代码很无聊啊.这个时候老外的所写的强大映射库AutoMapper横空 ...

随机推荐

  1. springboot+mybais配置多数据源(分包实现)

    一.分包方式实现: 1.在application.properties中配置两个数据库: #druid连接池 #dataSoureOne(这里是我本地的数据源) spring.datasource.o ...

  2. map函数中调用多个async await请求出现的promise问题解决

    以上这个打印会返回[promise,promise,promise]那么是什么原因造成的呢?我们先来一个方法解决: 但是以上这种解决方式并没有真正解决问题,还是会返回一个[promise,promis ...

  3. Vue基础(2)双向绑定

    双向数据绑定 通过修改标签,例:切换radio.checkbox......都会对绑定的数据有影响 通过事件触发方法,修改data中数据,反向作用于radio.checkbox...... 1.v-m ...

  4. 使用Echarts 动态更新散点图

    最近遇到一个作业,要求使用 Echarts 散点图,本来这个图是很容易的,官网上也有很多的教程.但是如果可以动态的更新 Echarts 散点图就更好了.我本身对 js 不感兴趣,经过不停的查找资料最终 ...

  5. uni-app 下载文件 预览 + 保存自定义目录

    作为使用uni-app的小白来说  尝试了好几种方法 终于得到了我想要的效果(如下) 1.点击下载按钮(文件 或者图片)  2.预览 :用户自定义选择查看的软件(图片在手机相册 文件用其他打开预览) ...

  6. Qframework UIKit

    用QFramework的UIKit 功能很容易实现UI模块的MVC功能,但MVC模式构造起来还是会有些繁琐, 两个相互直接的UIElement 之间的一些数据传输和调用都要用Msg通过UIPanel ...

  7. IDEA+SpringBoot整合Swagger2创建API文档

    ------------恢复内容开始------------ 1.创建SpringBoot项目 2.选择快捷方式创建springboot项目 3.工程文件树形图 4.pom.xml中导入Swagger ...

  8. Spring core rce 0day(CVE-2022-22965)视频教程附工具

    Spring 远程代码执行漏洞,先上图,视频晚点上传

  9. HCIP-ICT实战进阶04-ISIS原理与配置

    HCIP-ICT实战进阶04-ISIS原理与配置 0 前言 IS-IS(Intermediate System to Intermediate System, 中间系统到中间系统)协议, 和OSPF一 ...

  10. c# HttpServer 的使用

    在很多的时候,我们写的应用程序需要提供一个信息说明或者告示功能,希望借助于HttpServer来发布一个简单的网站功能,但是又不想架一个臃肿的Http服务器功能, 这时候,标准框架提供的HttpSer ...