ZHCACJ7 april   2023 MSPM0G1105 , MSPM0G1106 , MSPM0G1107 , MSPM0G1505 , MSPM0G1506 , MSPM0G1507 , MSPM0G3105 , MSPM0G3106 , MSPM0G3107 , MSPM0G3505 , MSPM0G3506 , MSPM0G3507 , MSPM0L1105 , MSPM0L1106 , MSPM0L1303 , MSPM0L1304 , MSPM0L1305 , MSPM0L1306 , MSPM0L1343 , MSPM0L1344 , MSPM0L1345 , MSPM0L1346

 

  1.   1
  2.   摘要
  3.   商标
  4. 1引言
  5. 2实现
  6. 3软件说明
  7. 4应用程序方面
  8. 5参考文献

软件说明

该软件提供基本的 EEPROM 功能。至少要使用 2 个扇区来仿真 EEPROM。如上所述,这些扇区划分为多条记录,每条记录均包含标头,用于确定数据的有效性。为了减少闪存操作的次数,RAM 中与虚拟 EEPROM 大小相同的缓冲区用于复制活动记录的数据。此外,4 个全局变量用于跟踪活动记录,3 个全局变量用于表示标志。

软件功能和流程

用户总共仅直接调用三个函数。

  • EEPROM_TypeA_init
  • EEPROM_TypeA_writeData
  • EEPROM_TypeA_eraseLastSector

图 3-1 中显示了简要软件流程。器件应首先执行初始化代码。通过调用 EEPROM_TypeA_init,它会搜索活动记录并检查闪存的格式。如果存在活动记录,则活动的数据将复制到 RAM 中的缓冲区。如果格式不正确,将修复格式。初始化后,将有一个用于 EEPROM 仿真且正确格式化的闪存区域,几个跟踪活动记录的全局变量以及一个复制活动记录数据的 RAM 缓冲区。

在应用程序中,用户可以直接读取或编辑 RAM 中的缓冲区。仅当调用 EEPROM_TypeA_writeData 时,缓冲区才会作为新的活动记录存储到闪存中。EEPROM_TypeA_writeData 还将在扇区已满时设置擦除标志。在流程中,设置擦除标志后会立即调用 EEPROM_TypeA_eraseLastSector。根据应用程序,用户可以选择适当的时间点来擦除。

GUID-20230417-SS0I-L2MC-1PJM-5X5LDS177VBS-low.svg图 3-1 简要软件流程

EEPROM 函数

实现此功能需要六个函数。除上述三个函数外,其余三个函数主要由 EEPROM_TypeA_init 调用。

  • EEPROM_TypeA_init
  • EEPROM_TypeA_writeData
  • EEPROM_TypeA_eraseLastSector
  • EEPROM_TypeA_readData
  • EEPROM_TypeA_searchCheck
  • EEPROM_TypeA_repairFormat

此外,7 个全局变量用于记录 EEPROM 仿真的状态。有 4 个全局变量用于跟踪活动记录。

  • uint32_t gActiveRecordAddress;
  • uint32_t gNextRecordAddress;
  • uint16_t gActiveRecordNum;
  • uint16_t gActiveSectorNum;

gActiveRecordAddress 和 gNextRecordAddress 用于存储活动记录相关地址。

gActiveRecordNum 和 gActiveSectorNum 用于跟踪活动记录的位置。

有 3 个全局变量用于表示标志。

  • bool gEEPROMTypeASearchFlag;
  • bool gEEPROMTypeAEraseFlag;
  • bool gEEPROMTypeAFormatErrorFlag;

当存在活动记录时设置 gEEPROMTypeASearchFlag。

当扇区已满且需要擦除时设置 gEEPROMTypeAEraseFlag。

当发现格式错误时设置 gEEPROMTypeAFormatErrorFlag。

EEPROM_TypeA_init

