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 版本
Config Tool Version:2.7.6
MD14 SDK version:1.3.14.2 程序要求
- 实现当代码运行在PFLASH0里亮绿灯,运行在PFLASH1里亮红灯
- 串口打印程序运行所在位置(PFLASH0或PFLASH1)
- 每次切换程序前向FEE写入一次数据并反读
- 保持FEE数据同步
4.3. 代码讲解
4.3.1 读取swap的标志位
读取swap标志位,从而判断代码运行在哪个PFLASH里

4.3.2 读写fee模块
读取REGFILE->DR[0]的值,写入到fee并反读(REGFILE 位于始终处于供电状态的电源域中,可在掉电模式下保留某些关键信息的值。)

验证写入和读取是否相同,如果不同则进入死循环

4.3.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. 代码
-
Y YQH 在 中 引用了 这个主题
-
X xianghan 在 中 引用了 这个主题
-
WR 现在要设计MD1的模拟EE,但是需求上不做刷新的AB分区,就不用AB SWAP交换了吧?
-
是的,不做刷新的AB分区不需要AB SWAP。
-
-
z123456111 在 MD14_AB_SWAP+FEE 中说:
limanjiang 在 MD14_AB_SWAP+FEE 中说:
是的,不做刷新的AB分区不需要AB SWAP。
请教一下,我这边移植FEE后,在进行初始化,就报其他的文件错误。

这个感觉像是和优化等级有关,我把代码屏蔽过后,优化等级改为默认,也会报这个错误。


-
你这个提示是链接文件错误,可以检查下链接文件的地址分配,看是不是地址冲突了
-
limanjiang 在 MD14_AB_SWAP+FEE 中说:
你这个提示是链接文件错误,可以检查下链接文件的地址分配,看是不是地址冲突了
是的,地址冲突了,然后我把0x7CC0的地址改成了0x8000就可以了,请问这样修改是否导致程序异常

-
这里看不到你完整的地址分配,看起来像是把FLASH 分成了4段,第一段是中断向量表占用了0x340,后面的3段共同占用了0x7CC0,从逻辑上看你改的地方不是那么的合适,因为3段地址加起来也不应该大于0x7CC0,你可以在YT_LINK或者链接文件中检查下这些段的长度定义,看是不是其他地方的问题。可以留意下0x340和0 这些地方是不是混用了导致计算错误了。
-
limanjiang 在 MD14_AB_SWAP+FEE 中说:
这里看不到你完整的地址分配,看起来像是把FLASH 分成了4段,第一段是中断向量表占用了0x340,后面的3段共同占用了0x7CC0,从逻辑上看你改的地方不是那么的合适,因为3段地址加起来也不应该大于0x7CC0,你可以在YT_LINK或者链接文件中检查下这些段的长度定义,看是不是其他地方的问题。可以留意下0x340和0 这些地方是不是混用了导致计算错误了。
我这里研究了一下,7CC0差不多31K,目前BOOT程序加上移植的FEE代码已经超出定义的7CC0范围了。

快速上手云途开发生态
发帖前请查看
帮助改进和优化YT CONFIG TOOL,有机会抽取YTM32B1ME0 EVB哦...