1107014_zh-CN

cancel
Showing results for 
Show  only  | Search instead for 
Did you mean: 

1107014_zh-CN

1107014_zh-CN

MQX FlashX 驱动程序 – 如何编写 FlexNVM?<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />

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.pdfMQX_BSP_Porting_Guide.pdfMQX_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.hinit_flashx.c文件flash_ftfl.cflash_ftfe.c文件。注意: user_config.h.h init_flashx.c是 BSP 代码的一部分。

2.2 在user_config.h中启用 FlashX文件定义:

#定义 BSPCFG_ENABLE_FLASHX 1

2.3 更新.h文件:

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.cflash_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。当目标区域(与短语对齐)为空白时,在完整扇区写入和部分扇区覆盖的情况下不需要扇区缓存分配。

回复:MQX FlashX 驱动程序 – 如何编写 FlexNVM?<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />

你好,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 示例代码...

Tags (1)
No ratings
Version history
Last update:
‎11-19-2025 05:11 AM
Updated by: