例程中提供的两种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. mybatis查询返回多条数据

    返回User类型的list <select id="queryAllUser" resultType="org.example.entity.User"& ...

  2. Pycharm实现sqlite数据库可视化

  3. js中的对象方法中this指向问题

    对象方法调用this所在函数fn的是b,所以this指向b,b.a1='hello a3' ,b没有a2属性,b.a2=undefinedvar a1='hello a1'var a2='hello ...

  4. 【剑指Offer】【链表】反转链表

    题目:输入一个链表,反转链表后,输出新链表的表头. A:定义3个结点,pNode作移动指针,pRet作输出指针,pPrev作前驱指针    在pNode没有到达链尾之前,循环里创建pNext指针记录p ...

  5. React脚手架的使用

    初始化项目 npx create-react-app my-app // 或 npm init react-app my-app // 或 yarn create react-app my-app 启 ...

  6. 时间序列 data_range()

    pd.date_range( start=None,#开始时间 end=None,#截止时间 periods=None,#总长度 freq=None,#时间间隔 tz=None,#时区 normali ...

  7. Java基础——for循环、while循环

    package com.zhao.demo; public class Demo04 { //for循环 /*public static void main(String[] args) { for ...

  8. go 死锁示例

    以下代码不会有任何打印.原因是:channel ch 在make 时是无缓冲区的channel.无缓冲区的channel 发送一个数据进入后需要等待这个数据被消耗才能继续发送下一个数据.然而getFr ...

  9. python3.7 sorted 自定义排序

    from functools import cmp_to_keyls=['9','23','3','56','78']sorted(ls, key=cmp_to_key(lambda x, y: in ...

  10. CCF 202012-2 期末预测之最佳阈值

    #include <iostream> #include <bits/stdc++.h> #include <string> using namespace std ...