This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

[FAQ] C2000 Flash API 相关总结

Other Parts Discussed in Thread: C2000WARE
  • Flash API 函数的前缀为 “Fapi_”
  • Flash API 未配置PLL. 用户应用程序需要根据实际需求通过Fapi_initializeAPI()中的CPUCLK来配置 PLL
  • 在调用Flash API函数之前,请根据数据手册来配置wait state。如果应用程序配置的wait state和工作频率不匹配,则Flash API将产生错误。有关更多详细信息,请参见Fapi_SetActiveFlashBank()函数以及数据手册的5.9.4 Flash Parameters
  • Flash API 的执行是可中断的.但是在erase/program 时不能对Flash bank有read/fetch操作 。对于single-bank 的芯片, Flash API 函数/ 调用 Flash API 的用户应用程序函数以及ISR 都必须从RAM运行.例如 ,下面显示的整个代码段都应从RAM中执行,而不仅仅是Flash API函数。主要是因为Fapi_issueAsyncCommandWithAddress()函数向FSM发出了擦除命令,但它不会一直等到擦除操作结束。只要FSM忙于当前操作,就不会有Flash访问权限。

对于dual-bank芯片, Flash API可以从一个存储区执行以对另一存储区执行erase/program操作。

// Erase a Sector //

oReturnCheck = Fapi_issueAsyncCommandWithAddress(Fapi_EraseSector,(uint32*)0x0080000);

// Wait until the erase operation is over //

while (Fapi_checkFsmForReady() != Fapi_Status_FsmReady){}

  • Flash API 不会配置(enable/disable) 看门狗. 用户应用程序可以根据需要来配置看门狗。也就是说,不再提供Fapi_ServiceWatchdogTimer() 函数。
  • Flash API根据需要在内部使用EALLOW和EDIS,以允许/禁止对受保护的寄存器进行写操作。
  • 主阵列闪存编程必须与64位地址边界对齐且每64位字在每个写/擦除周期只能编程一次
  • 允许分别对数据和ECC进行编程。但是,每个64位数据字和16位ECC字每个写/擦除周期只能编程一次。
  • DCSM OTP编程必须与128位地址边界对齐并且每个128位字只能编程一次。除非是:

– DCSM OTP中的DCSM Zx-LINKPOINTER1和Zx-LINKPOINTER2值应为一起编程,并且可以根据DCSM操作的要求一次编程1位。

– DCSM OTP中的DCSM Zx-LINKPOINTER3值可以一次设置为1位。将其与Zx-PSWDLOCK分开的64位边界,后者只能编程一次。

  • 对于TMS320F28004x ,没有pump 信号量
  • 不应为link-pointer 的位置来编程ECC。当为编程操作提供的起始地址是三个link-pointer地址中的任何一个时,API会跳过对ECC的编程。API 将会使用Fapi_DataOnly 模式来对这些位置编程,即使用户使用Fapi_AutoEccGeneration或者Fapi_DataAndEcc模式作为编程模式的参数。Fapi_EccOnly 模式是不支持编程这些位置的。用户应注意为应用程序中的link-pointer位置保留单独的structure/section。请勿将这些字段与其他DCSM OTP设置混合使用。如果其他字段与link-pointer混合在一起,则API也会跳过非link-pointer位置的ECC编程。这将导致应用程序中的ECC错误。
  • 当使用INTOSC 作为时钟源时, 需要等待几个SYSCLK以及额外的等待状态waitstate才能执行擦除和编程操作。操作结束后,不需要额外的等待状态。
  • 为了避免zone1和zone2之间发生冲突,在DCSM寄存器中提供了一个信号量(FLSEM)以配置Flash寄存器。用户应用程序应在初始化Flash并调用Flash API函数之前配置此信号量寄存器。请参考TMS320F28004x Piccolo Microcontrollers Technical Reference Manual 来获取更多关于该寄存器的信息。
  • 请注意,Flash API函数不会配置任何DCSM寄存器。用户应用程序应确保配置所需的DCSM设置。例如, 如果zone 是安全的, 那Flash API 应该在同一个zone 来运行,以便能擦除/编程该zone的FLASH扇区。否则的话,该zone 应该被解锁unlocked. 若是没有解锁,则Flash API对 Flash 寄存器的写操作将不会成功。Flash API 不会检查对 Flash 寄存器的写操作是否成功。它根据擦除/编程序列的要求向它们写入数据,并假设写入已完成就返回。这将导致Flash API返回错误的成功状态。例如, 当调用Fapi_issueAsyncCommandWithAddress(Fapi_EraseSector, Address), 会返回success ,但是这不意味着成功擦除了该扇区。用户应当使用Fapi_getFSMStatus() 和 Fapi_doBlankCheck()

来检查Erase 状态

  • Flash API 是在该设备的ROM 内. 为了使用在ROM内的Flash API, 用户必须使用C2000Ware 内提供的F021_ROM_API_F28004x_FPU32.lib (ROM API symbols) library ,路径为:C2000Ware_x_xx_xx_xx\libraries\flash_api\f28004x\lib。使用ROM API时,无需将F021_API_F28004x_FPU32.lib(software API)嵌入到应用程序中即可进行Flash擦除/编程。使用ROM API时,请确保未在链接器命令文件中为API库分配flash-load和RAM运行地址,因为它已经存在于ROM中。但是,任何调用Flash API函数的应用程序函数都必须从RAM(对于single bank设备)或从没有针对Flash擦除/编程操作的另一存储区(对于dual bank设备)执行。另请注意,不应对正在进行Flash擦除/编程操作的Flash Bank / OTP进行任何访问。

参考文档: https://www.ti.com/lit/ug/spnu628a/spnu628a.pdf