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.

TMS320F280049C: F280049 bootloader 升级后不能复位

Part Number: TMS320F280049C
Other Parts Discussed in Thread: LAUNCHXL-F280049C

你好专家︰

最近在参考这篇文章在做F280049的二次bootloader。 开发版是用LAUNCHXL-F280049C评估板。

https://www.ti.com.cn/cn/lit/an/zhcadf7/zhcadf7.pdf?ts=1714136546245&ref_url=https%253A%252F%252Fwww.google.com%252F


我跟据了文章中指Bootloader和 APP Code的flash要分开,flash地址上没有重叠。也跟据了文章中提出Bootloader和 APP Code的entry point要分开(Bootloader的入口地址为0x80000,F280049 default entry point,App Code 我選用了 0x85000)
升级的过程也顺利,Bootloader能够利用Flash API成功写入需要升级的App code和成功跳进App code的地址( 0x85000) (App code我是使用闪灯的程序),成功運行App code (闪灯)

问题就是,当每一次顺利升级后,F280049不能复位回至bootloader 的程序,而是复位后会回到App code的程序。我曾经尝试用lanuchpad上的reset键和在App code 里用看门狗复位也都只会复位回到App code (闪灯)。只能把lanuchpad断电后重新上电,F280049才会回到boot loader 程序。

我理解如果reset后(0x3FFFC0)F280049起机应该会回到0x80000地址运行bootloader 的程序,但不知道为什么结果会是运行App code。

不知道是否

1. 复位后能进入bootloader 程序,但程序依旧卡左上次跳进App code的地址的位置以致进入了App code
2. 不能成功复位

附上bootloader .cmd档案

Fullscreen
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
MEMORY
{
PAGE 0 :
/* BEGIN is used for the "boot to Flash" bootloader mode */
BEGIN : origin = 0x080000, length = 0x000002
RAMM0 : origin = 0x0000F6, length = 0x00030A
RAMGS0 : origin = 0x00C000, length = 0x002000
RAMGS1 : origin = 0x00E000, length = 0x002000
RAMGS2 : origin = 0x010000, length = 0x002000
RAMGS3 : origin = 0x012000, length = 0x001FF8
RAMLS0 : origin = 0x008000, length = 0x000800
RAMLS1 : origin = 0x008800, length = 0x000800
RAMLS2 : origin = 0x009000, length = 0x000800
RAMLS3 : origin = 0x009800, length = 0x000800
RAMLS4 : origin = 0x00A000, length = 0x000800
RESET : origin = 0x3FFFC0, length = 0x000002
/* Flash sectors */
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

和app code 的 .cmd档案

Fullscreen
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
MEMORY
{
PAGE 0 :
/* BEGIN is used for the "boot to Flash" bootloader mode */
BEGIN : origin = 0x085000, length = 0x000002
//FLASH_BANK0_APP : origin = 0x085002, length = 0x002FFE
RAMM0 : origin = 0x0000F6, length = 0x00030A
RAMLS0 : origin = 0x008000, length = 0x000800
RAMLS1 : origin = 0x008800, length = 0x000800
RAMLS2 : origin = 0x009000, length = 0x000800
RAMLS3 : origin = 0x009800, length = 0x000800
RAMLS4 : origin = 0x00A000, length = 0x000800
//RESET : origin = 0x3FFFC0, length = 0x000002
/* Flash sectors */
/* BANK 0 */
//FLASH_BANK0_SEC0 : origin = 0x080002, length = 0x000FFE /* bootloader use */
//FLASH_BANK0_SEC1 : origin = 0x081000, length = 0x001000 /* bootloader use */
//FLASH_BANK0_SEC2 : origin = 0x082000, length = 0x001000 /* bootloader use */
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

谢谢!
  • 各位好,

    是否可以回复一下这个问题?

  • 你好,我已解决了这个问题。

    问题是出于在bootloader firmware里部分的ram复位时没有清除所有静态储存变数 (SSV) 并初始化具有初始化程序的变数。 (我是参考这篇文章︰e2e.ti.com/.../tms320f28027f-clear-all-ram-contents- but-keep-auto-initialization-variable
    )

    所以MCU复位时,因为某些变数没有清除,bootloader firmware程序进入了错的状态机状态,导致复位后直接跳进0x85000。

    所以出现看似复位后没有进入bootlaoder firmware的假像。

    特别感谢Hang Yang 在线上线下的帮助,感激你在开发产品过程中提供的指导和支持,你耐心的解答帮助了我们很多。

    你的专业知识和耐心解答让我能够克服困难并取得进展。