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.

[参考译文] RM48L952:RM48L952引导加载程序在写入 application_code 闪存存储器后不会跳转到应用程序代码。

Guru**** 2482105 points
Other Parts Discussed in Thread: UNIFLASH

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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/696744/rm48l952-rm48l952-bootloader-is-not-jumping-to-application-code-after-writing-application_code-code-flash-memory

器件型号:RM48L952
主题中讨论的其他器件:UNIFLASH

您好!

 

编写 application_code Flash 存储器后、引导加载程序不会跳转到应用程序代码、这是我们面临的问题。

描述:

1) 1)引导加载程序代码存储在 FLASH1 -0x00180000中

2) 2)应用程序代码存储在 FLASH0 -0x00000000中

 

首先、我们将引导加载程序加载到控制器、然后使用 UNIFLASH、然后使用引导加载程序加载.hex (应用代码)

 

当我们从串行端口发出引导命令时、应用程序代码正在运行时

我们将禁用所有中断、然后跳转到引导加载程序地址0x00180000

使用指针((void (*)(void)) 0x00180000);然后启动加载程序代码运行并要求确认闪存擦除、然后发送应用程序代码的.hex 文件

写入应用程序代码后,我们将使用 systemREG1->SYSECR = 0x00;/*全局系统重置*/进行重置

应用程序代码首次运行 app1.hex 文件刷写、如果我们再次刷写、则运行相同的 app1.hex 应用程序代码

如果我们更改应用程序代码、引导加载程序会将闪存 App2.hex 代码写入0x00000000地址、不会发生软复位、应用程序不会运行。

我们尝试使用((void (*)(void)) 0x00000000)();在加载 App2.hex 文件时、要从引导加载程序跳转到应用程序代码、仍然面临问题

我们在禁用所有安全功能的情况下尝试了应用程序代码、但问题仍然相同。

 

引导加载程序固件 link.cmd 文件内容如下:

/*链接器设置                                                          */

--retain="*(.intvecs)"

/*内存映射                                                               */

存储器

/*用户代码开始(2)*/

  引导程序(X):origin=0x00000000 length=0x00000020

  FLASH0 (RX):origin=0x00000020 length=0x0017FFE0

  Vectors_1 (RX):origin=0x00180000 length=0x00000020

  FLASH1 (RX):origin=0x00180020 length=0x0017FFE0

  堆栈(RW):origin=0x08000000 length=0x00001500

  RAM    (RW):origin=0x08001500 length=0x0003eb00

/*用户代码结束*/

 

/*段配置                                                    */

部分

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

.intvecs :{}>向量

               USER_FLASH_SECTION:{}> vectors_1  /* bootloader vector codes*/

 

  .text  :{}> FLASH1

  .const  :{}>FLASH1

  .cinit  :{}>FLASH1

  .pinit  :{}>FLASH1

  .bss    :{}> RAM

  .data  :{}> RAM

               .sysmem:{}>RAM

/*用户代码结束*/

 

应用代码 link.cmd 文件内容如下:

/*链接器设置                                                          */

--retain="*(.intvecs)"

/*内存映射                                                               */

存储器

/*用户代码开始(2)*/

  引导程序(X):origin=0x00000000 length=0x00000020

  FLASH0 (RX):origin=0x00000020 length=0x0017FFE0

  FLASH1 (RX):origin=0x00180000 length=0x00180000

  堆栈(RW):origin=0x08000000 length=0x00001500

  RAM    (RW):origin=0x08001500 length=0x0003EB00

/*用户代码结束*/

/*段配置                                                    */

部分

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

  .intvecs:{}>向量

  .text  :{}> FLASH0

  .const  :{}>FLASH0

  .cinit  :{}> FLASH0

  .pinit  :{}> FLASH0

  .bss    :{}> RAM

  .data  :{}> RAM

               .sysmem:{}>RAM

/*用户代码结束*/

 

应用程序代码的 sys_intvecs.asm 文件内容如下:

 

  .sect ".intvecs"

  ARM

;------------------------------------------------------------------

;中断例程的导入引用

 

  .ref _c_int00

  .ref _dabort

  .ref phantomInterrupt

  .def resetEntry

;------------------------------------------------------------------

;中断向量

 

resetEntry

      b  _c_int00

UndefEntry

      b  未定义尝试

svcEntry

      b  svcEntry

PrefetchEntry

      B  prefetchEntry

      b  _dabort

      b  相位中断

      LDR PC、[PC、#-0x1b0]

      LDR PC、[PC、#-0x1b0]

;----------------------------------------------------------------

 

请告诉我们上述问题是否存在以及导致应用程序代码无法第二次运行的原因。

 

谢谢、此致、

Murali Prasad

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

    我是时候看到应用程序被放置在闪存的第一个扇区、而引导加载程序位于闪存的中间。 好主意。

    cmd 文件对我来说看起来很好。

    app1和 app2的大小是否相同? 如果 app1大于 App2、例如 app1采用3个扇区、而 App2仅使用2个扇区。 当引导加载程序将 App2编程为 flash0时、引导加载程序只能擦除扇区1和 sector2、扇区3不能擦除。 sector3中其余的 app1代码可能会影响您的 app1的执行。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好、Wang、

    感谢您的回答。

    App1大小为174 KB ((1、78、622字节)、APP2大小为174 KB (1、78、744字节)、大小几乎相同。 引导加载程序擦除0x00180000 (组0至组14)的完整 FLASH0、其中应用程序代码将在擦除后写入。

    谢谢、此致、
    Murali Prasad
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我们还面临另一个问题、如果注释一行代码、那么我们将在编译它时对其进行注释。
    即使我们尚未启用/禁用已更改代码中的中断、矢量表内容也会发生更改。

    我们将生成 Hex 文件、Intel Hex 文件格式

    App1.hex:20 0000 00 0547 00EA FEFF FFEA FEFF FFEA FEFF FFEA 4547 00EA D548 00EA B0F1 1FE5 B0F1 1FE5 31
    App2.hex:20 0000 00 1E47 00EA FEFF FFEA FEFF FFEA FEFF FFEA 5E47 00EA EE48 00EA B0F1 1FE5 B0F1 1FE5 E6


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

    您是否解决了应用问题? 我认为不将引导加载程序放置在第一个扇区的一个缺点是、如果在闪存擦除期间发生任何异常、代码将会消失。 之后、您将无法再次运行引导加载程序(无异常矢量表)。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好、Wang、

    问题仍然存在。 当编译代码时、应用代码发生微小变化、只需在应用代码中断矢量表中添加延迟、就会发生变化、正如我在上一篇文章中提到的那样。

    谢谢、此致、
    Murali Prasad