ZHCUAO0C
November
2022
– November 2023
TMS320F280033 , TMS320F280034 , TMS320F280034-Q1 , TMS320F280036-Q1 , TMS320F280036C-Q1 , TMS320F280037 , TMS320F280037-Q1 , TMS320F280037C , TMS320F280037C-Q1 , TMS320F280038-Q1 , TMS320F280038C-Q1 , TMS320F280039 , TMS320F280039-Q1 , TMS320F280039C , TMS320F280039C-Q1
1
商标
1 引言
1.1
参考书籍
1.2
函数清单格式
2 TMS320F28003x 闪存 API 概述
2.1
引言
2.2
API 概述
2.3
使用 API
2.3.1
初始化流程
2.3.1.1
器件上电后
2.3.1.2
FMC 和存储体设置
2.3.1.3
关于系统频率变化
2.3.2
使用 API 进行构建
2.3.2.1
目标库文件
2.3.2.2
分布文件
2.3.3
闪存 API 使用的关键事实
3 API 函数
3.1
初始化函数
3.1.1
Fapi_initializeAPI()
3.2
闪存状态机函数
3.2.1
Fapi_setActiveFlashBank()
3.2.2
Fapi_issueAsyncCommandWithAddress()
3.2.3
Fapi_issueBankEraseCommand()
3.2.4
Fapi_issueProgrammingCommand()
3.2.5
Fapi_issueProgrammingCommandForEccAddresses()
3.2.6
Fapi_issueFsmSuspendCommand()
3.2.7
Fapi_issueAsyncCommand()
3.2.8
Fapi_checkFsmForReady()
3.2.9
Fapi_getFsmStatus()
3.3
读取函数
3.3.1
Fapi_doBlankCheck()
3.3.2
Fapi_doVerify()
3.3.3
Fapi_calculatePsa()
3.3.4
Fapi_doPsaVerify()
3.4
信息函数
3.4.1
Fapi_getLibraryInfo()
3.5
实用功能
3.5.1
Fapi_flushPipeline()
3.5.2
Fapi_calculateEcc()
3.5.3
Fapi_isAddressEcc()
3.5.4
Fapi_remapEccAddress()
3.5.5
Fapi_calculateFletcherChecksum()
4 推荐的 FSM 流程
4.1
新出厂器件
4.2
推荐的擦除流程
4.3
推荐的存储体擦除流程
4.4
推荐的编程流程
5 与安全相关的软件应用程序使用假设
A 闪存状态机命令
A.1 闪存状态机命令
B 编译器版本和构建设置
C 目标库函数信息
C.1 TMS320F28003x 闪存 API 库
D typedef、定义、枚举和结构
D.1 类型定义
D.2 定义
D.3 枚举
D.3.1 Fapi_FlashProgrammingCommandsType
D.3.2 Fapi_FlashBankType
D.3.3 Fapi_FlashStateCommandsType
D.3.4 Fapi_FlashReadMarginModeType
D.3.5 Fapi_StatusType
D.3.6 Fapi_ApiProductionStatusType
D.4 结构
D.4.1 Fapi_FlashStatusWordType
D.4.2 Fapi_LibraryInfoType
E 并行签名分析 (PSA) 算法
E.1 函数详细信息
F ECC 计算算法
F.1 函数详细信息
G 勘误
修订历史记录
2.3.3 闪存 API 使用的关键事实
以下是有关 API 使用的一些重要事实:
闪存 API 函数的名称以前缀 "Fapi_" 开头。
闪存 API 不配置 PLL。用户应用程序应根据需要配置 PLL 并将配置的 CPUCLK 值传递给 Fapi_initializeAPI() 函数(该函数的详细信息在本文档后面给出)。
闪存 API 不会检查 PLL 配置来确认用户输入频率。这由系统集成商决定。TI 建议使用 DCC 模块来检查系统频率。有关实现示例,请参阅 C2000Ware driverlib 时钟配置函数。
在调用闪存 API 函数之前,请始终根据器件特定数据手册配置等待状态。如果应用程序配置的等待状态不适合应用程序的工作频率,闪存 API 将发出错误。有关更多详细信息,请参阅 Fapi_Set ActiveFlashBank() 函数。
闪存 API 执行可中断。但是,不应从正在进行擦除/编程操作的闪存存储体进行任何读取/获取访问。因此,闪存 API 函数、调用闪存 API 函数的用户应用程序函数以及任何中断服务例程 (ISR) 必须从 RAM 执行或从未作为擦除/编程操作目标的其他闪存存储体执行。例如,除了闪存 API 函数之外,上述条件还适用于下面显示的整个代码片段。之所以会这样,是因为 Fapi_issueAsyncCommandWithAddress() 函数向 FSM 发出了擦除命令,但并没有等到擦除操作结束。只要 FSM 忙于进行当前操作,就不应访问正在擦除的闪存存储体。
//
// Erase a Sector
//
oReturnCheck = Fapi_issueAsyncCommandWithAddress(Fapi_EraseSector,(uint32*)0x0080000);
//
// Wait until the erase operation is over
//
while (Fapi_checkFsmForReady() != Fapi_Status_FsmReady){}
闪存 API 不配置(启用/禁用)看门狗。用户应用程序可以配置看门狗并根据需要对其进行维护。因此,不再提供 Fapi_ServiceWatchdogTimer() 函数。
闪存 API 根据需要在内部使用 EALLOW 和 EDIS 来允许/禁止对受保护的寄存器进行写入。
主阵列闪存编程必须与 64 位地址边界对齐,并且每个 64 位字在每个写/擦除周期只能编程一次。
允许单独对数据和 ECC 进行编程。但是,每个 64 位数据字和相应的 ECC 字在每个写入/擦除周期只能编程一次。
DCSM OTP 编程必须与 128 位地址边界对齐,并且每个 128 位字只能编程一次。例外包括:
DCSM OTP 中的 DCSM Zx-LINKPOINTER1 和 Zx-LINKPOINTER2 值应一起编程,并且可以按照 DCSM 操作的要求一次编程 1 位。
DCSM OTP 中的 DCSM Zx-LINKPOINTER3 值可按照 DCSM 操作的要求,一次编程 1 位。
如果需要,用户可以单独对 JLM_Enable 进行编程。如果用户要同时对所有 64 位进行编程,则必须读取链路指针(ZxOTP_LINKPOINTER1、ZxOTP_LINKPOINTER2、ZxOTP_LINKPOINTER3),并将该值与 JLM_Enable 值一起编程。
TMS320F28003x 器件中没有泵信标。
不应针对链路指针位置对 ECC 进行编程。当为编程操作提供的起始地址是三个链路指针地址中的任何一个时,API 将跳过对 ECC 的编程。即使用户将 Fapi_AutoEccGeneration 或 Fapi_DataAndEcc 模式作为编程模式参数传递,API 也会使用 Fapi_DataOnly 模式对此类位置进行编程。Fapi_EccOnly 模式不支持对此类位置进行编程。用户应用程序应谨慎处理这一点。应注意为应用程序中的链路指针位置维护一个单独的结构/段。请勿将此类字段与其他 DCSM OTP 设置混合。如果其他字段与链接指针混合,API 也会跳过对非链接指针位置的 ECC 编程。这将导致应用程序中出现 ECC 错误。
当使用 INTOSC 作为时钟源时,一些 SYSCLK 频率范围需要额外的等待状态来进行擦除和编程操作。操作结束后,就不需要额外的等待状态了。有关更多详细信息,请参阅 TMS320F28003x 微控制器数据手册 。
为了避免 zone1 和 zone2 之间的冲突,DCSM 寄存器中提供了信标 (FLSEM) 来配置闪存寄存器。在对闪存进行初始化和调用闪存 API 函数之前,用户应用程序应该配置该信标寄存器。有关该寄存器的更多详细信息,请参阅 TMS320F28003x 微控制器技术参考手册 。
请注意,闪存 API 函数不配置任何 DCSM 寄存器。用户应用程序应确保配置所需的 DCSM 设置。例如,如果某个区域受到保护,则应从同一区域执行闪存 API,以便能够擦除或编程该区域的闪存扇区。或者应解锁该区域。否则,闪存 API 对闪存寄存器的写入将不会成功。闪存 API 不会检查对闪存寄存器的写入是否正在进行。其按照擦除/编程序列的要求向它们写入数据,并在假设写入完成后就返回。这将导致闪存 API 返回错误的成功状态。例如,调用 Fapi_issueAsyncCommandWithAddress(Fapi_EraseSector, Address) 时,可以返回成功状态,但这并不意味着扇区擦除成功。应使用 Fapi_getFSMStatus() 和 Fapi_doBlankCheck() 来检查擦除状态。
请注意,不应对正在进行闪存擦除/编程操作的闪存存储体/OTP 进行任何访问。