PSoC™ 4 用户自定义OTA实现指导说明

Tip / ログイン to post questions, reply, level up, and achieve exciting badges. Know more

cross mob
Translation_Bot
Community Manager
Community Manager
Community Manager

问题:基于官方Bootlaoder的OTA升级需要遵循官方的通信协议,我们需要根据自己的通信协议实现客制化的OTA,我们需要怎么实现?有哪些需要注意事项?

解决方案:

无论是基于官方Bootlaoder的OTA还是基于客户自动通信协议的OTA,都需要实现以下的几个基本步骤:

1、内部Flash分区(Bootloader区、APP区与データ区)

2、内部Flash的擦写

3、APP应用程序文件分离提取

4、BOOT区程序转跳到APP区API实现

一、内部Flash分区(Bootloader区、APP区与データ区)

1、PSoC™ 4 的アドレスマップ如下:

DaveLong_0-1693452478711.png  

DaveLong_1-1693452504723.png

其中内部Flash的起始地址位于0x00-0x1FFF FFFF处,实际大小可根据对应芯片型号的数据手册获取。

所以我们需要根据OTA的架构划分内部Flash,下面是常用的分区方式:

DaveLong_0-1693461450628.png

OTA 不同区的需按照行为单位来划分,不同系列Flash对应的行大小不一样,具体可参考对应的数据手册。

注意:因为APP工程需要用到Bootloadable的主键来整合BOOT和APP的工程固件,对于单分区工程Flash的最后一行会用来存储Metadata,而对于双分区工程Flash最后两行会用来存储Metadata,用户需要确保应用程序区不要占用到Flash的Metadata区。

二、内部Flash的擦写

1、芯片内部只有一个UserFlash区,没有DataFlash区,Flash不存在扇区的概念,而是存在行的概念,Flash的擦除和编程都是按照行来操作,行的大小对于不同系列芯片会有差别,其中CY8C4100S Plus 系列行的大小为256字节。

 2、Flash的擦除和编程调用的是同一个函数接口,没有独立的擦除和编程接口。接口函数如下:

uint32 CySysFlashWriteRow(uint32 rowNum, const uint8 rowData[])

参数说明:

rowNum:行号,总行数=Flash大小/行大小

rowData[]:需要编程的内容,数组大小必须等于Flash行的大小

返回值:

/** 正常に完了しました。 */

#define CY_SYS_FLASH_SUCCESS (0x00u)

/** 指定されたフラッシュ行アドレスは無効です。 指定された行 ID またはバイト アドレスが、使用可能なメモリの範囲外です。 */

#define CY_SYS_FLASH_INVALID_ADDR (0x04u)

/** 指定されたフラッシュ行は保護されています。 */

#define CY_SYS_FLASH_PROTECTED (0x05u)

/** 再開が完了しました。 すべての非ブロッキング呼び出しが完了しました。 再開/中止関数は、次の非ブロッキングまで呼び出すことができません。 */

#define CY_SYS_FLASH_RESUME_COMPLETED (0x07u)

/** \brief 保留中の再開。 非ブロッキングが開始され、他の関数を呼び出す前に resume API を呼び出して完了する必要があります。 */

#define CY_SYS_FLASH_PENDING_RESUME (0x08u)

/** システム コールはまだ進行中です。 再開または非ブロックはまだ進行中です。 SPC ISR は、前に起動する必要があります

次の再開を試みます。 */

#define CY_SYS_FLASH_CALL_IN_PROGRESS (0x09u)

/** フラッシュ クロックが無効です。 CY_IP_SRSSLTを使用する製品は、書き込み/消去操作の前に、IMOを24MHzに設定し、HFクロックソースをIMOクロックに設定する必要があります。 */

#define CY_SYS_FLASH_INVALID_CLOCK (0x12u)

3、Flash擦除和编程一行需要时间为9.4ms左右,并且为阻塞模式,所有中断功能被屏蔽,需要评估是否会对应用功能产生影响(主要是显示),另外需要在行擦除和编程函数前后添加清狗操作,确保程序不会认为看门狗复位导致升级失败。

三、APP应用程序文件分离提取

BOOT和APP可以通过Bootloadable的主键整合成一个可烧录的hex文件,对应升级文件的提取可根据下面的操作提取:

1、拷贝需要生成BIN文件的HEX文件到对应的BIN文件夹里:

DaveLong_1-1693462870802.png

2、修改RUN.bat文件的内容:Hex源文件名、起始地址和长度,并运行RUN插件生成对应的BIN文件

DaveLong_2-1693462910953.png

四、BOOT区跳转到APP区的API

無効 (*flash_Jump)(無効);

ボイドflash_boot_jump(uint32_t addr)

{

uint32_tデスタアドル;

uint32_t *pt;

SCB->RESERVED0=addr;

< set User code interrupt vector tab address SCB->ユーザコード割り込みベクタタブアドレスSCB->VTORを設定する<

pt = ((uint32_t *)(addr));

destAdrr = *pt;

__set_MSP(デスタアドル);

pt = ((uint32_t *)(addr+4));

destAdrr = *pt;

flash_Jump = (void(*)(void))(destAdrr);

flash_Jump();

}

ボイドmg_JumpToApplication(ボイド)

{

uint32_t u32ジャンプアドレス;

u32ジャンプアドレス = USER_APP_RUN_ADDR;

flash_boot_jump(u32ジャンプアドレス);

}

注意:如果BOOT工程使用到中断,在跳转之前需要把所有中断关闭

0 件の賞賛
0 返答(返信)