1. 关于 FlexNVM 和 FlashX 的一些基本问题和解答。
1.1 什么是 FlexNVM?
FlexNVM 是额外的独立闪存块,可用作数据闪存、模拟 EEPROM 的非易失性存储器或两者的组合。我将重点介绍本文档中的第一个选项——FlexNVM 将简单地用作数据闪存。
您可以在部件编号的专用位置包含“X”的 MCU 部件中找到 FlexNVM。例如:
MK64F X 512VMD12 包含 1 个程序闪存块 (512 KB) 和 1 个 FlexNVM 块 (128 KB)
MK64F N 1M0VMD12 仅包含 2 个程序闪存块(每个 512 KB)。
有关 FlexNVM 和闪存块的更多详细信息,请参阅您的 MCU 参考手册。例如“闪存大小”章节。
1.2 什么是FlashX?
MQX FlashX 驱动程序提供写入和读取内部闪存的能力。不幸的是,FlexNVM 内存在默认状态下仅部分受支持——一些 BSP 已经实现了模拟 EEPROM(flexnvm 示例代码)的配置和功能。有关更多详细信息,请查看c:\Freescale\Freescale_MQX_4_2\doc\mqx文件夹中的MQX_IO_User_Guide.pdf 。
1.3 我可以将不带 FlexNVM 的 MCU BSP 用于我自己的带有带 FlexNVM 的 MCU 的主板吗?
不建议这么做。但是,您可以使用此 BSP 作为您自己的板 BSP 的基础。请检查MQX_BSP_Cloning_Wizard_Getting_Started.pdf ,MQX_BSP_Porting_Guide.pdf和MQX_BSP_Porting_Example_User_Guide.pdf文档位于C:\Freescale\Freescale_MQX_4_2\doc文件夹中。
1.4 我可以在我的 KSDK 项目中使用 FlashX 吗?
不幸的是,FlashX 驱动程序没有在 KSDK 中实现。KSDK 包含其自己的用于 C90TFS/FTFx Flash 系列的标准软件驱动程序 (SSD),然而,这只是低级驱动程序,没有像 FlashX 驱动程序那样的高级抽象层。
2. 更新 MQX FlashX 驱动程序以支持 FlexNVM 的过程。
2.1 请备份以下文件: user_config.h 、
2.2 在user_config.h中启用 FlashX文件定义:
#定义 BSPCFG_ENABLE_FLASHX 1
2.3
2.3.1 请检查 MCU 参考手册并根据需要更新 BSP_INTERNAL_FLASH_BASE、BSP_INTERNAL_FLASH_SIZE、BSP_INTERNAL_FLASH_SECTOR_SIZE。通常,当使用不带 FlexNVM 的 BSP 作为自己的 BSP 的基础时,我们必须减少 BSP_INTERNAL_FLASH_SIZE。
2.3.2添加将在内存映射中定义 FlexNVM 的新宏。例如:
#定义 BSP_INTERNAL_FLEXNVM_BASE 0x10000000
#定义 BSP_FLEXNVM_SECTOR_SIZE 0x400
#定义 BSP_INTERNAL_FLEXNVM_SIZE 0x00008000
2.4 更新 BSP 文件夹中的init_flashx.c :
2.4.1 将 FlexNVM 文件块添加到 _bsp_flashx_file_blocks[] 表中。例如:
// 数据闪存文件块
{ “dflash”,BSP_INTERNAL_FLEXNVM_BASE,(uint32_t)(BSP_INTERNAL_FLEXNVM_BASE + BSP_INTERNAL_FLEXNVM_SIZE - 1)},
参数为{文件块名称,起始地址,结束地址}。
注意:这是纯软件接口;地址范围不需要适合物理闪存块参数。您可以根据需要组织文件块。
2.4.2如果您使用非 FlexNVM BSP 作为您自己的 BSP 的基础,则必须更改 KinetisX 设备的硬件块图。请在_bsp_flashx_init 结构中将_flashx_kinetisN_block_map 更改为_flashx_kinetisX_block_map。
2.5 更新flash_ftfl.c或flash_ftfe.c文件:
2.5.1 查看 MCU 参考手册,了解您的 MCU 是否具有 FTFL 或 FTFE 闪存模块,并选择适当的文件进行编辑。
2.5.2将 FlexNVM 内存块添加到 _flashx_kinetisX_block_map[] 表中。例如:
{ BSP_INTERNAL_FLEXNVM_SIZE / BSP_FLEXNVM_SECTOR_SIZE,(_mem_size)BSP_INTERNAL_FLEXNVM_BASE,BSP_FLEXNVM_SECTOR_SIZE }, // FlexNVM 块
参数为{扇区数,起始地址,扇区大小}。
注意:这是物理硬件内存块的描述;地址范围必须适合物理闪存块参数。
2.5.3现在我们必须修复 FlexNVM 地址的问题。程序闪存和 FlexNVM 闪存均通过 FTFL_FCCOBn / FTFE_FCCOBn 寄存器进行编程,其中 FCCOB1.. FCCOB3 包含 24 位格式的地址。因此,我们不能直接使用 FlexNVM 地址——由于 FlexNVM 基数为 0x10000000,它们不适合 24 位。
FTFL/FTFE 模块指定 24 位地址中的最高有效位(位 23)将用于区分程序闪存和 FlexNVM 闪存。例如,我们可以使用这样的代码:
//设置第23位,当FlexNVM闪存地址
如果(write_addr&BSP_INTERNAL_FLEXNVM_BASE)
{
写入地址 = 写入地址 | (1 << 23);
}
并在写入 command_array[] 之前将此代码添加到必要的函数中( command_array[]的内容将用于填充 FTFL_FCCOBn / FTFE_FCCOBn 寄存器)。
为了 FlashX 示例代码的基本工作,至少需要更新 ftfl_flash_erase_sector()/ftfe_flash_erase_sector() 和 ftfl_flash_write_sector()/ftfe_flash_write_sector() 函数。
2.6.完成这些更改后,您可以尝试使用flash_demo.c中的 FlashX 示例代码您只需打开 FlexNVM 文件块而不是默认程序闪存文件块。例如:
//#define FLASH_NAME“flashx:bank0”
#define FLASH_NAME“flashx:dflash”
在附件文件中,您可以找到 MQX4.2.0 和 MK20DX72 MCU 的修改示例。
3. 如何重写 Flash - 一般说明:
Flash数据在编程之前必须处于已擦除状态。 不允许对位进行累计编程(添加更多0)。
对于 FTFL 和 FTFE 模块,我们通过对齐的短语(通常为 64 位)对闪存进行编程。如果我们想要按更小的块(例如按字节)进行编程,FTFL 模块将允许您写入此短语,即使不推荐这样做。但FTFE模块如果第二次写入同一个相位,将会引起总线故障。因此,更改已写入的 FTFE 短语中的数据的唯一安全方法是擦除整个扇区并重写数据。因此,请对 FTFE 模块使用 ioctl 命令 FLASH_IOCTL_ENABLE_SECTOR_CACHE。当目标区域(与短语对齐)为空白时,在完整扇区写入和部分扇区覆盖的情况下不需要扇区缓存分配。
你好,Shridhar,
对于 FlexNVM:
您还必须编辑 flash_ftfl.c 中的 _flashx_kinetisX_block_map[] 表文件并添加 FlexNVM 块的描述。
对于 FlexRAM:
您在断电之前是否使用过刷新/关闭功能?
如何使用 FlexRAM 的示例可以在这里找到 c:\Freescale\Freescale_MQX_4_2\mqx\examples\flexnvm
在我们启用 EEPROM 仿真之前,目标 FlexRAM 内存范围的工作方式与“标准”RAM 相同。
当然,您必须选择是否将 FlexNVM 内存用作数据闪存、模拟 EEPROM,或者您可以将 FlexNVM 内存分成两部分并使用两个选项(在这种情况下,必须相应地更新内存范围)。
无论如何,空 MCU 上具有默认设置的 FlexNVM 内存可用作数据闪存,而 FlexRAM 可用作“标准”RAM。如果您想使用模拟 EEPROM(FlexRAM),则必须为其配置 FlexNVM 内存(程序分区命令和设置 FlexRAM 功能命令)。查看 flexnvm 示例代码...