主题中讨论的其他器件:TIDM-02011、 C2000WARE
您好、专家:
为了使用 CAN 接口、我修改了实时固件更新示例。
内核接收并刷写程序、不会出现任何问题。 当它完成时、看门狗被激活
但是、它不像预期的那样启动新加载的程序、而是跳到任何地方并被冻结。
如果我关闭并打开器件、则它开始运行新的程序 OK。
我不知道如何找出问题所在。
提前感谢您的参与、
费尔南多
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.
您好、专家:
为了使用 CAN 接口、我修改了实时固件更新示例。
内核接收并刷写程序、不会出现任何问题。 当它完成时、看门狗被激活
但是、它不像预期的那样启动新加载的程序、而是跳到任何地方并被冻结。
如果我关闭并打开器件、则它开始运行新的程序 OK。
我不知道如何找出问题所在。
提前感谢您的参与、
费尔南多
您好、Charles、
这是看门狗初始化的代码
// // Set the watchdog to generate a reset signal instead of an // interrupt signal // SysCtl_setWatchdogMode(SYSCTL_WD_MODE_RESET); // // Enable the watchdog // SysCtl_enableWatchdog(); //Wait the Timeout while(1) { };
这是我要加载到组1中的程序的链接器配置
MEMORY { BEGIN : origin = 0x09EFF0, length = 0x000002 BOOT_RSVD : origin = 0x00000002, length = 0x00000126 RAMM0 : origin = 0x00000128, length = 0x000002D8 RAMM1 : origin = 0x00000400, length = 0x000003F8 // RAMM1_RSVD : origin = 0x000007F8, length = 0x00000008 /* Reserve and do not use for code as per the errata advisory "Memory: Prefetching Beyond Valid Memory" */ RAMLS0_LS1_LS2 : origin = 0x00008000, length = 0x00001800 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 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 /* Reserve and do not use for code as per the errata advisory "Memory: Prefetching Beyond Valid Memory" */ BOOTROM : origin = 0x003F8000, length = 0x00007FC0 SECURE_ROM : origin = 0x003F2000, length = 0x00006000 RESET : origin = 0x003FFFC0, length = 0x00000002 /* Flash sectors */ /* BANK 0 */ FLASH_BANK0_SEC0 : origin = 0x080002, length = 0x000FFE FLASH_BANK0_SEC1 : origin = 0x081000, length = 0x001000 FLASH_BANK0_SEC2 : origin = 0x082008, length = 0x000FF8 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_11 : origin = 0x08A000, length = 0x002000 FLASH_BANK0_SEC12_13_14 : origin = 0x08C000, length = 0x002FF0 FLASH_BANK0_SEC15 : origin = 0x08EFF2, length = 0x000FFE /* BANK 1 */ FLASH_BANK1_SEC0 : origin = 0x090002, length = 0x000FFE FLASH_BANK1_SEC1 : origin = 0x091000, length = 0x001000 FLASH_BANK1_SEC2 : origin = 0x092008, length = 0x000FF8 FLASH_BANK1_SEC3 : origin = 0x093000, length = 0x001000 FLASH_BANK1_SEC4 : origin = 0x094000, length = 0x001000 FLASH_BANK1_SEC5 : origin = 0x095000, length = 0x001000 FLASH_BANK1_SEC6 : origin = 0x096000, length = 0x001000 FLASH_BANK1_SEC7 : origin = 0x097000, length = 0x001000 FLASH_BANK1_SEC8 : origin = 0x098000, length = 0x001000 FLASH_BANK1_SEC9 : origin = 0x099000, length = 0x001000 FLASH_BANK1_SEC10_11 : origin = 0x09A000, length = 0x002000 FLASH_BANK1_SEC12_13_14 : origin = 0x09C000, length = 0x002FF0 FLASH_BANK1_SEC15 : origin = 0x09EFF2, length = 0x000FFE /* BANK 2 */ FLASH_BANK2_SEC0 : origin = 0x0A0002, length = 0x000FFE FLASH_BANK2_SEC1 : origin = 0x0A1000, length = 0x001000 FLASH_BANK2_SEC2 : origin = 0x0A2008, length = 0x000FF8 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_11 : origin = 0x0AA000, length = 0x002000 FLASH_BANK2_SEC12_13_14 : origin = 0x0AC000, length = 0x002FF0 FLASH_BANK2_SEC15 : origin = 0x0AEFF2, length = 0x000FFE // FLASH_BANK0_SEC15_RSVD : origin = 0x0AFFF0, length = 0x000010 /* Reserve and do not use for code as per the errata advisory "Memory: Prefetching Beyond Valid Memory" */ CLA1_MSGRAMLOW : origin = 0x001480, length = 0x000080 CLA1_MSGRAMHIGH : origin = 0x001500, length = 0x000080 CLA_DMA_RAM : origin = 0x001680, length = 0x000080 DMA_CLA_RAM : origin = 0x001700, length = 0x000080 } SECTIONS { .cinit : > FLASH_BANK1_SEC9, ALIGN(4) .text : >>FLASH_BANK1_SEC2 | FLASH_BANK1_SEC3 | FLASH_BANK1_SEC4 | FLASH_BANK1_SEC5 | FLASH_BANK1_SEC6, ALIGN(4) codestart : > BEGIN, ALIGN(4) coeff_table : > FLASH_BANK1_SEC12_13_14, ALIGN(4) .stack : > RAMM1 .switch : > FLASH_BANK1_SEC9, ALIGN(4) #if defined(__TI_EABI__) .init_array : > FLASH_BANK1_SEC9, ALIGN(4) .bss : > RAMLS6 .bss:output : > RAMLS6 .bss:cio : > RAMLS6 .data : > RAMLS7 .sysmem : > RAMLS7 .const : > FLASH_BANK1_SEC9 ALIGN(4) #else .pinit : > FLASH_BANK1_SEC9 ALIGN(4) .ebss : >>RAMLS5 | RAMLS6 .esysmem : > RAMLS6 .cio : > RAMLS5 .econst : > FLASH_BANK1_SEC9 #endif ramgs0 : > RAMGS0 ramgs1 : > RAMGS1 .reset : > RESET, TYPE = DSECT /* not used, */ dclfuncs : > FLASH_BANK1_SEC9, ALIGN(4) #if !(CLA_MATH_TABLES_IN_ROM) // //Load tables to Flash and copy over to RAM // #if defined(__TI_EABI__) CLA1mathTables : LOAD = FLASH_BANK1_SEC9, RUN = RAMLS5, RUN_START(CLA1mathTablesRunStart), LOAD_START(CLA1mathTablesLoadStart), LOAD_SIZE(CLA1mathTablesLoadSize), PAGE = 1 #else CLA1mathTables : LOAD = FLASH_BANK1_SEC9, RUN = RAMLS5, RUN_START(_CLA1mathTablesRunStart), LOAD_START(_CLA1mathTablesLoadStart), LOAD_SIZE(_CLA1mathTablesLoadSize), PAGE = 1 #endif #endif #if defined(__TI_EABI__) /* CLA specific sections */ Cla1Prog : LOAD = FLASH_BANK1_SEC10_11, RUN = RAMLS0_LS1_LS2, LOAD_START(Cla1ProgLoadStart), RUN_START(Cla1ProgRunStart), LOAD_SIZE(Cla1ProgLoadSize), ALIGN(4) #else /* CLA specific sections */ Cla1Prog : LOAD = FLASH_BANK1_SEC10_11, RUN = RAMLS0_LS1_LS2, LOAD_START(_Cla1ProgLoadStart), RUN_START(_Cla1ProgRunStart), LOAD_SIZE(_Cla1ProgLoadSize), ALIGN(4) #endif Cla1ToCpuMsgRAM : > CLA1_MSGRAMLOW CpuToCla1MsgRAM : > CLA1_MSGRAMHIGH #if defined(__TI_EABI__) .TI.ramfunc : LOAD = FLASH_BANK1_SEC9, RUN = RAMLS5 LOAD_START(RamfuncsLoadStart), LOAD_SIZE(RamfuncsLoadSize), LOAD_END(RamfuncsLoadEnd), RUN_START(RamfuncsRunStart), RUN_SIZE(RamfuncsRunSize), RUN_END(RamfuncsRunEnd), ALIGN(4) #else .TI.ramfunc : LOAD = FLASH_BANK1_SEC9, RUN = RAMLS5 LOAD_START(_RamfuncsLoadStart), LOAD_SIZE(_RamfuncsLoadSize), LOAD_END(_RamfuncsLoadEnd), RUN_START(_RamfuncsRunStart), RUN_SIZE(_RamfuncsRunSize), RUN_END(_RamfuncsRunEnd), ALIGN(4) #endif .scratchpad : > RAMLS3 .bss_cla : > RAMLS3 Cla1DataRam : > RAMLS4 cla_shared : > RAMLS3 CLADataLS1 : > RAMLS3 Cla_To_Dma : > CLA_DMA_RAM Dma_To_Cla : > DMA_CLA_RAM #if defined(__TI_EABI__) .const_cla : LOAD = FLASH_BANK1_SEC2, RUN = RAMLS4, RUN_START(Cla1ConstRunStart), LOAD_START(Cla1ConstLoadStart), LOAD_SIZE(Cla1ConstLoadSize), ALIGN(4) #else .const_cla : LOAD = FLASH_BANK1_SEC2, RUN = RAMLS4, RUN_START(_Cla1ConstRunStart), LOAD_START(_Cla1ConstLoadStart), LOAD_SIZE(_Cla1ConstLoadSize), ALIGN(4) #endif } /* //=========================================================================== // End of file. //=========================================================================== */
内核加组选择代码位于 BANK0中、具有此链接器配置
// // Keep the _bankSelect symbol // -u bankSelect MEMORY { BEGIN : origin = 0x00080000, length = 0x0000004c BOOT_RSVD : origin = 0x00000002, length = 0x00000126 RAMM0 : origin = 0x00000128, length = 0x000002D8 RAMM1 : origin = 0x00000400, length = 0x00000380 /* on-chip RAM block M1 */ BOOT_RSVD_SYSBIOS: origin = 0x00000780, length = 0x00000080 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 RAMGS0 : origin = 0x0000C000, length = 0x00001000 RAMGS1 : origin = 0x0000D000, length = 0x00001000 RAMGS2 : origin = 0x0000E000, length = 0x00001000 RAMGS3 : origin = 0x0000F000, length = 0x00001000 BOOTROM : origin = 0x003F8000, length = 0x00007FC0 SECURE_ROM : origin = 0x003F2000, length = 0x00006000 RESET : origin = 0x003FFFC0, length = 0x00000002 /* Flash sectors */ // // Allocate space for the liveDFU function in bank 0 // BANK0_SEC1 : origin = 0x081000, length = 0x000017 /* BANK 0 */ FLASH_BANK0_SEC0 : origin = 0x08004C, length = 0x000FB4 FLASH_BANK0_SEC1 : origin = 0x081017, length = 0x000FE9 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 /* BANK 1 */ FLASH_BANK1_SEC0 : origin = 0x090000, length = 0x001000 FLASH_BANK1_SEC1 : origin = 0x091000, length = 0x001000 FLASH_BANK1_SEC2 : origin = 0x092000, length = 0x001000 FLASH_BANK1_SEC3 : origin = 0x093000, length = 0x001000 FLASH_BANK1_SEC4 : origin = 0x094000, length = 0x001000 FLASH_BANK1_SEC5 : origin = 0x095000, length = 0x001000 FLASH_BANK1_SEC6 : origin = 0x096000, length = 0x001000 FLASH_BANK1_SEC7 : origin = 0x097000, length = 0x001000 FLASH_BANK1_SEC8 : origin = 0x098000, length = 0x001000 FLASH_BANK1_SEC9 : origin = 0x099000, length = 0x001000 FLASH_BANK1_SEC10 : origin = 0x09A000, length = 0x001000 FLASH_BANK1_SEC11 : origin = 0x09B000, length = 0x001000 FLASH_BANK1_SEC12 : origin = 0x09C000, length = 0x001000 FLASH_BANK1_SEC13 : origin = 0x09D000, length = 0x001000 FLASH_BANK1_SEC14 : origin = 0x09E000, length = 0x001000 FLASH_BANK1_SEC15 : origin = 0x09F000, length = 0x001000 /* BANK 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 = 0x001000 } SECTIONS { codestart : > BEGIN, ALIGN(8) .text : >> FLASH_BANK0_SEC0 |FLASH_BANK0_SEC1 , ALIGN(8) .cinit : > FLASH_BANK0_SEC1, ALIGN(8) .switch : > FLASH_BANK0_SEC0, ALIGN(8) .reset : > RESET, TYPE = DSECT /* not used, */ .stack : > RAMM1 #if defined(__TI_EABI__) .init_array : > FLASH_BANK0_SEC0, ALIGN(8) .bss : > RAMLS5 .bss:output : > RAMLS3 .bss:cio : > RAMLS0 .data : > RAMLS5 .sysmem : > RAMLS5 .const : > FLASH_BANK0_SEC0, ALIGN(8) #else .pinit : > FLASH_BANK0_SEC0, ALIGN(8) .ebss : > RAMLS5 .esysmem : > RAMLS5 .cio : > RAMLS0 .econst : > FLASH_BANK0_SEC0, ALIGN(8) #endif ramgs0 : > RAMGS0 ramgs1 : > RAMGS0 .TI.ramfunc : LOAD = FLASH_BANK0_SEC0, RUN = RAMLS0, LOAD_START(RamfuncsLoadStart), LOAD_SIZE(RamfuncsLoadSize), LOAD_END(RamfuncsLoadEnd), RUN_START(RamfuncsRunStart), RUN_SIZE(RamfuncsRunSize), RUN_END(RamfuncsRunEnd), ALIGN(8) LDFU_BANK0 : > BANK0_SEC1, ALIGN(8) }
正如我解释过的、当新程序完成闪存时、LED 会关闭、因此我假设是这样
看门狗会引起复位、但不会启动新程序、处理器会停止
如果我关闭并打开微控制器、则开始正常工作
此致、
费尔南多
费尔南多
请提供一些详细信息:
您从何处获得了用作开发起点的 F28003x 的 SCI 闪存内核? 要使用的正确内核位于 TIDM-02011解决方案示例文件夹中的 DigitalPowerSDK v4.01.00.00中。
C2000Ware_DigitalPower_SDK_4_01_00_00\solutions\TIDM_02011\f28003x\examples\flash
上述版本与 C2000Ware v4.01中的内容在 projectspec 以及 FLASH_kernel_ex3_ldfu.c 中存在一些差异。
此外、您将需要在 flash_kernel_ex3_ldfu.c 中定义宏 lfu_with _reset、这将触发看门狗。 默认情况下、该示例设置为在不复位器件的情况下运行 LFU。
因此、请使用 DigitalPowerSDK v4.01中的闪存内核、而不是 C2000Ware v4.01。
谢谢、
Sira
您好!
我已将所有更改包含在您提到的更新示例中。 它仍然执行相同的操作。 当它完成刷写新程序时、它会被冻结。
一个特别的事情是、我在使用 JTAG 刷写内核后立即开始更新过程、而不会关闭和打开器件。
如果在使用 JTAG 刷写内核后、我打开和关闭器件、然后运行更新过程、则微控制器复位正常。 新程序
开始正常运行。 这一事实可能会让您了解正在发生的情况。
此致、
费尔南多
费尔南多
我对您的案例中的问题场景有点困惑。 那么、让我来描述一下对我来说是可行的步骤(在您的情况下、串行/SCI 将被替换为 CAN):
1.使用 LFU_ITH_RESET 构建闪存内核(LDFU_BANK0和 LDFU_BAN1构建配置)
2.使用 CCS 将 SCI 闪存内核 LDFU_BANK0闪存至组0。 执行会转到 bankSelect()函数。 点击"Run"。 然后、使用命令提示符向所需的应用文件(目标为 BANK1)发出串行闪存编程器命令。 出现命令菜单。 发出 LFU 命令(8)。 该应用程序编程到组1。
3.断开目标。 使用一个只擦除必需闪存扇区的不同目标配置文件(CCXML)。 连接到目标 、并使用 CCS 将 SCI 闪存内核 LDFU_BANK1刷新到 BANK1。 执行进入 main()。 点击"Run"。 然后、使用命令提示符向所需的应用文件(目标为 Bank0)发出串行闪存编程器命令。 出现命令菜单。 发出 LFU 命令(8)。 该应用程序编程到 Bank0。
4.断开目标。 现在、两个闪存组都有闪存内核和应用程序。
5.重置设备。 Bank0上的应用现已激活。
6.现在,您可以使用 命令提示符使用所需的应用程序文件(目标为 BANK1)发出串行闪存编程器命令。 出现命令菜单。 发出 LFU 命令(8)。 该应用程序编程到组1。 WD 复位将自动发生、Bank1上的应用将自动开始运行。 现在、您可以根据需要多次重复此乒乓步骤、而无需使用 CCS 或手动复位器件。
谢谢、
Sira
您好,Sira,
感谢你的帮助。
我期望应用 程序在执行步骤2后立即开始运行、而不应用复位。
但是、只有在 完成第二步后关闭并打开器件、它才会启动。
如果 我在刷写内核后以及在将应用程序加载到组1之前复位微控制器、
然后、程序通过 CAN 完成刷写过程后、立即开始直接运行。
我希望这能解释我 所期望的内容。 如果无法避免这种复位、这是可以的、我们将考虑到这一点
制造工艺的影响
此致
费尔南多
好的、现在我了解了。
我认为这是因为在步骤2中、您已经连接了调试器、因此当 WD 复位发生时、执行会转到引导 ROM、其中标识了调试器已连接、因此它不会引导到常规的闪存引导入口点。
如果您阅读的是 F28003x TRM 的4.6.2、则会看到一些相关的详细信息。
如果在对闪存内核进行编程后重置器件、调试器将断开连接、因此如果您运行 LFU 命令并对应用程序进行编程、则会发生 WD 重置、引导 ROM 引导至闪存引导入口点(bankSelect())、您的应用程序将运行。
谢谢、
Sira