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.

[参考译文] TMS320F28P650DK:在 F28P65x 上使用闪存 API v3.00.02.00 时的闪存回读问题

Guru**** 2524550 points
Other Parts Discussed in Thread: C2000WARE

请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1553638/tms320f28p650dk-flash-readback-issue-using-flash-api-v3-00-02-00-on-f28p65x

器件型号:TMS320F28P650DK
主题:C2000WARE 中讨论的其他器件

工具/软件:

您好、

我当前正在使用的器件  闪存 API 版本 3.00.02.00  在 F28P65x 器件上执行闪存操作。

问题描述:

闪存编程似乎成功—数据是按照调试期间的验证正确写入的。 但是、在回读过程中、一些特定的存储器位置始终会返回不正确的值。 此行为可重现、并且为这些位置固定了错误值。

  • 写入缓冲区中包含的内容  32 个字 、值范围为 0x0000  0x001F
  • 编程后从同一缓冲区回读期间会出现该问题。
  • 我已经测试过这种行为  组 1、组 2 和组 3 、问题仍然存在。
  • 观察到错误的读取值  2 到 3 个固定位置 、读取的值在这些地址始终不正确。

受影响的地址示例:  

  位置       写入的数据 数据读取    
实验 组 1/Sec-0 0x000A0404 0x0004.        0x0005.   
0x000A0410 0x0010         0x0090   
0x000A041C 0x001C   0x0018   

实验

组 2/Sec-0

0x000C0408 0x0008.           0x0009.  
0x000C0410 0x0010 0x0014  
0x000C041C 0x001C   0x009C   

实验  

组 3/Sec-0

0x000E040D 0x000D           0x000C   
0x000E0415 0x0015 0x0011   
0x000E0419 0x0019   0x0099   

在调试期间、我从中捕获了一个快照  组 1、扇区 0 、地址中观察到错误的回读 0x000A0404。 此位置的预期值为 0x0004、已确认正确编程。 但是、回读始终返回 0x0005

这种差异似乎可以重现、可能与前面所述的问题有关。

问题的重现性:

此问题在多个调试会话中始终可以重现。 每次我进入调试模式并在同一存储体和扇区上执行闪存操作时、错误的回读会发生在相同的存储器位置。 无论实验中的尝试次数或变化情况如何、此行为都将持续存在、表明该特定地址存在固定的失败模式。

一个奇怪的观察:

在 F28P65x 器件上进行闪存编程期间、注意到了一种异常行为。 尝试将特定值(如,或)写入 0x0004 0x0010 0x001C 其各自的闪存位置时、读回值出现错误。 但是、当写入稍微不同的值时(例如,而不是,而不是和) 0x1004  0x0004 0x1010  0x0010 0x101C  0x001C、读回值始终是正确的。

请告知可能的原因。

此致、

