个人应用背景,实现以太网升级固件,
按照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 根本不能使用,
|