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.

[参考译文] RM44L920:CAN 引导加载程序-将 Magic Number 写入 FlashBank7不起作用

Guru**** 2387080 points
Other Parts Discussed in Thread: RM44L920, HALCOGEN
请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1042573/rm44l920-can-bootloader---writing-magic-number-to-flashbank7-not-working

器件型号:RM44L920
主题中讨论的其他器件: HALCOGEN

我在 RM46 XL2 LaunchPad 上执行此操作、并使用 RM44L920在生产板上执行此操作、但我更改了某个内容(不知道是什么;尽管我从 v9迁移到 CCS v10)、RM44版本不再将值0x5A5A5A5A 写入位置0xF020F000。  

引导加载程序(BL)通过 JTAG 加载到生产板上、没有问题、CAN 更新看起来很顺利。  由于在更新结束时未修改0xF020F000存储器位置、芯片返回 BL。 我可以修改 主机更新 程序代码中的运行地址、并在发生复位或重启之前运行应用程序、但这并不是很有用。

我添加了一行 ,通过 CAN 发送 Fapi_UpdateStatusProgram()的结果,它返回0,表示写入没有错误。

在 RM44电路板上进行更新后、唯一一个包含0x5A5A5A5A 的存储器位置是0xF0404F44、但我认为这只是巧合。 0xF020F000仍然显示0xFFFFFFFF。

除了 BL_link.cmd 之外、所有源文件/头文件都在引导加载程序的 RM44和 RM46版本之间共享、其中 RAM /闪存大小存在差异。 我已经对照检查了 HALCoGen 项目、并确保 RM44版本与闪存部分中的 RM46版本相匹配。

该 zip 文件包含链接器命令文件、经过重命名以指示其使用的变体、bl_link.h 头文件以及一个包含图像的文档、其中显示了 RM46的正确闪存写入结果、以及包含 RM44的0x5A5A5A5A 的唯一存储器位置。

e2e.ti.com/.../RM44_5F00_v_5F00_RM46.zip

如果对我可能遗漏的内容有任何想法,我将不胜感激。 在 HALCoGen 或项目设置中、我可能缺少一些愚蠢的小东西、以防止写入该位置。

谢谢!

-Tom

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

    您好、Tom、

    RM44Lx 上的 EEPROM 与 RM46Lx 上的 EEPROM 不同。 RM44Lx 有16个扇区、每个扇区为4KB。 RM46Lx 有4个扇区、每个扇区为16KB。

    0xF0404F44是0x4F44*8=0x27A20处闪存内容的 ECC 值(闪存扇区7)。

    您能否在 BL 中共享 Fapi_UpdateStatusProgram()的源代码?

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

    我正在检查 RM44项目中的任何可能选择 ECC 的位置。

    这是所有 BL 变体共享的 Fapi_UpdateStatusProgram()源。

    uint32_t Fapi_UpdateStatusProgram(uint32_t Flash_Start_Address, uint32_t Data_Start_Address, uint32_t Size_In_Bytes)
    {
        register uint32_t src = Data_Start_Address;
        register uint32_t dst = Flash_Start_Address;
        unsigned int bytes;
    
        if (Size_In_Bytes < 16)
            bytes = Size_In_Bytes;
        else
            bytes = 16;
    
        Fapi_setActiveFlashBank(Fapi_FlashBank7);
        Fapi_enableEepromBankSectors(0xFFFFFFFF,0xFFFFFFFF);
    
    //            Fapi_enableMainBankSectors(0xFFFF);
    
        Fapi_issueAsyncCommandWithAddress(Fapi_EraseSector, (uint32 *) APP_STATUS_ADDRESS);
        while(Fapi_checkFsmForReady() != Fapi_Status_FsmReady){}
    
        while( FAPI_CHECK_FSM_READY_BUSY != Fapi_Status_FsmReady );
        while(FAPI_GET_FSM_STATUS != Fapi_Status_Success);
    //            Fapi_issueAsyncCommand(Fapi_ClearStatus);
        Fapi_issueProgrammingCommand((uint32_t *)dst,
                                    (uint8_t *)src,
                                    (uint8_t) bytes,
                                    NULL,
                                    0,
    //                              Fapi_DataOnly);
                                    Fapi_AutoEccGeneration);
    
        while( Fapi_checkFsmForReady() == Fapi_Status_FsmBusy );
        while(FAPI_GET_FSM_STATUS != Fapi_Status_Success);
        while(FLASH_CONTROL_REGISTER->FmStat.FMSTAT_BITS.BUSY == Fapi_Status_FsmBusy);
    
        // Adding this to detect error in write
        if (FLASH_CONTROL_REGISTER->FmStat.u32Register != 0) {
            return (1);
        }
    
        return (0);
    }
    

    一如既往、感谢您的帮助!

    -Tom

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

    我从去年开始绘制笔记、并(再次)发现我是如何使其首次工作的。 感谢上帝、我有一段时间做了很好的笔记。

    "     今天再看一下、    调试 器注意      到`Fapi_issueProgramming Command`的返回值 为 12、  这表示 `Fapi_Error_ASYNC_IncorrectDataBufferLength`。   在         `μ s`的传递值后、 我 将 该 值硬编码 为 4   、它起作用。  我  不知道  它 为什么起作用, 但 它 确实起作用"。

    因此、我再次硬编码`字节= 4;`、它返回正常工作状态。 我没有看、但这可能意味着没有写入代码长度等、只写入0x5A5A5A5A。  

    我仍然想了解这种修复的原因、如果有其他方法可以解决、但现在我要继续。

    -Tom

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

    您好、Tom、

    ECC 在64位对齐地址上计算得出、地址最高为组的数据宽度(对于 RM44x 为128位)。 未提供的数据被视为0xFF。 如果仅提供4个字节的数据(0x5A5A5A5A)、 则将写入0x5A5A5A5A5AFFFFFFF、并计算该8个字节数据的 ECC。  

    您可以将"字节"指定为4、8、2等