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.

[参考译文] EK-TM4C123GXL:实现用户引导加载程序

Guru**** 2482225 points


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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/724753/ek-tm4c123gxl-implementation-of-user-bootloader

器件型号:EK-TM4C123GXL

大家好:

我 的用户引导加载程序项目切换到 应用程序项目时遇到问题。

有人可以帮助我吗? 谢谢

My App 项目随 TI-RTOS 一起运行

应用项目.cmd

入口点符号:"_c_int00" 地址:00003501

内存
{
闪存(RX):origin = 0x00000000,length = 0x0003d800
SRAM (rwx):origin = 0x20000000,length = 0x00008000
}//



段中的段分配
{
.text:> FLASH
.const:> FLASH
.cinit:>闪存
.pinit:> FLASH
init_array:> FLASH

.data :> SRAM
.bss:> SRAM
.sysmem:> SRAM
.stack:> SRAM
} 

引导加载程序 projcet .cmd

入口点符号:"_c_int00" 地址:0003dd7d

#define APP_BASE 0x0003d800
#define RAM_BASE 0x20000000

//系统内存映射*/

MEMORY
{
/*存储在内部闪存中并从内部闪存执行的应用程序*/
闪存(RX):origin = app_BASE,length = 0x00002800
/*应用程序使用内部 RAM 进行数据*/
SRAM (rwx):origin = 0x20000000,length = 0x00008000
}//



段中的段分配
{
.intvecs:> app_base
.text:> FLASH
.const:> FLASH
.cinit:>闪存
.pinit:> FLASH
init_array:> FLASH

.vtable:> RAM_base
.data :> SRAM
.bss:> SRAM
.sysmem:> SRAM
.stack:> SRAM
}

__stack_top =__stack + 512; 

如何切换这些项目?

以下是我的代码、但不起作用

