CH573 CH582 OTA例程讲解(使用固定库+扩大APP空间)
例程中提供的两种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空间)的更多相关文章
- CH58X/CH57X/V208的Broadcaster(广播者)例程讲解
在对ble进行应用的时候,每个用户的需求可能不尽相同.这里着重介绍从机Broadcaster例程,只广播不连接. 使用该例程时可以在手机使用APP上对Broadcaster进行调试. 安卓端在应用市场 ...
- 第三百三十六节,web爬虫讲解2—urllib库中使用xpath表达式—BeautifulSoup基础
第三百三十六节,web爬虫讲解2—urllib库中使用xpath表达式—BeautifulSoup基础 在urllib中,我们一样可以使用xpath表达式进行信息提取,此时,你需要首先安装lxml模块 ...
- 第三百三十节,web爬虫讲解2—urllib库爬虫—实战爬取搜狗微信公众号—抓包软件安装Fiddler4讲解
第三百三十节,web爬虫讲解2—urllib库爬虫—实战爬取搜狗微信公众号—抓包软件安装Fiddler4讲解 封装模块 #!/usr/bin/env python # -*- coding: utf- ...
- 第三百二十九节,web爬虫讲解2—urllib库爬虫—ip代理—用户代理和ip代理结合应用
第三百二十九节,web爬虫讲解2—urllib库爬虫—ip代理 使用IP代理 ProxyHandler()格式化IP,第一个参数,请求目标可能是http或者https,对应设置build_opener ...
- 第三百二十八节,web爬虫讲解2—urllib库爬虫—状态吗—异常处理—浏览器伪装技术、设置用户代理
第三百二十八节,web爬虫讲解2—urllib库爬虫—状态吗—异常处理—浏览器伪装技术.设置用户代理 如果爬虫没有异常处理,那么爬行中一旦出现错误,程序将崩溃停止工作,有异常处理即使出现错误也能继续执 ...
- 第三百二十七节,web爬虫讲解2—urllib库爬虫—基础使用—超时设置—自动模拟http请求
第三百二十七节,web爬虫讲解2—urllib库爬虫 利用python系统自带的urllib库写简单爬虫 urlopen()获取一个URL的html源码read()读出html源码内容decode(& ...
- 实例讲解Oracle数据库设置默认表空间问题
实例讲解Oracle数据库设置默认表空间问题 实例讲解Oracle数据库设置默认表空间问题,阅读实例讲解Oracle数据库设置默认表空间问题,DBA们经常会遇到一个这样令人头疼的问题:不知道谁在O ...
- 说说M451例程讲解之LED
/**************************************************************************//** * @file main.c * @ve ...
- M451例程讲解之GPIO.H
到了CORTEX-M4,几乎每一快都有很大的知识量,单单GPIO库文件这一项就有很长的章节要描述,加油吧 GPIO.h.是最基础的一个库文件,下面结合数据手册来一一进行讲解: 先把库文件粘上,方便一一 ...
- 一文为你详细讲解对象映射库【AutoMapper】所支持场景
前言 在AutoMapper未出世前,对象与对象之间的映射,我们只能通过手动为每个属性一一赋值,时间长了不仅是我们而且老外也觉得映射代码很无聊啊.这个时候老外的所写的强大映射库AutoMapper横空 ...
随机推荐
- springboot+mybais配置多数据源(分包实现)
一.分包方式实现: 1.在application.properties中配置两个数据库: #druid连接池 #dataSoureOne(这里是我本地的数据源) spring.datasource.o ...
- map函数中调用多个async await请求出现的promise问题解决
以上这个打印会返回[promise,promise,promise]那么是什么原因造成的呢?我们先来一个方法解决: 但是以上这种解决方式并没有真正解决问题,还是会返回一个[promise,promis ...
- Vue基础(2)双向绑定
双向数据绑定 通过修改标签,例:切换radio.checkbox......都会对绑定的数据有影响 通过事件触发方法,修改data中数据,反向作用于radio.checkbox...... 1.v-m ...
- 使用Echarts 动态更新散点图
最近遇到一个作业,要求使用 Echarts 散点图,本来这个图是很容易的,官网上也有很多的教程.但是如果可以动态的更新 Echarts 散点图就更好了.我本身对 js 不感兴趣,经过不停的查找资料最终 ...
- uni-app 下载文件 预览 + 保存自定义目录
作为使用uni-app的小白来说 尝试了好几种方法 终于得到了我想要的效果(如下) 1.点击下载按钮(文件 或者图片) 2.预览 :用户自定义选择查看的软件(图片在手机相册 文件用其他打开预览) ...
- Qframework UIKit
用QFramework的UIKit 功能很容易实现UI模块的MVC功能,但MVC模式构造起来还是会有些繁琐, 两个相互直接的UIElement 之间的一些数据传输和调用都要用Msg通过UIPanel ...
- IDEA+SpringBoot整合Swagger2创建API文档
------------恢复内容开始------------ 1.创建SpringBoot项目 2.选择快捷方式创建springboot项目 3.工程文件树形图 4.pom.xml中导入Swagger ...
- Spring core rce 0day(CVE-2022-22965)视频教程附工具
Spring 远程代码执行漏洞,先上图,视频晚点上传
- HCIP-ICT实战进阶04-ISIS原理与配置
HCIP-ICT实战进阶04-ISIS原理与配置 0 前言 IS-IS(Intermediate System to Intermediate System, 中间系统到中间系统)协议, 和OSPF一 ...
- c# HttpServer 的使用
在很多的时候,我们写的应用程序需要提供一个信息说明或者告示功能,希望借助于HttpServer来发布一个简单的网站功能,但是又不想架一个臃肿的Http服务器功能, 这时候,标准框架提供的HttpSer ...