该函数用于初始化 EEPROM 仿真。通过此函数,可恢复用户数据并跟踪闪存中的活动记录。此函数包含以下功能:

  • 活动记录搜索和格式检查
  • 将活动记录读取到 RAM 中的缓冲区
  • 如有必要,通过调用 EEPROM_TypeA_repairFormat 进行格式修复

图 3-2 中显示了软件流程。首先,它通过调用 EEPROM_TypeA_searchCheck 搜索活动记录并检查格式。根据 EEPROM_TypeA_searchCheck 设置的标志,可以确定活动记录是否存在或格式是否正确。如果存在活动记录,则通过调用 EEPROM_TypeA_ReadData 将活动记录的数据复制到 RAM 中的缓冲区,并将指针设置为活动记录。如果不存在活动记录,则擦除所有扇区并将指针设置为第一个扇区的开头。

如果格式不正确,将通过调用 EEPROM_TypeA_repairFormat 来修复格式。格式修复后,将擦除所有扇区并恢复活动记录。图 3-3图 3-4 分别显示了 EEPROM_TypeA_init 前后的闪存区域比较。

该函数的输入是 RAM 中缓冲区的地址。该函数的输出为操作状态。此外,函数中更新了全部 7 个全局变量。

  • 输入:&buffer[0]
  • 输出:操作状态
GUID-20230417-SS0I-8L3C-XPZD-3FJ2SWR2LXCL-low.svg图 3-2 EEPROM_TypeA_init 的软件流程
GUID-20230417-SS0I-GZV8-S5Q6-C6P7XBK0HR9W-low.png图 3-3 用于正常场景的 EEPROM_TypeA_init
GUID-20230417-SS0I-GVCJ-WZR9-5FVJR19DGDHT-low.png图 3-4 用于非正常场景的 EEPROM_TypeA_init

EEPROM_TypeA_writeData

EEPROM_TypeA_writeData 用于将数据从 RAM 中的缓冲区存储到闪存。通过该函数,可以将新的活动记录添加到闪存中。

用户可以直接读取或编辑 RAM 中的缓冲区。但是,只有在调用此函数后,缓冲区的数据才会复制到新的活动记录中。换句话说,闪存区域用于记录/备份缓冲区。断电时,RAM 中的所有数据都会丢失,并且活动记录用于恢复数据。

图 3-5 中显示了软件流程。首先,它会检查下一条记录是否擦除。然后开始将数据存储到下一条记录中。该过程如图 2-3 所示:

  1. 将记录的标头设置为“Recording”
  2. 将数据从 RAM 中的缓冲区复制到记录中
  3. 将记录的标头设置为“Active”
  4. 如果存在最后一条活动记录,将其标头设置为“Used”

最后,检查该扇区是否已满。如果是,将设置 gEEPROMTypeAEraseFlag。此外,有关活动记录的全局变量也会更新。EEPROM_TypeA_writeData 前后的闪存区域比较如图 3-6 所示。

该函数的输入是 RAM 中缓冲区的地址。该函数的输出为操作状态。

  • 输入:&buffer[0]
  • 输出:操作状态
GUID-B39C88FD-1E9F-490C-995F-C557D99FC374-low.png图 3-5 EEPROM_TypeA_writeData 的软件流程
GUID-44D67BF1-58C1-4C8F-ADF0-373E54609F1F-low.png图 3-6 EEPROM_TypeA_writeData 的软件流程

EEPROM_TypeA_eraseLastSector

EEPROM_TypeA_eraseLastSector 用于在闪存扇区已满时擦除该扇区。调用 EEPROM_TypeA_writeData 时,如果扇区已满,将设置 gEEPROMTypeAEraseFlag。建议在设置 gEEPROMTypeAEraseFlag 后立即调用 EEPROM_TypeA_eraseLastSector,如图 3-1 所示。但是,用户可以通过修改简要软件流程来更改要擦除扇区的时间点。

该函数的输出为操作状态。

  • 输入:void
  • 输出:操作状态

EEPROM_TypeA_readData

