-
版本:
Config Tool Version:2.7.6
MC03 SDK version:1.3.1前言:
有硬件ABswap后FEE历史数据保持的需求。由于YTM32B1MC系列MCU⽆内置EEPROM,故对需要使⽤EERPOM的应⽤场景可通过DFlash及软件模拟实现EEPROM功能。
本⽂简述云途YTM32B1MCx系列的硬件ABSwap原理和FEE历史数据保持实现过程和使用方法。1. BOOT_INFO寄存器
不同型号的芯片描述不一样,MC03描述如下:
ME05描述如下:
简单来说,BOOT_INFO寄存器可以用来判断程序是从PFLASH0还是PFLASH1启动。2. MC03_AB_Swap-地址重映射
如下图为MC的AB_Swap地址重映射流程说明。
当STS[BOOT_INFO]=O时执行BOOT_SWAP命令,然后复位EFM,STS[BOOT_INFO]将置为1,地址将重新映射:
1.P_Flash0的Soc地址重映射到P_Flash1时,D_Flash0的Soc地址重映射到D_Flash1。
2.P_Flash1的Soc地址重映射到P_Flash0时,D_Flash1的Soc地址重映射到D_Flash0。
当 STS[BOOT_INFO]=1时执行BOOT_SWAP 命令,然后复位EFM将切换回地址映射并清除STS[BOOT_INFO]标志。
3. FEE数据搬运
如下图为各个FLASH区域之间支持边读边写的关系。
1.异步访问:因为P_Flash0,D_Flash0在同一个FLASH块,P_Flash1,D_Flash1在同一个FLASH块。所以P_Flash0对D_Flash1支持边读边写,P_Flash1对D_Flash0支持边读边写,即异步访问。
2.当程序从P_Flash0启动时,建议将FEE数据存储在D_Flash1,这样在读写D_Flash1时CPU无需等待,实现异步操作。反之亦然。
如下图为MC的AB_Swap流程图。
当程序从A区(P_Flash0)切换到B区(P_Flash1)时,如果想用相同的FEE配置去读写FEE,就需要在AB_Swap之前将D_Flash1的内容copy到D_Flash0。因为D_Flash的地址也会重映射。
4. 示例程序
- 基于MC03 Demo板,启用Ptmr(用于定时AB_Swap),FLASH,FEE,UART(便于调试)。
- A,B区程序仅LED灯点亮部分代码不同,其他配置一样,A区亮蓝灯,B区亮绿灯。
- 程序每1秒(Ptmr定时)进行一次AB_Swap,A,B区灯交替点亮。
- A,B区程序都会对FEE进行写读操作,并进行读写校验。
1.FEE配置
配置了3个BLOCK,每个BLOCK128字节.
FEE_Task:
写入的FEE信息和数据:
2.读写校验和D_Flash copy后的数据检验
将写入FEE和读取的数据进行检验,如果不相等程序会卡死。
将D_Flash copy后的数据检验,不通过则设置标志位verify_nok_flag,不执行AB_Swap。
3.AB_Swap逻辑
ptmr定时每1秒触发一次FEE_Task,D_Flash copy检验则执行AB_Swap。
5. 实测验证(操作步骤)
- 擦除芯片
- 下载A区bin程序到地址0
- 下载B区bin程序到地址0x20000(A,B程序仅LED灯点亮配置不一样)
4.复位运行程序,一秒进行一次AB_Swap,同时开发板LED灯交替点亮
6.压力测试
- 定义一个AB区共享的变量,用于记录连续AC_Swap次数。
- 因为MC03没有REGFILE寄存器(掉电保持),要实现AB区的变量共享除了retention_ram以外可以参考下面这个方法。
- 定义一个不会重复初始化的变量ABSwapCount,用于记录AB_Swap的次数,并将这个变量作为参考值写入FEE的3个BLOCK。
- 测试ABSwap 10000次保证程序正常运行。
- 配置
在RAM段分一个POR_ONLY区,定义POR_ONLY(上电才会初始化)(AB区程序相同配置)
同时将其上电初始化的值由0x5A改为0:
清除上电复位标志位,这样软件复位就不会初始化POR_ONLY段
定义AB_Swap计数变量,记录Swap的次数,并在AB_Swap之前++
在FEE_Task中将ABSwapCount作为参考值写入FEE的3个BLOCK,读取后打印ABSwapCount。
- 测试
测试步骤参考上面的方法,重启复位,程序每1秒进行一次AB_Swap,LED交替点亮,串口打印:
7.工程:
-
Y yt0069 从 Others 移动了该主题
-
Y YQH 被引用 于这个主题
发帖前请查看
帮助没办法联网的电脑使用YCT
帮助改进和优化YT CONFIG TOOL,有机会抽取YTM32B1ME0 EVB哦...