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.

[参考译文] TMS320F280039C:配置固件更新引导模式

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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1423186/tms320f280039c-configuring-firmware-update-boot-mode

器件型号:TMS320F280039C

工具与软件:

对闪存编程后、我无法启动进入固件更新引导模式。  有几件事我想确认一下、看看我是否漏掉了任何东西。

 

我 已经按照建议配置了 DCSM 区域1标头、也就是

- 1个引导引脚

- GPIO22

-带 LFU 闪存0x80000、0x90000、0xA00000的 BOOTDEF0
- BOOTDEF1 SCI SCIATX=GPIO29、SCIARX=GPIO28

在以下示例中、我们决定将应用程序入口点设为0x92000 (表示存储体1)、因此我们已按如下所示设置链接器命令文件:

 


小程序

begin:origin = 0x00092000、length =
0x00000002

BOOT_RSVD:origin = 0x00000002、length =
0x00000126

RAMM0:origin = 0x00000128、length =
0x000002D8

RAMM1:origin = 0x00000400、length =
0x000003F8

// RAMM1_RSVD:origin = 0x000007F8、length =
0x00000008 /*保留、请勿使用
对于代码、请参阅勘误公告
"存储器:在有效存储器之外进行预取"*/

/*

RAMLS0:origin = 0x00008000、length =
0x00000800

RAMLS1:origin = 0x00008800、length =
0x00000800

RAMLS2:origin = 0x00009000、length =
0x00000800

RAMLS3:origin = 0x00009800、length =
0x00000800

RAMLS4:origin = 0x0000A000、length =
0x00000800

RAMLS5 : origin = 0x0000A800, length =
0x00000800

RAMLS6:origin = 0x0000B000、length =
0x00000800

RAMLS7:origin = 0x0000B800、length =
0x00000800

*/

RAMLSx:origin = 0x00008000、length =
0x00004000

RAMGS0:origin = 0x0000C000、length =
0x00001000

RAMGS1:origin = 0x0000D000、length =
0x00001000

RAMGS2:origin = 0x0000E000、length =
0x00001000

RAMGS3 : origin = 0x0000F000, length =
0x00000FF8

// RAMGS3_RSVD:origin = 0x0000FFF8、length =
0x00000008 /*保留、请勿使用
对于代码、请参阅勘误公告
"存储器:在有效存储器之外进行预取"*/

BootROM:origin = 0x003F8000、length =
0x00007FC0

secure_rom:origin = 0x003F2000、length =
0x00006000

复位:origin = 0x003FFFC0、length =
0x00000002

/*闪存扇区*/

/*组0 */

FLASH_BANK0_SEC0:origin = 0x080000、length =
0x001000

FLASH_BANK0_SEC1:origin = 0x081000、length =
0x001000

FLASH_BANK0_sec2:origin = 0x082000、length =
0x001000

FLASH_BANK0_SEC3:origin = 0x083000、length =
0x001000

FLASH_BANK0_SEC4:origin = 0x084000、length =
0x001000

FLASH_BANK0_SEC5:origin = 0x085000、length =
0x001000

FLASH_BANK0_SEC6:origin = 0x086000、length =
0x001000

FLASH_BANK0_sec7:origin = 0x087000、length =
0x001000

FLASH_BANK0_SEC8:origin = 0x088000、length =
0x001000

FLASH_BANK0_SEC9:origin = 0x089000、length =
0x001000

FLASH_BANK0_SEC10:origin = 0x08A000、length =
0x001000

FLASH_BANK0_SEC11:origin = 0x08B000、length =
0x001000

FLASH_BANK0_SEC12:origin = 0x08C000、length =
0x001000

FLASH_BANK0_SEC13:origin = 0x08D000、length =
0x001000

FLASH_BANK0_SEC14:origin = 0x08E000、length =
0x001000

FLASH_BANK0_SEC15:origin = 0x08F000、length =
0x001000

/*组1 */

Flash_BANK1_SEC0:origin = 0x090000、length =
0x001000

Flash_BANK1_SEC1:origin = 0x091000、length =
0x001000

FLASH_Bank1_sec2_15:origin = 0x92002、length =
0x00DFFE


/*组2 */

FLASH_Bank2_SEC0:origin = 0x0A0000、length =
0x001000

FLASH_Bank2_SEC1:origin = 0x0A1000、length =
0x001000

Flash_Bank2_sec2:origin = 0x0A2000、length =
0x001000

FLASH_Bank2_SEC3:origin = 0x0A3000、length =
0x001000

FLASH_Bank2_SEC4:origin = 0x0A4000、length =
0x001000

FLASH_Bank2_SEC5:origin = 0x0A5000、length =
0x001000

FLASH_Bank2_SEC6:origin = 0x0A6000、length =
0x001000

Flash_Bank2_sec7:origin = 0x0A7000、length =
0x001000

FLASH_Bank2_SEC8:origin = 0x0A8000、length =
0x001000

FLASH_Bank2_SEC9:origin = 0x0A9000、length =
0x001000

FLASH_Bank2_SEC10:origin = 0x0AA000、length =
0x001000

FLASH_Bank2_SEC11:origin = 0x0AB000、length =
0x001000

FLASH_Bank2_SEC12:origin = 0x0AC000、length =
0x001000

FLASH_Bank2_SEC13:origin = 0x0AD000、length =
0x001000

