Tip / Sign in to post questions, reply, level up, and achieve exciting badges. Know more

cross mob
DaveLong
Employee
Employee
First like given First question asked 5 sign-ins
问题:
        针对PSoC™ 6 单核工程的OTA,如果需要实现自定义的OTA,而不是基于Demo code 的方式实现,我们需要注意的细节有哪些?有没有参考的知道说明?
解决办法:
      针对自定义OTA的,客户主要需要实现以下几个方面的功能:
1:内部Flash分区(Bootloader与APP Flash的分配)
2:程序转跳
3:Flash的读写
4:程序整合提取分离
具体实现如下:
一、内部Flash划分
1、Memory Map

Both CPUs have a fixed address map, with shared access to memory and peripherals. The 32-bit (4 GB) address space is divided into the regions shown in Picture 1. Note that code can be executed from the code and SRAM regions.

DaveLong_0-1692805440459.png
DaveLong_1-1692805452400.png

2、P6 内部Flash区域划分

DaveLong_2-1692805576116.pngDaveLong_3-1692805602577.png3、Main Flash区域划分

OTA 不同区的需按照行为单位来划分,大小为行大小的整数倍,每行大小为512Bytes.

DaveLong_4-1692805674798.png

4、Linker script的修改

  • BootLoader Linker script文件修改

           对于bootloader工程需要根据工程内存分配去修改,以dfu_cm4_app0.ld为蓝本, 修改步骤如下:

        1)修改Makefile文件,选择自定义的Linker script文件

DaveLong_5-1692805791334.png

2)根据Main Flash区域划分,修改下图中对应的区域设置

DaveLong_6-1692805862480.png

 

  • APP Linker script文件修改

       对于bootloader工程需要根据工程内存分配去修改,以dfu_cm4_app1.ld为蓝本, 修改步骤如下:

    (1)修改Makefile文件,选择自定义的Linker script文件

DaveLong_7-1692806020931.png

 

  (2)、根据Main Flash区域划分,修改下图中对应的区域设置

DaveLong_8-1692806063875.png

 

二、BOOT区跳转到APP区的API

void (*flash_Jump)(void);

/*******************************************************************************

* Function Name: SwitchToApp

****************************************************************************//**

*

* Set main stack pointer and then jumps into the address.

*

* \param address      Address to jump into

*

* \note This function does not return.

*

*******************************************************************************/

void BootToApp(uint32_t address)

{

    uint32_t destAdrr;

   uint32_t *pt;

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

    destAdrr = *pt;

    __set_MSP(destAdrr);

 

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

    destAdrr = *pt;

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

    flash_Jump();   

   /* This function does not return */

    for(;;)

    {

    }

}

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

 三、Main flash的擦写

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

        Flash的擦写按照行来操作,每次擦除一行并且编程一行,行的大小为:512Bytes,在一个函数里实现,函数接口如下:

    cy_en_flashdrv_status_t Cy_Flash_WriteRow(uint32_t rowAddr, const uint32_t* data)

参数说明:

rowAddrAddress of the flash row number,注意:大小为行大小的整数倍

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

返回值:

DaveLong_9-1692806285209.png

 

四、程序整合提取分离

  • ISP 烧录hex文件整合

       可以通过下面方法把BootloaderAPPhex文件合并成为一个hex文件:

DaveLong_10-1692806462391.png     1、Bootloader APPelf 文件拷贝Elf_mergeTohex
DaveLong_11-1692806548110.png      2、根据ELF文件名修改MergeHex.bat对应的位置:
  • DaveLong_12-1692806601288.pngBIN文件的生成

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

DaveLong_13-1692806816416.png

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

DaveLong_14-1692806865637.png

 

0 Likes
1 Solution
Vison_Zhang
Moderator
Moderator
Moderator
750 replies posted 250 sign-ins 250 solutions authored

Hi  Dave,   好贴!感谢分享。如果能提供一个模板例程,对参考此贴的技术人员会是一个很大的帮助。

View solution in original post

0 Likes
1 Reply
Vison_Zhang
Moderator
Moderator
Moderator
750 replies posted 250 sign-ins 250 solutions authored

Hi  Dave,   好贴!感谢分享。如果能提供一个模板例程,对参考此贴的技术人员会是一个很大的帮助。

0 Likes