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.

[参考译文] RM46L852:尝试使用 CAN 引导加载程序更新引导加载程序本身会导致闪存擦除挂起。

Guru**** 2394075 points


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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/844431/rm46l852-attempting-to-use-can-bootloader-to-update-the-bootloader-itself-cause-a-hang-on-flash-erase

器件型号:RM46L852

我正在尝试使用引导加载程序本身更新引导加载程序。 我的代码基于 spna189.zip 示例代码。 我的引导加载程序可以在引导加载程序之后更新软件、而不会出现任何问题、但当我尝试启用引导加载程序更新并更新引导加载程序本身时、代码在擦除步骤时崩溃、我已经按照 其他文章的建议更新了链接器命令中的段代码、 并更改了对 Fapi_enableMainBankSectors 的调用(0xFFFF);  

我还会错过什么?

我的链接器文件

/*内存映射*/

存储器

引导程序(X):origin=0x00000000 length=0x00000020
Flash_API (RX):origin=0x00000020 length=0x00003FE0
FLASHBOOT (RX):origin=0x00012000 length=0x00012000
堆栈(RW):origin=0x08000000 length=0x00002000
RAM (RW):origin=0x08002000 length=0x0003E000

/*用户代码开始(2)*/
//闪存中的提供程序配置区域。 用于配置 IP 地址、
//子网掩码、默认网关、MAC 地址和设备 ID
//由引导加载程序使用。
Provider_CFG_and_STATUS (RW):origin=0x00004000 length=0x00008000
/*用户代码结束*/

/*用户代码开始(3)*/
/*用户代码结束*/


/*------------------ *
/*段配置*/


部分

.intvecs:{}>向量
闪存 API:

../Debug_HDK/src/Fapi_UserDefinedFuncations.obj (.text)
../Debug_HDK/src/BL_flash.obj (.text)
../Debug_HDK/src/BL_dCAN.obj (.text)
../Debug_HDK/src/BL_flash.obj (.const)
//../Debug_HDK/src/uartstdio.obj (.text)

--library=./../lib/F021_API_CortexR4_LE.lib (.text)
}load = flash_API、run = RAM、load_start (api_load)、run_start (api_run)、size (api_size)
.text:{}> FLASHBOOT
.const:{}> FLASHBOOT
.cinit:{}> FLASHBOOT
.pinit:{}> FLASHBOOT
.bss:{}> RAM
.data :{}> RAM
.sysmem:{}>RAM

