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.
您好!
我尝试使用来自 C2000的闪存 API 将一些数据写入闪存。 当我想要验证写入闪存的数据时、 我遇到了一个奇怪的现象。 这是我的代码。
我有一个名为 blFlags 的全局结构和虚拟数据、应该写入闪存。 (该结构再次位于另一个结构体中、但我为了简单起见将其遗漏掉)。
struct STRUCT_bootloaderFlags { uint16_t appFlag; // = 0xFFFF uint16_t backupFlag; // = 0xFFFF uint16_t flashError; // = 22 uint16_t RS485Error; // = 44 uint16_t rsvd_1; // = 1 uint16_t rsvd_2; // = 2 uint16_t rsvd_3; // = 3 uint16_t rsvd_4; // = 4 }; struct STRUCT_bootloaderFlags blFlags;
首先、我按照 闪存 API 手册中所述初始化 API、初始化闪存组、Fapi_initiataleAPI ()、 Fapi_setActiveFlashBank()。 所有函数都放置在 RAM 中。
然后、我使用该代码写入数据。
// Issue program command oReturnCheck = Fapi_issueProgrammingCommand((uint32_t *)BOOTLOADER_FLAGS_START_ADDRESS, (uint16_t *)&objFlash.blFlags, 8, 0, 0, Fapi_AutoEccGeneration); // Wait until the Flash program operation is over while (Fapi_checkFsmForReady() != Fapi_Status_FsmReady) if(oReturnCheck != Fapi_Status_Success) { objFlash.error |= ERROR_FAPI_WRITEFLAG; }
如果我现在对闪存地址进行 CPU 读取、我可以看到这些值是正确的。 但是,如果我使用 Fapi_doVerify()函数,它会导致我失败。 我尝试了一些不同的设置、我可以将 问题缩小到两个函数调用、其中一个 函数调用正常、另一个函数调用不起作用。
Fapi_StatusType oReturnCheck; Fapi_FlashStatusWordType oFlashStatusWord_1, oFlashStatusWord_2; uint16_t tempDataBlock[8]; uint32_t *tempPtr; memcpy((uint16_t *)&tempDataBlock, (uint16_t *)&objFlash.blFlags, sizeof(tempDataBlock)); tempPtr = (uint32_t *)&tempDataBlock; // = 0x00000438 oReturnCheck = Fapi_doVerify((uint32_t *)startAddress, 4, tempPtr, &oFlashStatusWord_1); // Works tempPtr = (uint32_t *)&objFlash.blFlags; // = 0x0000A813 oReturnCheck = Fapi_doVerify((uint32_t *)startAddress, 4, tempPtr, &oFlashStatusWord_2); // Do not work
workung 提供的函数的 oFlashStatusWord 中的返回值
oFlashStatusWord_1.au32StatusWord [0] 0x00000000 [1] 0x00100002 [2] 0x0005F8A0 [3] 0x0005F890
失败的是什么
oFlashStatusWord_2.au32StatusWord [0] 0x00082000 // address of first non-blank location [1] 0xFFFFFFFF // data read at first verify failure location [2] 0xFFFF0000 // value of compare data [3] 0x00000000 // N/A
因此 、正如我解释的那样、函数在读取全局结构时遇到问题。 这是可能的、还是我犯了另一个错误?
当然,我想避免 memcpy()函数并直接从结构中读取,以加快速度。
我希望有人能帮助我解决这个问题。 提前感谢。
此致、
Simon
您好、Simon、
我将在星期一之前回来。
谢谢、
Anu
您是否尝试直接将地址(在地址字段中输入(uint32_t *)&objFlash.blFlags)传递给 Fapi_doVerify 函数、而不是将其分配给 tempPtr? 分配可能会导致错误。
尊敬的 Anu:
感谢你的答复。
您的建议解决了问题。 我的软件的结构使我不得不依赖指针。 然后、我将能够通过对软件进行结构更改来解决这个问题。
再次感谢!
此致、
Simon