[技术问答] 关于HC32F4A0 flash 引导交换

[复制链接]
2027|6
 楼主| luoshiping 发表于 2022-8-30 10:20 | 显示全部楼层 |阅读模式
   个人应用背景,实现以太网升级固件,

     按照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 | 显示全部楼层
联系我帮您解决 XV  877378012
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 | 显示全部楼层
玩出花了
您需要登录后才可以回帖 登录 | 注册

本版积分规则

2

主题

2

帖子

1

粉丝
快速回复 在线客服 返回列表 返回顶部