Bhavin P

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    尊敬的 Bhavin:

    在对数据进行编程后,您是否可以尝试修改程序以使用 Fapi_doVerify ()? 这也会引发误差吗?   有关如何使用该函数的信息、可以参阅闪存 API 用户指南。

    此致、

    Alex

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好 Alex、

    我已经测试了 Fapi_doVerify 闪存 API、它始终在地址 0xA0404 处报告验证失败。

    为了进一步研究、我尝试了同时使用这两种方法进行编程 Fapi_issueProgrammingCommand Fapi_issueDataOnly512ProgrammingCommand 。 在这两种情况下、问题都仍然存在。

    请注意、此场景中未使用 ECC;操作涉及仅数据编程。

    此致、

    Bhavin P

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好 Alex、

    Fapi_doVerify  状态供您参考。  

    此致、

    Bhavin P

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    尊敬的 Bhavin:

    您能共享您的程序并验证代码吗? 此外、您是否在使用 DataOnly 后手动对 ECC 值进行编程? 必须对 ECC 进行编程、否则将触发 ECC 错误。

    此致、

    Alex

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好 Alex、

    我不使用 ECC、我想这是可选功能。 我正在中使用 仅限 Fapi_Data 读取以正确的模式写入  Fapi_issueProgrammingCommand API。 即使我不使用 ECC、也没有收到与 ECC 相关的错误、API 也会在写入值后发送成功。

    事实上我尝试使用两个 API 选项编写-  

    1.  Fapi_issueDataOnly512ProgrammingCommand

    2.  Fapi_issueProgrammingCommand

    我在两种情况下都能看到相同的行为、这里我将与两种情况共享程序。  

    #define TEST_BUF_SIZE  32
    
    #define ADDRESS_BANK_0   0x00080000ul
    #define ADDRESS_BANK_1   0x000A0000ul
    #define ADDRESS_BANK_2   0x000C0000ul
    #define ADDRESS_BANK_3   0x000E0000ul
    #define ADDRESS_BANK_4   0x00100000ul
    
    
    #define FLASH_WRAPPER_PROGRAM_BASE    0x57000U /*(FLASH0CMD_BASE - 0x1000UL)*/
    #define FLASH_API_BASE_ADDRESS        0x00057000  // Replace with actual API location in memory
    #define SYSTEM_HCLK_FREQ_MHZ          120         // Replace with actual HCLK frequency
    #define SECTOR_ADDRESS                0x00080000  // Replace with actual sector start address
    #define SECTOR_SIZE_IN_BYTES          2048
    #define LEN_OF_REGION_IN_32_BIT_WORDS 4
    #define SECTOR_SIZE_IN_WORDS          SECTOR_SIZE_IN_BYTES/LEN_OF_REGION_IN_32_BIT_WORDS
    
    #define FLASH_WRAPPER_BASE     0x57000U
    #define FLASH_O_CMDWEPROTB     0x11D4U  // Offset for Bank-1 sector enable register

    闪存初始化

    #pragma CODE_SECTION(initFlash, ".TI.ramfunc");
    void initFlash(void)
    {
        Fapi_LibraryInfoType  lib_info;
        // Enable Global Interrupt (INTM) and realtime interrupt (DBGM)
        EINT;
        ERTM;
    
        EALLOW;
    
        IPC_claimFlashSemaphore(IPC_FLASHSEM_OWNER_CPU1);
        SysCtl_allocateFlashBank(SYSCTL_FLASH_BANK1, SYSCTL_CPUSEL_CPU1);
        SysCtl_allocateFlashBank(SYSCTL_FLASH_BANK2, SYSCTL_CPUSEL_CPU1);
        SysCtl_allocateFlashBank(SYSCTL_FLASH_BANK3, SYSCTL_CPUSEL_CPU1);
    
        initFlashAPIs( );
        lib_info = Fapi_getLibraryInfo();
        (void)(lib_info);
    
        Flash_disableECC(FLASH0CTRL_BASE);
    
        setFlashBank( Fapi_FlashBank1 );
        pReadMem = &read16bitData(ADDRESS_BANK_1);
        memcpy((uint16_t*)read_data,(const uint16_t*)pReadMem,(size_t)TEST_BUF_SIZE);
        IPC_releaseFlashSemaphore();
    }

    从 testAPI 函数调用擦除、写入和读取函数

    #pragma CODE_SECTION(testFlashAPIs, ".TI.ramfunc");
    void testFlashAPIs( void )
    {
         Fapi_StatusType fstatus;
         uint16_t iIndex;
         uint32_t au32StatusWord[4];
         uint32_t add_offset = 0x0000;
    
         for ( iIndex=0;iIndex<TEST_BUF_SIZE;iIndex++)
         {
               write_data_buf[iIndex] = iIndex ;
    //         if(iIndex == 4)
    //         {
    //             write_data_buf[iIndex] = 0x0005;
    //         }
    //         if(iIndex == 16)
    //         {
    //             write_data_buf[iIndex] = 0x0011;
    //         }
    //         if(iIndex == 28)
    //         {
    //             write_data_buf[iIndex] = 0x001D;
    //         }
         }
    
         cs_before_write = Fapi_calculateFletcherChecksum((uint16_t *)write_data_buf,TEST_BUF_SIZE);
    
         eraseSector( Fapi_FlashBank1, ( ADDRESS_BANK_1 ) );
    
         write32ByteProgWord( ( ADDRESS_BANK_1 + add_offset), &write_data_buf[0], TEST_BUF_SIZE );
    
         cs_from_flash_data = Fapi_calculateFletcherChecksum((uint16_t *)ADDRESS_BANK_1,TEST_BUF_SIZE);
    
         pReadMem = &read16bitData(ADDRESS_BANK_1);
         memcpy((uint16_t*)read_data,(const uint16_t*)pReadMem,(size_t)TEST_BUF_SIZE);
         cs_after_read_from_flash = Fapi_calculateFletcherChecksum((uint16_t *)read_data,TEST_BUF_SIZE);
    
    
         fstatus = Fapi_doVerify(
             (uint32_t *)ADDRESS_BANK_1,         // Start address
             TEST_BUF_SIZE,                      // Number of bytes
             (uint32_t *)&write_data_buf,        // Data buffer
             (Fapi_FlashStatusWordType*)&au32StatusWord                  // Verify mode
         );
    
         if (fstatus != Fapi_Status_Success) {
             // Handle verification failure
    
         }
        eraseSector( Fapi_FlashBank1, ( ADDRESS_BANK_1 ) );
        while(1);
    }

    擦除功能

    #pragma CODE_SECTION(eraseSector, ".TI.ramfunc");
    void eraseSector(Fapi_FlashBankType bank, uint32_t address)
    {
    
        Fapi_StatusType status;
        Fapi_FlashStatusWordType flashStatusWord;
    
        Fapi_setupBankSectorEnable(FLASH_WRAPPER_PROGRAM_BASE+FLASH_O_CMDWEPROTA, 0x00000000);
        Fapi_setupBankSectorEnable(FLASH_WRAPPER_PROGRAM_BASE+FLASH_O_CMDWEPROTB, 0x00000000);
    
        while(Fapi_Status_FsmReady != Fapi_checkFsmForReady( ))
        {
            ; /* be here only till FSM state is not ready */
        }
    
        // Step 2: Set the active flash bank
        status = Fapi_setActiveFlashBank(bank);
        if (status != Fapi_Status_Success)
        {
            while(1);
        }
    
        IPC_claimFlashSemaphore(IPC_FLASHSEM_OWNER_CPU1);
        SysCtl_allocateFlashBank(SYSCTL_FLASH_BANK1, SYSCTL_CPUSEL_CPU1);
        status = Fapi_issueBankEraseCommand((uint32*) address);
        IPC_releaseFlashSemaphore();
        //status = Fapi_issueAsyncCommandWithAddress(Fapi_EraseSector, (uint32_t *)address);
        if (status != Fapi_Status_Success)
        {
            while(1);
        }
        Fapi_flushPipeline( );
        // Step 5: Verify erase using blank check
    //    status = Fapi_doBlankCheck((uint32_t *)address, SECTOR_SIZE_IN_WORDS, &flashStatusWord);
    //    if (status != Fapi_Status_Success)
    //    {
    //        // Handle erase verification failure
    //        // printf("Erase failed at address: 0x%08X\n", flashStatusWord.u32FailAddress);
    //        // printf("Expected blank (0xFFFFFFFF), found: 0x%08X\n", flashStatusWord.u32ActualData);
    //    }
    //    else
    //    {
    //        // printf("Sector erase successful.\n");
    //    }
    }

    选项 1

    使用编写 API  Fapi_issueDataOnly512ProgrammingCommand

    #pragma CODE_SECTION(write32ByteProgWord, ".TI.ramfunc");
    Fapi_StatusType write32ByteProgWord( uint32_t address, uint16_t *pdata, uint16_t wsize  )
    {
        Fapi_StatusType fstatus;
        uint32_t finalAdd = 0;
        uint8_t index = 0;
    
        for ( index = 0; index < wsize/32; index++ )
        {
            // Clears status of previous Flash operation
            ClearFSMStatus();
    
            Fapi_setupBankSectorEnable(FLASH_WRAPPER_PROGRAM_BASE+FLASH_O_CMDWEPROTA, 0x00000000);
            Fapi_setupBankSectorEnable(FLASH_WRAPPER_PROGRAM_BASE+FLASH_O_CMDWEPROTB, 0x00000000);
    
            while(Fapi_Status_FsmReady != Fapi_checkFsmForReady( ))
            {
                ; /* be here only till FSM state is not ready */
            }
    
            finalAdd = address+(index*2);
            IPC_claimFlashSemaphore(IPC_FLASHSEM_OWNER_CPU1);
            EALLOW;
            fstatus = Fapi_issueDataOnly512ProgrammingCommand( (uint32_t*)finalAdd,
                                                    pdata+(index*2),
                                                    wsize);
            IPC_releaseFlashSemaphore();
            if (fstatus != Fapi_Status_Success)
            {
                // Handle error
                while(1);
            }
            Fapi_flushPipeline( );
            while(Fapi_Status_FsmReady != Fapi_checkFsmForReady( ))
            {
                ; // wait
            }
        }
    
    
    
        return fstatus;
    }

    选项 2.

    使用编写 API Fapi_issueProgrammingCommand

    Fapi_StatusType writeProgWord( uint32_t address, uint16_t *pdata, uint16_t wsize  )
    {
        Fapi_StatusType fstatus;
        uint32_t finalAdd = 0;
        uint8_t index;
    
        for ( index = 0; index < (wsize/2); index++ )
        {
            // Clears status of previous Flash operation
            ClearFSMStatus();
    
            Fapi_setupBankSectorEnable(FLASH_WRAPPER_PROGRAM_BASE+FLASH_O_CMDWEPROTA, 0x00000000);
            Fapi_setupBankSectorEnable(FLASH_WRAPPER_PROGRAM_BASE+FLASH_O_CMDWEPROTB, 0x00000000);
    
            while(Fapi_Status_FsmReady != Fapi_checkFsmForReady( ))
            {
                ; /* be here only till FSM state is not ready */
            }
    
            finalAdd = address+(index*2);
            fstatus = Fapi_issueProgrammingCommand( (uint32_t*)finalAdd,
                                                    pdata+(index*2),
                                                    1,
                                                    NULL,
                                                    0,
                                                    Fapi_DataOnly );
            //__enable_interrupts();  // Enables global interrupts
            if (fstatus != Fapi_Status_Success)
            {
                // Handle error
                while(1);
            }
            Fapi_flushPipeline( );
            while(Fapi_Status_FsmReady != Fapi_checkFsmForReady( ))
            {
                ; // wait
            }
        }
        return fstatus;
    }

    此致、

    Bhavin P

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    尊敬的 Bhavin:

    发出编程命令并等待 FSM 状态从繁忙状态更改后、您是否可以使用 Fapi_getFsmStatus () API 检查 STATCMD 寄存器的值是否等于 3? 为此、您可以参考 C2000Ware SDK 中的闪存编程示例。

    此外、是否启用了预取? 您可以尝试禁用它吗?

    是否禁用了 ECC 模块? 否则需要对其进行编程 — 您可以使用 Fapi_Auto EccGeneration 而不是 Fapi_Data Only 来完成此操作。

    此致、

    Alex

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好 Alex、

    我将尝试使用  Fapi_getFsmStatus () API。  

    我有几个关于 ECC 行为和闪存编程模式的问题。

    在初始化期间、我根据 E2E 的建议禁用了 ECC 模块、尽管我在禁用该模块之前也遇到了问题。 您可以参考 闪存初始化 之前共享的代码 I。

    更新为 :当我 Fapi_issueProgrammingCommand() 与一起使用时  Fapi_AutoEccGeneration或者、 Fapi_issueAutoEcc512ProgrammingCommand()闪存编程工作正常  而无需手动写入 ECC 值 。 我曾尝试根据示例代码手动编写 ECC、但后来将其删除。

    然而,我注意到一个奇怪的行为:

    • 使用  Fapi_issueProgrammingCommand()  Fapi_AutoEccGeneration看来、这是一个问题  必须写入 8 个字节(4 个字/64 位)  但使用了  仅限 Fapi_Data  模式、它允许写入  2 个字(32 位) 、 但 在这种情况下编程的值是不正确的、正如我在初始查询中提到的那样。

    问题:

    1. 为什么会这样  Fapi_DataOnly 在字对齐和数据正确性方面、模式的行为有所不同?
    2.  Fapi_issueProgrammingCommand() 与配合使用时预期会出现这种行为  Fapi_DataOnly 消耗量   Fapi_issueDataOnly512ProgrammingCommand() API?
    3. 确切的功能  启用预取  在这种情况下会做什么、它会影响这种行为吗?
    4. 如果我们使用 Fapi_Auto EccGeneration 不要手动写入 ECC 值、那么 API 会在某处写入 ECC 值吗? 在使用之前、是否应该知道任何限制?   

    如果能深入了解这些 API 的预期使用模式或限制、将会很有帮助。

    消息流  Fapi_issueProgrammingCommand () API 程序正确

    Fapi_StatusType writeProgWord( uint32_t address, uint16_t *pdata, uint16_t wsize  )
    {
        Fapi_StatusType fstatus;
        uint32_t finalAdd = 0;
        uint8_t index;
    
        for ( index = 0; index < (wsize/4); index++ )
        {
            // Clears status of previous Flash operation
            ClearFSMStatus();
    
            Fapi_setupBankSectorEnable(FLASH_WRAPPER_PROGRAM_BASE+FLASH_O_CMDWEPROTA, 0x00000000);
            Fapi_setupBankSectorEnable(FLASH_WRAPPER_PROGRAM_BASE+FLASH_O_CMDWEPROTB, 0x00000000);
    
            while(Fapi_Status_FsmReady != Fapi_checkFsmForReady( ))
            {
                ; /* be here only till FSM state is not ready */
            }
    
            //finalAdd = address+(4+index*2);
            fstatus = Fapi_issueProgrammingCommand( (uint32_t*)address+((index*2)),
                                                    pdata+(index*4),
                                                    4,
                                                    NULL,
                                                    0,
                                                    Fapi_AutoEccGeneration );
            if (fstatus != Fapi_Status_Success)
            {
                // Handle error
                while(1);
            }
            Fapi_flushPipeline( );
            while(Fapi_Status_FsmReady != Fapi_checkFsmForReady( ))
            {
                ; // wait
            }
        }
    
        return fstatus;
    }

    消息流  Fapi_issueAutoEcc512ProgrammingCommand () API 程序正确

    Fapi_StatusType write32ByteProgWord( uint32_t address, uint16_t *pdata, uint16_t wsize  )
    {
        Fapi_StatusType fstatus;
        uint32_t finalAdd = 0;
        uint8_t index = 0;
    
        for ( index = 0; index < wsize/32; index++ )
        {
            // Clears status of previous Flash operation
            ClearFSMStatus();
    
            Fapi_setupBankSectorEnable(FLASH_WRAPPER_PROGRAM_BASE+FLASH_O_CMDWEPROTA, 0x00000000);
            Fapi_setupBankSectorEnable(FLASH_WRAPPER_PROGRAM_BASE+FLASH_O_CMDWEPROTB, 0x00000000);
    
            while(Fapi_Status_FsmReady != Fapi_checkFsmForReady( ))
            {
                ; /* be here only till FSM state is not ready */
            }
    
            finalAdd = address+(index*2);
            IPC_claimFlashSemaphore(IPC_FLASHSEM_OWNER_CPU1);
            EALLOW;
    //        fstatus = Fapi_issueDataOnly512ProgrammingCommand( (uint32_t*)finalAdd,
    //                                                pdata+(index*2),
    //                                                wsize);
            fstatus = Fapi_issueAutoEcc512ProgrammingCommand( (uint32_t*)finalAdd,
                                                    pdata+(index*2),
                                                    wsize);
    
    
            IPC_releaseFlashSemaphore();
            if (fstatus != Fapi_Status_Success)
            {
                // Handle error
                while(1);
            }
            Fapi_flushPipeline( );
            while(Fapi_Status_FsmReady != Fapi_checkFsmForReady( ))
            {
                ; // wait
            }
        }
    
    
    
        return fstatus;
    }

    此致、

    Bhavin P

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    尊敬的 Bhavin:

    1.通过自动 ECC 生成,在每个编程命令期间计算 ECC 位并将其与您的数据一起写入闪存。 每 64 位闪存都有 8 位相应的 ECC。 因此、如果您尝试单独对两个连续的 32 位值进行编程、则会出现编程错误、因为闪存状态机尝试重新编程 ECC 值而未先将其擦除。 但是、当使用 DataOnly 时、不会写入 ECC 值、因此这种特定的限制不适用。 在不进行擦除的情况下、一个闪存字线可以发出的最大编程操作数(128 字节)也存在第二个限制、因此建议在 64 位段中进行编程。

    2.预计不会有错误的回读。

    3.预取启用闪存预取缓存,这可能允许 CPU 直接绕过读取闪存以解决这些有问题的值。 我想测试是否强制 CPU 发出完整闪存读取。 为此、请禁用闪存预取和闪存数据缓存。

    4、是的、ECC 值将自动写入闪存 ECC 区域。 这里的限制是您必须写入至少 64 位偏移量。

    您可以查看 C2000Ware SDK 中的闪存编程示例、了解所有这些函数的示例用法。 这些代码位于 C2000Ware\driverlib\f28p65x\examples\c28x_dual\flash 下。

    此致、

    Alex

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好 Alex、

    感谢您提供详细答案。  需要一些澄清来消除一些疑虑。

    1.下面是这个 MCU 的特定数据表中的 ECC 区域、它似乎超出了所有扇区地址范围? 这意味着、如果我们利用每个银行的所有 128 个扇区、即使不会与 ECC 区域发生冲突、我的回答是正确的吗?  

    2. 你在你的最后尝试了 仅数据  模式? 如果是并且得到了正确的结果、您是否会分享您的程序以在我结束时进行验证?

    3.我尝试禁用预取,但在执行后  Flash_disablePrefetch () CPU 进入未知区域、但不出来。 我将其放在读取操作之前、还在写入操作之前进行了尝试。 以下是供参考的代码。

         writeInFlash(ADDRESS_BANK_1,&comm_data_buf[0],sizeof(comm_data_buf));
    
         //writeECC(( ADDRESS_BANK_1 ), &ecc_data_buf[0], 4);
    
         cs_from_flash_data = Fapi_calculateFletcherChecksum((uint16_t *)(ADDRESS_BANK_1),COMM_IN_BUF_SIZE);
         Flash_disablePrefetch(FLASH0CTRL_BASE);
         pReadMem = &read16bitData(ADDRESS_BANK_1);
         memcpy((uint16_t*)read_data,(const uint16_t*)pReadMem,(size_t)COMM_IN_BUF_SIZE);
         cs_after_read_from_flash = Fapi_calculateFletcherChecksum((uint16_t *)read_data,COMM_IN_BUF_SIZE);

    4.我想在使用时看到自动 ECC 值 Fapi_Auto EccGeneration 模式、但 在进入调试模式时在内存浏览器视图中看不到。

    此致、

    Bhavin P

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    尊敬的 Bhavin:

    可以、ECC 是闪存的一个单独区域、与 MAIN 区域不冲突。

    2.是的,你可以看到下面的测试结果。 SDK 中的闪存编程示例执行与您在这里测试的操作(编程顺序数据)相同的操作。

    3.必须从在 RAM 中运行的代码禁用闪存预取。

    4. 您可能必须修改.gel 文件才能包含此区域。

    除了禁用预取之外、我认为一个更简单的测试是从 SDK 修改 flashapi_cpu1_128bit编 程示例、我附加了一个添加了回读循环的文件。 将闪存编程示例中的.c 文件替换为此文件、并在 Example_Call FlashAPI 中的循环后设置断点。 是否会出现相同的问题?

    e2e.ti.com/.../flashapi_5F00_cpu1_5F00_128bitprogramming.c

    此致、

    Alex

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好 Alex、

    很抱歉晚回复。 我现在使用的是 ECC 自动生成、但仍需要使用仅数据选项进行检查。 我将继续更新。

    此致、

    Bhavin P