MD14_AB_SWAP+FEE
-
1. 引言
基于MD这类没有独立Dflash的MCU,且同时具有硬件AB swap需求和FEE历史数据保持的需求,优先建议客户选择外挂的eeprom,硬件方案实在无法外挂eeprom再参考该文档实现,本文档是基于MD14开发板设计的。
2.FLASH分区划分
FLASH的分区主要分为两种:一种是将程序和fee各自存放在一个BANK上,另一种是将程序和fee存放在同一个BANK上。由于在同一个bank下flash在写一个区域的同时不能读取另外一个区域的特性,所以如果将程序与fee存放在同一个bank下,当对fee进行操作时就不能运行其他的进程,所以默认情况下是将程序与fee存放在不同的bank,这样就引出了fee的“数据同步”和“异步操步”。3. 核心要点
3.1 FEE异步操作
在不同的物理 BLOCK 上的 FLASH 程序和数据可支持异步操作不产生阻塞;在相同的物理 BLOCK 上的 FLASH 程序和数据只支持同步操作会产生阻塞。所以我们一般将fee地址设置在另一个block上,勾选"Async Access"代表使能异步操作
3.2 AB SWAP原理
在执行AB swap操作前PFLASH0的地址是0x00000 ~ 0x3FFFF,PFLASH1的地址是0x40000 ~ 0x7FFFF。在执行AB swap操作后,PFLASH0和PFLASH1的地址会进行交换,此时PFLASH0的地址是0x40000 ~ 0x7FFFF,PFLASH1的地址是0x00000 ~ 0x40000。但与此同时原先定义在另一个bank里的fee区域,由于执行了boot_swap命令,定义的fee地址发生了改变,这是就引出了fee的“数据同步”
3.3 fee数据同步的原理及操作方式
在实际的应用中,我们存储在fee区域的数据是要经常调用使用的,如果不进行数据同步,在执行完swap命令后,我们再去调用fee数据就会导致读出的数据为空,所以数据同步是在执行boot swap命令前要将fee数据搬运到新的fee地址上去。
3.4 AB SWAP操作方式
通过内部闪存命令(0x30)执行swap操作。该命令由FLASH_DRV_BootSwap函数来调用。
3.5 MCU当前运行位置
boot_swap是在pFlash0 和 pFlash1 之间进行翻转,通过查看EFM->STS的寄存器判断现在运行在哪个pFlash上
4. 代码讲解
4.1 读取swap的标志位
读取swap标志位,从而判断代码运行在哪个PFLASH里
4.2 读写fee模块
读取REGFILE->DR[0]的值,写入到fee并反读(REGFILE 位于始终处于供电状态的电源域中,可在掉电模式下保留某些关键信息的值。)
验证写入和读取是否相同,如果不同则进入死循环
4.3 boot_swap的过程操作
在进行swap操作前将fee数据搬移到新的fee地址里去
5. 测试验证
5.1 将工程程序编译的文件加载到JFLASH
5.2 擦除芯片,烧录程序(快捷键盘F4,F6),完成PFLASH0面烧录
5.3 偏移地址映射PFLASH1面烧录
5.3.1 PFLASH1地址偏移0x0040000
5.3.2 设置地址偏移
5.3.3 烧录PFLASH1
5.3.4 重新上电运行程序
- PFLAH0里的程序会使绿灯亮红灯灭,PFLASH1里的程序会使绿灯灭红灯亮
- 程序会在红灯和绿灯之间来回切换(绿灯代表运行在PFLASH0里,红灯代表运行在PFLASH1里)
- 红灯和绿灯切换的频率800ms切换一次
- 串口会在打印程序运行在哪个位置
串口打印的数据
4.4 压测10000次数据
5. 代码
发帖前请查看
帮助没办法联网的电脑使用YCT
帮助改进和优化YT CONFIG TOOL,有机会抽取YTM32B1ME0 EVB哦...