EEPROM_TypeA_readData 用于将数据从闪存中的活动记录复制到 RAM 中的缓冲区。该函数在 EEPROM_TypeA_init 中调用。虽然用户可以直接读取或编辑 RAM 中的缓冲区,但用户通常不会直接使用 EEPROM_TypeA_readData。

该函数的输入是 RAM 中缓冲区的地址。

  • 输入:&buffer[0]
  • 输出:void

EEPROM_TypeA_searchCheck

EEPROM_TypeA_searchCheck 用于搜索活动记录并检查格式。该函数遍历所有记录的标头。如果找到活动记录,将设置搜索标志并更新活动记录相关的全局变量。如果存在“Recording”标头或无效标头,或存在其他格式错误情况,将设置错误标志。该函数在 EEPROM_TypeA_repairFormat 中调用。图 3-7 中显示了软件流程。

该函数通过设置全局变量来输出结果,因此函数的输入和输出都是 void。

  • 输入:void
  • 输出:void
GUID-2FE5D581-B291-424F-ADC3-CA8C1E8C36F7-low.png图 3-7 EEPROM_TypeA_searchCheck 的软件流程

EEPROM_TypeA_repairFormat

EEPROM_TypeA_repairFormat 用于修复格式。在调用函数之前,活动记录应已读取到 RAM 中的缓冲区。通过此函数,可擦除所有扇区并将数据从 RAM 中的缓冲区复制到闪存中的新记录中。该函数在 EEPROM_TypeA_repairFormat 中调用。图 3-8 中显示了软件流程。

该函数的输入是 RAM 中缓冲区的地址。该函数的输出为操作状态。

  • 输入:&buffer[0]
  • 输出:操作状态
GUID-47FB536F-D9B0-48D4-A864-9C4500AC1101-low.png图 3-8 EEPROM_TypeA_repairFormat 的软件流程

应用程序集成

需要此功能的应用程序必须包含为 MSPM0 MCU 提供的 eeprom_emulation_type_a.c 和 eeprom_emulation_type_a.h 文件。另外,还需包含面向特定器件的闪存 API。例如,对于 MSPM0G3507/MSPM0L1306,需要包含以下文件:

  • eeprom_emulation_type_a.c
  • eeprom_emulation_type_a.h
  • ti_msp_dl_config.c
  • ti_msp_dl_config.h

支持 MSPM0 产品的 SDK 中已包含 EEPROM 仿真库。

该 SDK 中还包含所有闪存 API 文件。

GUID-9633C96F-BD9F-496F-B222-94783B7B55CE-low.png图 3-9 软件所需的文件

EEPROM 仿真存储器占用空间

表 3-2 详细说明了 EEPROM 仿真驱动程序在闪存大小和 RAM 大小方面的占用空间。下表和下图是在使用 Code Composer Studio(版本:11.2.0.00007)且优化级别为 2 的条件下确定的。

表 3-1 EEPROM 仿真的结构
机制 所需的最小代码大小(字节)
闪存 SRAM
具有 64 字节记录大小的 EEPROM 仿真 A 型 2616 71
具有 128 字节记录大小的 EEPROM 仿真 A 型 2616 135
具有 256 字节记录大小的 EEPROM 仿真 A 型 2616 273

EEPROM 仿真时序

本部分介绍了与基于两个 1KB 闪存扇区的 EEPROM 仿真驱动程序相关的时序参数。

所有时序测量均在以下条件下执行:

  • MSPM0G3507
  • 系统时钟为 32MHz
  • 从闪存执行
  • 室温

这些函数通过以下参数进行测试:

  • 记录大小:128 字节
  • 使用的扇区数:2
  • 扇区地址:0x00001000
表 3-2 EEPROM 仿真操作时序
操作 典型值 (µs)
格式正确的 EEPROM_TypeA_init 80
格式修复后的 EEPROM_TypeA_init 4467
EEPROM_TypeA_writeData 848
EEPROM_TypeA_eraseLastSector 3612