FLASH_Bank2_SEC14:origin = 0x0AE000、length =
0x001000

FLASH_Bank2_SEC15:origin = 0x0AF000、length =
0x000FF0

// FLASH_BANK0_SEC15_RSVD:origin = 0x0AFFF0、length =
0x000010 /*保留、请勿使用
对于代码、请参阅勘误公告
"存储器:在有效存储器之外进行预取"*/

}

部分中)

codestart :> beging, align(8)

.text:>FLASH_BANK1_SEC2_15、ALIGN (8)

.cinit:> FLASH_BANK1_SEC1、ALIGN (8)

.switch:> FLASH_BANK1_SEC1、ALIGN (8)

.reset :> RESET , TYPE = DSECT /*
未使用、*/

.stack :> RAMM1.

/*重要提示:FreeRTOS 静态分配的堆栈应仅分配给此段*/

freertosStaticStack :>> RAMM1.
| RAMM0
| RAMLSx

/*重要提示:FreeRTOS 堆应仅作为 C28x 堆栈分配给此段

只能在低64k RAM 内存中分配内存。 */

.freertosHeap :> RAMLSx
| RAMGS0

#if defined (_TI_EABI__)

init_array :> flash_bank1_SEC1, align (8)

.bss :> RAMLSx

.bss:output :> RAMLSx

bss:cio :> RAMLSx

.data :> RAMLSx

.sysmem :> RAMLSx

.const:> FLASH_BANK1_SEC2_15、ALIGN (8)

#else

.pinit:> FLASH_BANK1_SEC1、ALIGN (8)

.ebss :> RAMLSx

.esysmem :> RAMLSx

.cio :> RAMLSx

econst:> FLASH_BANK1_SEC2_15、ALIGN (8)

#endif

ramgs0 :> ramgs0

Ramgs1 :> RAMGS0

/*分配 IQ 数学区域:*/

IQMath:> FLASH_BANK1_SEC1、ALIGN (8)

IQmathTables :> FLASH_BANK1_SEC2_15, ALIGN (8)

相关

.TI.ramfunc

} LOAD = FLASH_BANK1_SEC1、

RUN = RAMLSx、

Load_start (RamfuncsLoadStart)、

Load_Size (RamfuncsLoadSize)、

Load_End (RamfuncsLoadEnd)、

RUN_START (RamfuncsRunStart)、

RUN_SIZE (RamfuncsRunSize)、

RUN_END (RamfuncsRunEnd)、

对齐(8)

DataBufferSection :> RAMM1, ALIGN(8)

}

-l FAPI_F28003x_EABI_v1.58.10.lib

 

我们使用了 HEX2000构建工具 -b. 以二进制格式输出的选项。  附加的是生成的.map 和.bin 文件。  我假设.bin 文件是要从0x91000 (组1)进行编程的连续字节流、因为我们将.cinit 定义为从链接器文件中的组1扇区1开始、而 codestart 会重定位为0x92000。

 

成功完成闪存编程后、我们使用0x92000写入应用入口点(0x90000)、使用0x5A5A5A5A 写入有效密钥(0x9000A)、使用版本号的补码写入固件版本(0x9000C)。  请参阅下面的屏幕截图以了解最终结果。

 

 

在此步骤之后、固件将启用看门狗并进入死区环路以等待看门狗复位。

 

即使所有这些、它也不会启动到新固件中。  我们希望寻求您的建议、了解我们可以查找哪些内容以进行进一步的故障排除。

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

    您好、Yi

    如果我理解正确、您将使用1个引导模式选择引脚设置系统、并在固件更新引导和 SCI 引导之间进行选择。

    1.您的设置如下所示。 对吗?

    设置 BOOTPIN_CONFIG。 将 BMSP0更改为用户指定的 GPIO、例如 GPIO22的0x16

    设置 BOOTPIN_CONFIG。 BMSP1到0xFF

    设置 BOOTPIN_CONFIG。 BMSP2到0xFF

    设置 BOOTPIN_CONFIG。 对于引导 ROM、此位的 KEY 为0x5A、这样才能将这些寄存器位视为有效并使用自定义引导表

    设置 BOOTDEF。 BOOTDEF0至0x0B、用于固件更新引导(入口点为0x80000、0x90000、0xA0000)。 这会将固件更新引导设置为引导表索引0。

    设置 BOOTDEF。 BOOTDEF1至0x01以支持 SCI 引导。 这将 SCI 引导设置为引导表索引1。

    您是否实际上已经对 BOOTDEF 进行编程、或者您是否使用了仿真等效项 EMU-BOOTDEF?

    2.接下来、您要将 GPIO22设置为0、以启用固件更新引导、正确吗?

    3.接下来、0x9000A 处有有效的密钥。  我想在0x8000A 和0xA000A、您没有有效密钥。 对吗?

    4.接下来、您是否检查了系统的行为-如果您在0x92000处放置了一个断点、它会出现在那里?

    5.接下来、在0x92000处、您有 codestart、所以我假设您在这里有 codestartbranch.asm 中的函数、该函数调用_c_int00 (它是调用 main ()的 C 初始化例程)? 在 codestart 的实现中、我们通常在这里禁用安全装置、调用_c_int00、然后在需要时在 main ()的用户代码内重新启用安全装置。

    谢谢!

    SIRA