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.
你(们)好
我一直在 TMS570LS0432PZ 控制器上开发自定义引导加载程序。 我已经看到我在 EEPROM 区域(组7)读写,但我没有看到 任何关于访问主闪存(组0 )区域读/写在任何扇区的任何示例功能。
是否可以在我的代码运行时将数据写入 MAIN 闪存?
任何帮助都是可以接受的。
尊敬的 Sai Teja:
请参阅以下主题、这与您遇到的问题类似。
(+) TMS570LC4357:在同一组上执行代码和擦除时出现问题-基于 Arm 的微控制器论坛-基于 Arm 的微控制器- TI E2E 支持论坛
——
谢谢、此致、
Jagadish。
当我尝试设置 Fapi_setActiveFlashBank(Contang0 Fapi_Flash )时、它进入了 UNDEF 条目。在我初 始化 Fapi_initializeFlashBanks(80.000)之前、这将返回 Fapi_Status_Success。
尊敬的 Sai Teja:
以下主题中有一些有效的 FAPI 示例、您能否请参考一下:
——
谢谢、此致、
Jagadish。
你好、jagadish、
我将在这里清楚地解释我的问题
我正在尝试开发一个 CAN 引导加载程序应用、其中我必须保存引导加载程序和我需要运行的应用程序将放置在同一存储器 i.e;闪存组0中
首先,我将从基地址保存我的引导加载程序应用程序,然后我要将我的 应用程序保存在 remanig 空存储器 区域。当我尝试 fapi_setActiveflashbank(Fapi_flashbank0)时,是否可以这样做。
我尝试过 copy2ram 函数、但我进入了 undef 条目、或者大部分进入了 prefetch 条目。
在这方面、我也需要帮助
谢谢、 此致
Sai Teja.
尊敬的 Sai Teja:
以下路径中有一个适用于 TMS570LS04x 器件的 CAN 引导加载程序示例:
如果您参考此示例、就可以清楚地了解、它们如何将 FAPI 例程存储在闪存中、以及如何从 RAM 运行例程。
——
谢谢、此致、
Jagadish。
你好、jagadish
我参考了上述示例、当我运行代码时、它一直停留在 线上
1. while (FAPI_GET_FSM_STATUS!= Fapi_Status_Success);
我已经附上了屏幕截图。
2.我还对 同一银行中所需位置的写入值存在问题
" Fapi_issueProgrammingCommand ((uint32_t*) 0x00100000、DataBuffer、8、0、0、Fapi_Auto EccGeneration);/*将数据编程到 Bank-0*/的第一个扇区
while ( fapi_check_fsm_ready_busy == Fapi_Status_Fsm y );
while (FAPI_GET_FSM_STATUS!= Fapi_Status_Success);"
使用上述函数、它也卡在 FAPI_GET_FSM_STATUS.行 、而不会在目标位置写入任何值。
我 遵循了 Fapi 指南、遵循了流程图、还遵循了 示例
尊敬的 Sai Teja:
对不起,我的回应延迟,我被其他问题卡住.
请发送完整的项目进行验证吗?
——
谢谢、此致、
Jagadish。
我已将该代码分享到您的个人聊天框中、请仔细阅读
尊敬的 Sai Teja:
我 通过将您的代码与工作中的 CAN 引导加载程序代码进行比较验证了该代码、但发现了以下问题:
1.如果我们验证那里的 CAN 引导加载程序代码、我们也将.const 段复制到 RAM 中、但在您的代码中、它仅在 FLASH0中。
2.另一个重要的是、在主循环开始时、我们应该在执行 FAPI 例程之前使用 memcpy 函数将 FAPI 例程从闪存复制到 RAM 中。
我想您的代码中少了这一项、如果我们没有这样做、那么闪存例程仍然只能从闪存中执行。 而且我们只有一个闪存组、因此将无法执行闪存例程并在同一个组上对闪存进行编程。
因此、请进行这些更正、在此附上完整的项目、供参考。请在最后遵循同样的步骤
e2e.ti.com/.../4024.SafetyMCU_5F00_Bootloaders.zip
——
谢谢、此致、
Jagadish。
尊敬的 Jagadish:
感谢它正在工作的帮助,但 即使 一切都是返回成功 ,但没有数据写入所需的位置。
Fapi_ issue_programcommand 返回成功、但没有写入该位置的数据。
void programFlash(uint32_t address, uint8_t *data, uint32_t length) { Fapi_StatusType status; // Erase the flash sector before programming status = Fapi_issueAsyncCommandWithAddress(Fapi_EraseSector, (uint32_t *)address); if (status != Fapi_Status_Success) { // Handle erase error while (1); } // Wait for the erase operation to complete while (Fapi_checkFsmForReady() != Fapi_Status_FsmReady); status=Fapi_enableMainBankSectors(12); if (status != Fapi_Status_Success) { // Handle erase error printf("Programming command failed with status:%d\n",status); printf("FSM Status: 0x%x\n", flashStatusWord); while (1); } while (Fapi_checkFsmForReady() != Fapi_Status_FsmReady); gh.FBPROT=0x01; gh.FBSE=0x3FFF; // Program the flash status = Fapi_issueProgrammingCommand((uint32_t *)address, data, length, NULL, 0, Fapi_AutoEccGeneration); if (status != Fapi_Status_Success) { // Handle programming error flashStatusWord=Fapi_getFsmStatus(); // Log or display detailed status printf("Programming command failed with status: %d\n", status); printf("FSM Status: 0x%x\n", flashStatusWord); // // Log or display detailed status // printf("Programming command failed with status: %d\n", status); // printf("FSM Status: 0x%x\n", flashStatusWord); // printf("%d\n",status); while (1); }
programFlash(0x00014DAC, dataToProgram, sizeof(dataToProgram));
尊敬的 Sai Teja:
您是否正确执行初始化?
您应该调用 Fapi_initializeFlashBanks API、其中您应该需要 使用 Fapi_setActiveFlashBank 设置活动的闪存存储体、然后您应该使用 Fapi_enableMainBankSectors API 启用扇区。
如果你没有调用这些初始化 API、那么你就不能写入闪存。
——
谢谢、此致、
Jagadish。
我在先前的函数调用中完成了这些操作
int main(void) { /* USER CODE BEGIN (3) */ int i; flashWBASE_t gh; /* Copy the flash APIs to SRAM*/ //_copyAPI2RAM_(&apiLoadStart, &apiRunStart, &apiLoadSize); memcpy(&apiRunStart, &apiLoadStart, (uint32)&apiLoadSize); /* Copy the .const section */ //_copyAPI2RAM_(&constLoadStart, &constRunStart, &constLoadSize); memcpy(&constRunStart, &constLoadStart, (uint32)&constLoadSize); disableInterrupts(); // Unlock the Flash for programming unlockFlash(); // Initialize the Flash API initFlashAPI(); // Data to program uint8_t dataToProgram[1] = {0x01}; // Program the data to flash programFlash(0x00014DAC, dataToProgram, sizeof(dataToProgram)); // Buffer to read back the data uint8_t dataRead[2] = {1,2}; // Read the data back from flash readFlash(0x00016000, dataRead, sizeof(dataRead)); // Compare the programmed and read data for ( i = 0; i < sizeof(dataToProgram); i++) { if (dataToProgram[i] != dataRead[i]) { // Handle mismatch error while (1); } } // Main loop while (1); }
void initFlashAPI(void) { // Initialize the Fapi library with the system clock frequency Fapi_StatusType status = Fapi_initializeFlashBanks(16); if (status != Fapi_Status_Success) { // Handle initialization error while (1); } // Set the active flash bank _disable_interrupt_(); _disable_IRQ_interrupt_(); status = Fapi_setActiveFlashBank(Fapi_FlashBank0); if (status != Fapi_Status_Success) { // Handle setting active bank error printf("Programming command failed with status: %d\n", status); while (1); } status=Fapi_enableMainBankSectors(8); if (status != Fapi_Status_Success) { // Handle erase error printf("Programming command failed with status:%d\n",status); printf("FSM Status: 0x%x\n", flashStatusWord); while (1); } gh.FBSE=0x3FFF; }
尊敬的 Sai Teja:
请压缩并发送您的整个项目、以获得更好的支持。
——
谢谢、此致、
Jagadish。
感谢整个项目、我现在正在研究、并将尽快提供更新。
尊敬的 Sai Teja:
这不是启用闪存扇区的正确方法。
如果您使用14号呼叫、则不会启用14个扇区。
e2e.ti.com/.../2843.SPNU501G.pdf
您可以看到、每个位代表一个扇区。
如果我们验证器件 TRM、组0将有13个右扇区(0至12)。
要启用所有这些扇区、您应该按如下方式调用 API:
Fapi_enableMainBankSectors (0x1FFF);
如果使用14 means (0xE)调用、则仅启用扇区1、2和3。
但在这里、您要尝试使用扇区11编写、这可能是它不起作用的原因。
——
谢谢、此致、
Jagadish。
如果我们必须禁用中断以避免进入预取错误?当我尝试擦除代码不存在的扇区时 ,它进入预取错误 ,而且当我们尝试加载 PC 加载特定的 LOaction 以加载应用程序时,它进入预取错误。您可以帮助这一点吗?
我已经启用了具有所需值的主扇区和 故障正在生成.
尊敬的 Sai Teja:
我还没有 TMS570LS0432开发板、我会做一件事情。 我将尝试在 RM46电路板上创建一个与您的电路板类似的项目、我将在星期一尝试创建该项目、并尽快提供更新。
——
谢谢、此致、
Jagadish。
尊敬的 Sai Teja:
我创建了示例工程以在 RM46器件中的 BANK0上进行写入。
我没有在书面上遇到任何问题。
但请记住您代码中的以下内容、
1.您尝试写入 0x00014DAC 地址、
即存储体0中的扇区5、因此我的建议是请确保您闪存中的程序大小不会超过该地址。 您可以使用映射文件执行此操作。
正如您在本例中看到的、我使用的是0x77DC 地址。
2.另外、从地址 0x00014DAC 开始、您只能写入4个字节而不超过4个字节。 因为该地址仅是4的倍数。 如果尝试一次写入8个字节或16个字节、则无法在该地址写入。
有关更多详细信息、请参阅以下常见问题解答:
请参考下面的示例并根据您的代码中的示例进行更改:
e2e.ti.com/.../FAPI_5F00_BANK0_5F00_TEST_5F00_RM46.zip
——
谢谢、此致、
Jagadish。
尚未解决。 如果问题得到解决、我将执行 ping 命令。