EVT例程中提供了兩種OTA方式,在EVT的BLE目錄最下面有一個OTA的PDF說明:WCH藍牙空中升級(BLE OTA)
本文主要講的是方式二不帶庫升級,整個codeflash分成四個區域,Jump IAP,APP,IAP,LIB,一共需要燒錄四個hex才可運行。
Jump IAP為4K,作用是用來跳入到IAP中,此工程main中并無函數,會直接跳轉到IAP,IAP的起始地址修改后,此工程啟動文件中的地址也需對應修改為IAP的起始地址,
APP為44K,設置這個大小的原因是為了使一些192Kflash的芯片也能直接使用OTA,此APP部分是可以不帶有藍牙功能的,因為是跳轉到IAP進行藍牙升級的,
IAP為16K,它的作用就是將手機app發送的升級固件直接寫到APP區域,
LIB為573的是128K,CH585/592/582的是192K。
使用此方式OTA需要先用BLE調試助手等藍牙工具先連接通過CHAR3發送一個字節數據,跳轉到IAP中,名字更新為OTA_OTA_OTAOTA才可以使用OTA軟件連接升級。
那么就有一個問題,對于448Kflash的芯片,APP的44K空間不夠用了該如何擴大APP區域呢?
先講下整體思路,因為要擴大APP,IAP和LIB就都要往后移動,APP和IAP的LD文件需重新分配起始地址和大小,Jump IAP需要跳轉到IAP移動后的起始地址,以為使用固定庫所以APP和IAP需要添加全局宏,因為庫的后移,APP和IAP的啟動文件和全局宏的地址需從默認的0x10000修改后LIB新的起始地址為0x40000,APP需增加跳轉IAP的jump代碼和用于app判斷有限性的定義,最終要使用romx.h這個靠后放置的庫。
一.修改Jump IAP工程:
1.修改啟動文件跳轉地址
Jump IAP的修改十分簡單,因為它的功能就只是跳轉到IAP,APP要擴大,向后移動后起始地址產生了變化,只要如下圖修改跳轉地址即可:
CH585/592/582的IAP起始地址為4+236=240k,填入0x0003C000 CH573的IAP起始地址為4+300=304k,填入0x0004C000,下方截圖修改的CH585/592/582,注意573有所不同,

二.修改APP工程:
APP需要修改五個地方,一是工程預處理,二是Link.ld,三是啟動文件startup_CH583.S,四是自己寫的APP還需額外添加Jump_OTA代碼,五是自己寫的APP添加標志供OTA工具識別。
1.工程預處理:
CH585/582添加CH58xBLE_ROM=1,CH592添加CH59xBLE_ROM=1,CH573添加CH57xBLE_ROM=1,如果使用的OnlyUpdateApp_Peripheral例程,那么就無需再添加,因為例程已經添加了,截圖修改的CH585/582,注意592和573有所不同,
CH585/592/582添加LIB_FLASH_BASE_ADDRESSS=0x00040000
CH573添加LIB_FLASH_BASE_ADDRESSS=0x00050000,

2.Link.ld修改:
如果是OnlyUpdateApp_Peripheral例程,那么就只需要修改一處,將原本給的44k按4k為單位擴大,建議直接給到最大,CH585/592/582為236k,573為300k,截圖修改的CH585/592/582,注意573有所不同,
如果是自己的任意APP代碼,那么將OTA例程的APP的Link.ld文件復制粘貼過來修改上面那一處即可,注意是復制粘貼后再修改而不是直接修改!

3.startup_CH583.S修改:
如果是OnlyUpdateApp_Peripheral例程,那么也只需要修改一處,
CH585/592/582將j 0x10000修改為j 0x40000,
573將將j 0x10000修改為j 0x50000,截圖修改的CH585/592/582,注意573有所不同,
如果是自己的任意APP代碼,那么將OTA例程的APP的startup_CH583.S文件復制粘貼過來修改上面那一處即可。

4.添加添加Jump_OTA代碼(使用OnlyUpdateApp_Peripheral例程可跳過)
可以按照自己的邏輯調用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();
}
5.添加用于app判斷文件有效性標志(使用OnlyUpdateApp_Peripheral例程可跳過)
在peripheral_main.c中添加下圖內容,否則升級時,app會認為你放入的hex是非法的導致無法正常升級。如果使用OnlyUpdateApp_Peripheral例程,就無需添加,例程中已有這部分內容。

三.IAP程序修改
IAP需要修改四處,一是工程預處理,二是Link.ld,三是啟動文件startup_CH583.S,最后一個是ota.h文件,
1.工程預處理:
CH585/592/582添加LIB_FLASH_BASE_ADDRESSS=0x00040000
573添加LIB_FLASH_BASE_ADDRESSS=0x00050000,截圖修改的CH585/592/582,注意573有所不同,

2.IAP程序Link.ld文件修改起始地址
CH585/592/582起始地址為4+236=240k,填入0x0003C000
573起始地址為4+300=304k,填入0x0004C000,截圖修改的582,注意573有所不同,
例程默認FLASH (rx) : ORIGIN = 0x0000C000, LENGTH = 16K,修改為FLASH (rx) : ORIGIN = 0x0003C000, LENGTH = 16K
0x0003C000 !!!(前面多了一個3)

3.IAP程序ota.h文件修改
將APP大小修改為重新配置后的大小,截圖修改的CH585/592/582,注意573有所不同,應修改為300 * 1024

4.IAP程序startup_CH583.S文件修改
CH585/592/582將將j 0x10000修改為j 0x40000,573將將j 0x10000修改為j 0x50000,截圖修改的CH585/592/582,注意573有所不同,

四.合并hex
LIB則是合并的時候選擇帶x后綴的hex文件,這個LIB是靠著flash最后的位置放的,可以讓APP增大至最大。

將四個HEX合成一個之后使用isp工具燒錄或者用最新的isp工具直接選擇4個hex燒錄。
浙公網安備 33010602011771號