/*用户代码开始(4)*/
/*用户代码结束*/

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

    您好 Casey、

    要更新引导加载程序本身、您必须将当前引导加载程序复制到 SRAM 并从 SRAM 执行它。 示例引导加载程序仅将 F021闪存 API 相关函数和变量复制到 SRAM。

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

    我该怎么做? 为了使链接器命令文件正常工作、我必须在该文件中采取哪些不同的措施?

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

    您好!

    您需要修改链接器 cmd 文件来定义加载地址和运行地址。 然后将这些段复制到 main()中的 RAM 中

    1.链接器 CMD 文件:  

    /*段配置*/
    部分

    intvecs:{} load=FLASH0, run=RAM, load_start(load0),run_start(run0),size (size0)
    .text:{}load=FLASH0、run=RAM、load_start (load1)、run_start (run1)、size (Size1)
    .const:{} load=FLASH0, run=RAM, load_start(load2),run_start(run2),size (size2)
    .cinit:{}load=FLASH0、run=RAM、load_start (load3)、run_start (run3)、size (size3)
    .pinit:{} load=FLASH0, run=RAM, load_start(load4),run_start(run4),size (size4)

    .bss:{}> RAM
    .data :{}> RAM
    .sysmem:{}>RAM

    fee_text_section:{}load=FLASH0、run=RAM、load_start (load5)、run_start (run5)、size (size5)
    fee_const_section:{} load=FLASH0, run=RAM, load_start(load6),run_start(run6),size (size6)
    fee_data_section:{}> RAM
    /*用户代码开始(4)*/
    /*用户代码结束*/

    2.主函数()

    /*将闪存 API 复制到 SRAM*/
    memcpy (&run0、&load0、(uint32)&size0);
    memcpy (&run1、&load1、(uint32)&Size1);
    memcpy (&run2、&load2、(uint32)&size2);
    memcpy (&run3、&load3、(uint32)&size3);
    memcpy (&run4、&load4、(uint32)&size4);
    memcpy (&run5、&load5、(uint32)&size5);
    memcpy (&run6、&load6、(uint32)&size6);

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

    这使我的启动正确、但我仍然遇到链接器文件问题、以及我在编译期间遇到的错误:

    --retain="*(.intvecs)"
    
    /*用户代码开始(1)*/
    /*用户代码结束*/
    
    /*----------------- */
    /*内存映射 */
    
    MEMORY
    {
    矢量 (x) :origin=0x00000000 length=0x00000020
    Flash_API (RX):origin=0x00000020 length=0x00003FE0
    FLASHBOOT (RX):origin=0x00012000 length=0x00012000
    堆栈 (RW):origin=0x08000000 length=0x00002000
    RAM (RW):origin=0x08002000 length=0x0003E000
    
    //用户代码开始(2)*/
    //闪存中的提供程序配置区域。 用于配置 IP 地址、
    //子网掩码、默认网关、MAC 地址和设备 ID
    //由引导加载程序使用。
    提供程序_CFG_and_STATUS (RW):origin=0x00004000 length=0x00008000
    //*用户代码结束*/
    }
    
    /*用户代码开始(3)*/
    /*用户代码结束*/
    
    
    /*--------- */
    /*段配置 */
    
    SECTIONS
    {
    .intvecs :{}> vectors
    flashAPI :
    {
    ../Debug_HDK/src/Fapi_UserDefinedFuncations.obj (.text)
    --library=./../lib/F021_API_CortexR4_LE.lib (.text)
    }load = flash_API、run = RAM、load_start (api_load)、run_start (api_run)、size (api_size)
    for _rts_decompress{
    rtsv7R4_T_le_v3D16_eabi.lib (.text:解压缩:none)
    rtsv7R4_T_le_v3D16_eabi.lib (.text)
    rtsv7R4_T_le_v3D16_eabi.lib (.text)
    rtsv7R4_T_le_v3D16_eabi.lib (.text)
    rtsv7R4_T_le_v3D16_eabi.lib (.text)
    }> FLASHBOOT
    bootLoadCore:
    {
    *(.text)
    *(.const)
    }load=FLASHBOOT、run=RAM、load_start (load0)、run_start (run0)、size (size0)
    .cinit:{}> FLASHBOOT
    .pinit:{}> FLASHBOOT
    .bss :{}> RAM
    .data :{}>RAM
    .sysmem :{}>RAM
    
    
    
    /*用户代码开始(4)*/*
    用户代码结束*/
    } 

    生成的编译如下所示:


    "./sys_link_boot_debug_hdk.cmd"、第47行:错误#10099-D:程序不能放入可用内存中。 ".intvecs"段大小为0x20时定位失败。 可用存储器范围:
    向量大小:0x20未使用:0x20最大孔:0x20
    错误#10010:链接期间遇到错误;未构建"RM46_Can.out"

    >>编译失败

    如果我尝试将您列出的所有内容放入 RAM 中、我会遇到各种各样的错误、这会导致我发布一篇文章、建议使用的行  

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

    我能够让它使用命令链接器文件的变体、如下所示:

    部分
    {
    .intvecs:{}>向量
    for_rts_decompress{
    rtsv7R4_T_le_v3D16_eabi.lib (.text:解压缩:none)
    rtsv7R4_T_le_v3D16_eabi.lib (.text)
    rtsv7R4_T_le_v3D16_eabi.lib (.text)
    rtsv7R4_T_le_v3D16_eabi.lib (.text)
    rtsv7R4_T_le_v3D16_eabi.lib (.text)}>
    FLASHBOOT
    flashAPI:
    {
    ../Debug_HDK/src/Fapi_UserDefinedFuncations.obj (.text)
    ../Debug_HDK/src/BL_flash.obj (.text)
    ../Debug_HDK/src/BL_flash.obj (.const)
    ../Debug_HDK/src/hw_sci.obj (.text)
    ../Debug_HDK/src/BL_dCAN.obj (.text)
    //../Debug_HDK/src/hw_dcan.obj (.const)
    ../Debug_HDK/src/uartstdio.obj (.text)
    ../Debug_HDK/src/ssci_common.obj (.text)
    --library=./../lib/F021_API_CortexR4_LE.lib (.text)
    --library= rtsv7R4_T_le_v3D16_eabi.lib (.text)
    }load = flash_API、run = RAM、load_start (api_load)、run_start (api_run)、size (api_size)
    .text:{}> FLASHBOOT
    .const:{}> FLASHBOOT
    .cinit:{}> FLASHBOOT
    .pinit:{}> FLASHBOOT
    .bss :{}> RAM
    .data :{}>RAM
    .sysmem :{}>RAM
    
    
    /*用户代码开始(4)*/*
    用户代码结束*/
    }
    

    我尝试了如上所述的操作、但失败了。 基本上、我必须将程序的各个部分和运行时放入 RAM 中。

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

    我找到了该错误的来源、上面的链接器文件不能确保 sys_startup.obj 位于闪存中、它需要是因为它是副本所在的位置、所以我执行了以下操作:

    SECTIONS
    {
    .intvecs:{}> VECTOR_rts_decompress
    {
    rtsv7R4_T_le_v3D16_eabi.lib (.text:decompress:none)
    rtsv7R4_T_le_v3D16_eabi.lib (.text)
    rtsv7R4_T_le_v3D16_eabi.lib (.text)
    rtsv7R4_T_le_v3D16_eabi.lib (.text)
    rtsv7R4_T_le_v3D16_eabi.lib (.text)
    ./Debug_HDK/source/sys_startup.obj (.text)
    }> FLASHBOOT
    flashAPI:
    {
    ./Debug_HDK/source/Fapi_UserDefinedFunctions.obj (.text)
    -library=./../lib/F021_API_CortexR4_LE.lib (.text)
    }load = flash_API、run = RAM、load_size
    
    (load_start)、.api_size (bl =.st_load (.st_start)、.api_load =.api_load (.st_load =.st_start)
    {}load = FLASHBOOT、run = RAM、load_start (const_load)、run_start (const_run)、size (const_size)
    .cinit:{}load = FLASHBOOT、run = RAM、load_start (cinit_load)、run_start (meIT_run)、size (pinst_load:{}
    
    s = pinst_load
    、.st_load =.rram (pinst_load)、.st_load:{s = tinRAM:}.st_load =.st_load:
    {}> RAM
    
    /*用户代码开始(4)*/*
    用户代码结束*/
    } 

    并将副本复制到 RAM、这是我在中做的第一件事  

    void _c_int00 (void)
    {
    
    /*用户代码开始(5)*//
    _copyAPI 2RAM_();
    memcpy (&API_run、&API_load、(uint32_t)&API_size);
    memcpy (&BL_run、&BL_load、(uint32_t)&BL_size);
    memcpy (&cinit_run、&cinit_load、(uint32_t)&cinit_size);
    
    memcpy (&Pinit_run、&Pinit_load、(uint32_t)&Pinit_size);
    memcpy (&const_run、&const_load、(uint32_t)&const_size);
    //用户代码结束*
    

    现在、我的代码可以正常工作、链接器命令文件的复杂程度也降低了一点。

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

    感谢您的更新。 我将关闭此主题。