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.

[参考译文] TMS320F280025C:将闪存地址上的数据覆盖为0x0000

Guru**** 2418170 points


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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1116709/tms320f280025c-overwrite-data-at-a-flash-address-to-0x0000

器件型号:TMS320F280025C

您好!

我已经通过 CAN 实现了一个 DFU、其中引导加载程序会检查应用报头是否正确(密钥)。 要启动 DFU、应用应将标头修改为0x0000、这样

引导加载程序注意到、固件需要更新。 我实现了一个小程序来测试是否可以使用 Fapi_issueProgrammingCommand()覆盖某些闪存数据,但覆盖过程总是失败,并显示0x48错误:

    /////////////////////////////////////////////////////////////////////////////////////////////////////Reset Flash header
    //Init flash first:
    initFlashSectors();
    EALLOW;

    uint16_t miniBuffer1[4] = {0x0000};
    uint16_t miniBuffer2[4] = {0x0000};

    miniBuffer1[0] = 0x46ab;
    miniBuffer1[1] = 0x17c4;
    miniBuffer1[2] = 0x1289;
    miniBuffer1[3] = 0x3ffe;
    //////////////////////////////////////////////////////////////////////////////////////////////////////Write first to flash header

    Fapi_issueProgrammingCommand((uint32_t *) 0x0008F000, miniBuffer1,
                    sizeof(miniBuffer1), 0, 0, Fapi_AutoEccGeneration);

    while (Fapi_checkFsmForReady() != Fapi_Status_FsmReady){};

    Fapi_FlashStatusType oFlashStatus = Fapi_getFsmStatus();

    //////////////////////////////////////////////////////////////////////////////////////////////////////Write to zero now


    Fapi_issueProgrammingCommand((uint32_t *) 0x0008F000, miniBuffer2,
                    sizeof(miniBuffer2), 0, 0, Fapi_AutoEccGeneration);

    while (Fapi_checkFsmForReady() != Fapi_Status_FsmReady){};

    oFlashStatus = Fapi_getFsmStatus();
    EDIS;

    /////////////////////////////////////////////////////////////////////////////////////////////////////Reset Flash header

    if(oFlashStatus) //Error occured
    {
        while(1)
        {
            //
            // Delay
            //
            GPIO_togglePin(34);
            DEVICE_DELAY_US(1e5);
    //        GPIO_togglePin(31);
        }
    }
    else
    {
        while(1) //No error occured
        {
            //
            // Delay
            //
            GPIO_togglePin(31);
            DEVICE_DELAY_US(1e6);
    //        GPIO_togglePin(31);
        }
    }

如何在不擦除扇区的情况下修改特定闪存区域的数据(当然是0x0000、否则它将不起作用)?

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

    您好、Sebestian、

    一旦您将闪存位置与 ECC 一起编程、您将无法在不擦除的情况下再次修改这些内容。

    如果您有其他问题、请告诉我。

    谢谢、此致、

    Vamsi