void
JumpToBootLoader (void)
{

//
//禁用所有处理器中断。 而不是禁用它们
//一次一个,直接写入 NVIC 即可禁用所有功能
//外设中断。
//
HWREG (NVIC_DIS0)= 0xffffffff;
HWREG (NVIC_DIS1)= 0xffffffff;

//
//将控制权返回给引导加载程序。 这是对 SVC 的调用
//引导加载程序中的处理程序。
//
(*(void (*)(void))(*(uint32_t *) 0x0003dd7d)));
} 
void
JumpToBootLoader (void)
{
//
//禁用所有处理器中断。 而不是禁用它们
//一次一个,直接写入 NVIC 即可禁用所有功能
//外设中断。
//
HWREG (NVIC_DIS0)= 0xffffffff;
HWREG (NVIC_DIS1)= 0xffffffff;

//
//将控制权返回给引导加载程序。 这是对 SVC 的调用
//引导加载程序中的处理程序。
//
(*(void (*)(void))(*(uint32_t *) 0x00003501)))();
} 

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

    第二个 JumpToBootLoader 使用0x00003501、但您只有从0x00000000到0x00002800的空间。

    请仔细检查.cmd 文件设置和引导加载程序调用。

    如果需要到达0x00003501、则需要扩展为第二个项目保留的代码空间大小。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、Ralph:

    感谢您的回复。

    我重新定义.cmd 文件。 并修改我的跳转函数、但仍然跳转到错误的地址。

    下面是我的新设置。

    引导加载程序 projcet .cmd

    入口点符号:"_c_int00" 地址:0003dd79

    #define APP_BASE 0x00000000
    #define RAM_BASE 0x20000000
    #define BOOT_BASE 0x0003d800
    //系统存储器映射*/
    
    MEMORY
    {
    /*存储在内部闪存中并从内部闪存执行的应用程序*/
    闪存(RX):origin = boot_BASE,length = 0x00002800
    /*应用程序使用内部 RAM 进行数据*/
    SRAM (rwx):origin = 0x20000000,length = 0x00008000
    
    APP_FLASH:origin = APP_base,length = 0x0003d800
    }
    
    //内存
    
    中的段分配*/ SECTIONS
    {
    .intvecs:> boot_base
    .text:> FLASH
    .const:> FLASH
    .cinit:>闪存
    .pinit:> FLASH
    init_array:> FLASH
    
    .vtable:> RAM_base
    .data :> SRAM
    .bss:> SRAM
    .sysmem:> SRAM
    .stack:> SRAM
    }
    
    __stack_top =__stack + 512; 

    app projcet .cmd

    入口点符号:"_c_int00" 地址:00003501

    内存
    {
    闪存(RX):origin = 0x00000000,length = 0x0003d800
    SRAM (rwx):origin = 0x20000000,length = 0x00008000
    BOOT_FLASH:origin = 0x0003d800,length = 0x00002800
    }
    
    //内存
    
    中的段分配*/ SECTIONS
    {
    .text:> FLASH
    .const:> FLASH
    .cinit:>闪存
    .pinit:> FLASH
    init_array:> FLASH
    
    .data :> SRAM
    .bss:> SRAM
    .sysmem:> SRAM
    .stack:> SRAM
    } 

    应用程序跳转至引导加载程序(我的应用程序项目与 TI-RTOS 一起运行、并且我添加了 System_atexit、BIOS_exit 函数)

    System_atexit( JumpToBootLoader );
    BIOS_exit (0);

    void
    JumpToBootLoader (int val)
    {
    
    //
    //禁用所有处理器中断。 而不是禁用它们
    //一次一个,直接写入 NVIC 即可禁用所有功能
    //外设中断。
    //
    HWREG (NVIC_DIS0)= 0xffffffff;
    HWREG (NVIC_DIS1)= 0xffffffff;
    
    //
    //将控制权返回给引导加载程序。 这是对 SVC 的调用
    //引导加载程序中的处理程序。
    //
    (*(void (*)(void))(*(uint32_t *) 0x0003dd79)))();
    } 

    但我的 CCS 会显示此消息。 (没有"0xce5188f6"可用的源)  

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好!
    为什么不使用基于 ROM 的引导加载程序?? 调用 ROMupdateUART()会更容易。
    此致、
    Digvijay
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好 Digijay:

    我的 Uart0具有其他功能、无法更改。

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

    您好、Ralph:

    我参考以下问题已成功跳转至引导加载程序工程(无 TI-RTOS 工程)

    HWREG (NVIC_vtable)= 0x0003d800;
    _asm (" LDR R1、[r0]\n"
    " mov sp、r1");
    
    _asm (" LDR r0、[r0、#4]\n"
    " bx r0\n"); 

    但是、使用相同的方法无法从引导加载程序跳转到应用程序项目(TI-RTOS)。

    NVIC VTABLE 是否是 TI-RTOS 项目的不同地址?

    以下是我的代码、但不起作用。

    HWREG (NVIC_vtable)= 0x00000000;
    _asm (" LDR R1、[r0]\n"
    " mov sp、r1");
    
    _asm (" LDR r0、[r0、#4]\n"
    " bx r0\n"); 

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    参考问题
    e2e.ti.com/.../1256191
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    尊敬的 Andy:

    我不确定、但我会有 RTOS 专家对此发表评论。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、Ralph:

    我成功跳转到了应用项目(TI-RTOS 项目)

    下面是我的代码。

    感谢你的帮助。

    HWREG (NVIC_DIS0)= 0xffffffff;
    HWREG (NVIC_DIS1)= 0xffffffff;
    HWREG (NVIC_DIS2)= 0xffffffff;
    HWREG (NVIC_DIS3)= 0xffffffff;
    HWREG (NVIC_DIS4)= 0xffffffff;
    
    _asm (" movw r0、#0x0000;"
    "movt r0、#0x0000;");
    //"LDR SP、[r0、#0];"
    //"LDR PC、[r0、#4];"
    
    _asm (" LDR R1、[r0]\n"
    " mov sp、r1");
    
    _asm (" LDR r0、[r0、#4]\n"
    " bx r0\n");