luoshiping 发表于 2022-8-30 10:20

关于HC32F4A0 flash 引导交换

   个人应用背景,实现以太网升级固件,

   按照HC32F4A0 手册 把flash 分为 2块,

      首先 第一次运行在第一块0x0000_0000h 地址,程序里面的创建 TCP 更新FLASH块 1,然后启动引导交换,重新启动,按照规格书,重启 FLASH 块 0 和 FLASH块 1 地址全部交换(OTP 功能未启用)

   第二次升级固件同理 用FLASH块 1 内的程序创建 TCP 更新去升级 FLASH块 0 的程序,关闭引导交换

   后面循环判断启动标志,升级对应的FLASH 块,这样可以实现不需要另外的bootload 实现固件更新,方便,

问题:

手册里面没有说明2个问题,

1   引导交换后 ,flash控制寄存器操作是否需要交换?

2   在引导交换后,程序里面对flash读写的地址是否交换

比如 :引导交换后写 第一块flash地址 是0x0000_0000h 还是0x0010_0000h?

经过多次实验测试的结果:(不一定完全对,但是确实实现了以上的功能)

    (1)   引导交换后 ,flash控制寄存器操作是不需要交换的,

                      比如引导交换后 擦除FLASH 块 0与解除FLASH 块 0 写保护的地址要用
                        (void)EFM_SectorCmd_Single(EFM_SECTOR_0, Enable);
                        (void)EFM_SectorErase(EFM_ADDR_SECTOR0);

                           同样获取状态寄存器一样的要用FLASH 块 0的

      (2) 但是引导交换后 ,在程序中读写操作是要交换的,FLASH 块 0程序里面的操作地址需要用0x0010_0000h

                问题就在这里:如果在FLASH 块 1 中启动程序,更新FLASH 块 0的程序 ,

寄存器控制状态要使用FLASH 块 0的,实际读写操作地址是0x0010_0000h;导致官方提供的库EFM_SingleProgram 根本不能使用,


毛大人跟班 发表于 2022-8-30 15:03

联系我帮您解决 XV877378012

littlelida 发表于 2022-9-3 14:27

这是大神的节奏啊

foxsbig 发表于 2022-9-13 21:18

这是玩出花了

软核硬核 发表于 2022-9-14 16:38

没玩过引导交互,感觉是大佬!

两只袜子 发表于 2022-9-15 11:32

会玩,佩服大佬

Bowclad 发表于 2022-9-16 19:00

玩出花了
页: [1]
查看完整版本: 关于HC32F4A0 flash 引导交换