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.

[参考译文] TMS320F28P650DK:从引导加载程序区域跳转到应用程序区域后的中断工作。

Guru**** 2553450 points
Other Parts Discussed in Thread: TMS320F28P650DK, C2000WARE

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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1343264/tms320f28p650dk-interrupt-work-after-jump-to-app-area-from-bootloader-area

器件型号:TMS320F28P650DK
主题中讨论的其他器件: C2000WARE

您好、专家

  我 在调试有关 TMS320F28P650DK 芯片的第二个引导加载程序功能时遇到问题。  项目可以在引导加载程序区域中正常工作、而中断函数在跳转到应用程序区域后无法工作。 和其他外设模块(例如:CLA、CAN、ePWM)在应用区域初始化后可以正常工作。 顺便说一下、中断函数可以在引导加载程序区域中正常运行。

我想中断矢量表配置不正确。 但我无法找到 原因。  

引导加载程序区域起始地址为0x80000、应用程序区域起始地址为0x86000。

引导加载程序项目的 CMD 如下:

//闪存配置

内存
{
begin:origin = 0x080000、length = 0x000002 //根据需要更新 codestart 位置

BOOT_RSVD:origin = 0x000002、length = 0x0001AF /* M0的一部分,引导 ROM 将此用于堆栈*/
RAMM0:origin = 0x0001B1、length = 0x00024F
RAMM1:origin = 0x000400、length = 0x000400

RAMD0:origin = 0x00C000、length = 0x002000
RAMD1:origin = 0x00E000、length = 0x002000
RAMD2:origin = 0x01A000、length = 0x002000 //可映射至 CPU1或 CPU2。 配置为 CPU2时、请使用地址0x8000。 用户应根据核心选择来注释/取消注释
RAMD3:origin = 0x01C000、length = 0x002000 //可被映射至 CPU1或 CPU2。 配置为 CPU2时、请使用地址0xA000。 用户应根据核心选择来注释/取消注释
RAMD4:origin = 0x01E000、length = 0x002000 //可映射至 CPU1或 CPU2。 配置为 CPU2时、请使用地址0xC000。 用户应根据核心选择来注释/取消注释
RAMD5:origin = 0x020000、length = 0x002000 //可以映射到 CPU1或 CPU2。 配置为 CPU2时、请使用地址0xE000。 用户应根据核心选择来注释/取消注释

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
RAMLS5 : origin = 0x00A800 , length = 0x000800
RAMLS6:origin = 0x00B000、length = 0x000800
RAMLS7:origin = 0x00B800、length = 0x000800
RAMLS8:origin = 0x022000、length = 0x002000 //配置为 CLA 程序时使用地址0x4000
RAMLS9:origin = 0x024000、length = 0x002000 //当被配置为 CLA 程序时使用地址0x6000

// RAMLS8_CLA:origin = 0x004000、length = 0x002000 //仅在配置为 CLA 程序存储器时使用
// RAMLS9_CLA:origin = 0x006000,length = 0x002000 //仅在配置为 CLA 程序存储器时使用

RAMGS0:origin = 0x010000、length = 0x002000
RAMGS1:origin = 0x012000、length = 0x002000
RAMGS2:origin = 0x014000、length = 0x002000
RAMGS3:origin = 0x016000、length = 0x002000
RAMGS4:origin = 0x018000,length = 0x002000

/*闪存组(每个128个扇区)*/
/*FLASH_BANK0:origin = 0x080002,length = 0x1FFFE //可以映射到 CPU1或 CPU2。 用户应根据核心选择来注释/取消注释
*/
/*引导加载程序区域*/
FLASH_BANK0_SEC_0_3:origin = 0x080002、length = 0xFFE、/*片上闪存*/
FLASH_BANK0_SEC_4_23:origin = 0x081000、length = 0x5000、/*片上闪存*/

/* CLA 面积*/
/*FLASH_BANK0_SEC_16_39:origin = 0x084000、length = 0x6000、*//*片上闪存*/
/*FLASH_BANK0_SEC_16_23:origin = 0x085000,length = 0x1000,*/

/*BSS 区域*/
FLASH_BANK0_SEC_24_31:origin = 0x086000、length = 0x2000、/*片上闪存*/

/*文本区域*/
FLASH_BANK0_SEC_32_55:origin = 0x088000、length = 0x6000、/*片上闪存*/

FLASH_BANK0_SEC_56_63:origin = 0x08E000、length = 0x2000、/*片上闪存*/
FLASH_BANK0_SEC_64_71:origin = 0x090000、length = 0x2000、
FLASH_BANK0_SEC_72_79:origin = 0x092000、length = 0x2000、
FLASH_BANK0_SEC_80_87:origin = 0x094000、length = 0x2000、
FLASH_BANK0_SEC_88_95:origin = 0x096000、length = 0x2000、
FLASH_BANK0_SEC_96_103:origin = 0x098000、length = 0x2000、
FLASH_BANK0_SEC_104_111:origin = 0x09A000、length = 0x2000、
FLASH_BANK0_SEC_112_119:origin = 0x09C000、length = 0x2000、
FLASH_BANK0_SEC_120_127:origin = 0x09E000、length = 0x1FF0、


Flash_BANK1:origin = 0x0A0000、length = 0x20000 //可映射至 CPU1或 CPU2。 用户应根据核心选择来注释/取消注释
Flash_BANK2:origin = 0x0C0000、length = 0x20000 //可映射至 CPU1或 CPU2。 用户应根据核心选择来注释/取消注释
FLASH_BANK3:origin = 0x0E0002、length = 0x1FFFE //可映射至 CPU1或 CPU2。 用户应根据核心选择来注释/取消注释
FLASH_BANK4:origin = 0x100000、length = 0x20000 //可映射到 CPU1或 CPU2。 用户应根据核心选择来注释/取消注释


CPU1TOCPU2RAM:origin = 0x03A000、length = 0x000800
CPU2TOCPU1RAM:origin = 0x03B000、length = 0x000800

CLATOCPURAM:origin = 0x001480、length = 0x000080
CPUTOCLARAM:origin = 0x001500、length = 0x000080
CLATODMARAM:origin = 0x001680、length = 0x000080
DMATOCLARAM:origin = 0x001700、length = 0x000080

CANA_MSG_RAM:origin = 0x049000、length = 0x000800
CANB_MSG_RAM:origin = 0x04B000、length = 0x000800
复位:origin = 0x3FFFC0、length = 0x000002


部分
{
代码开始:>开始
.text:>> FLASH_BANK0_SEC_4_23、align (8)

.TI.ramfunc:load = FLASH_BANK0_SEC_0_3、
RUN = RAMD2、//可以在 RAM 中运行以获得最优循环性能
Load_start (RamfuncsLoadStart)、
Load_Size (RamfuncsLoadSize)、
Load_End (RamfuncsLoadEnd)、
RUN_START (RamfuncsRunStart)、
RUN_SIZE (RamfuncsRunSize)、
RUN_END (RamfuncsRunEnd)、
对齐(8)

FAPI:> FLASH_BANK0_SEC_0_3
{
--library=fapi_F28P65x_EABI_v3.00.01.lib
},对齐(8)

.cinit:> FLASH_BANK0_SEC_0_3、align (8)
.switch:> FLASH_BANK0_SEC_0_3、ALIGN (8)
.reset:> reset,type = DSECT /*未使用,*/

.stack:> RAMM1

#if defined (__TI_EABI __)
下一篇:> RAMD2
.bss:输出:> RAMD2
init_array:> FLASH_BANK0_SEC_0_3、ALIGN (8)
.const:> FLASH_BANK0_SEC_0_3、ALIGN (8)
.data:> RAMD2
.sysmem:> RAMD2
#else
.pinit:> FLASH_BANK0_SEC_0_3、ALIGN (8)
.ebss :>> RAMD2
econst:> FLASH_BANK0_SEC_0_3、ALIGN (8)
.esysmem :> RAMD2
#endif

ramgs0:> RAMGS0、type=NOINIT
ramgs1:> RAMGS1、type=NOINIT
ramgs2:> RAMGS2、type=NOINIT

MSGRAM_CPU1_TO_CPU2 > CPU1TOCPU2RAM、类型= NOINIT
MSGRAM_CPU2_TO_CPU1 > CPU2TOCPU1RAM、类型= NOINIT

DataBufferSection :> RAMD2, ALIGN(8)

应用项目的 CMD 如下所示:

内存
{
begin:origin = 0x080000、length = 0x000002 //根据需要更新 codestart 位置

BOOT_RSVD:origin = 0x000002、length = 0x0001AF /* M0的一部分,引导 ROM 将此用于堆栈*/
RAMM0:origin = 0x0001B1、length = 0x00024F
RAMM1:origin = 0x000400、length = 0x000400

RAMD0:origin = 0x00C000、length = 0x002000
RAMD1:origin = 0x00E000、length = 0x002000
// RAMD2:origin = 0x01A000,length = 0x002000 //可以映射到 CPU1或 CPU2。 配置为 CPU2时、请使用地址0x8000。 用户应根据核心选择来注释/取消注释
// RAMD3:origin = 0x01C000,length = 0x002000 //可映射至 CPU1或 CPU2。 配置为 CPU2时、请使用地址0xA000。 用户应根据核心选择来注释/取消注释
// RAMD4:origin = 0x01E000,length = 0x002000 //可以映射到 CPU1或 CPU2。 配置为 CPU2时、请使用地址0xC000。 用户应根据核心选择来注释/取消注释
// RAMD5:origin = 0x020000,length = 0x002000 //可以映射到 CPU1或 CPU2。 配置为 CPU2时、请使用地址0xE000。 用户应根据核心选择来注释/取消注释

RAMLS0LS1LS2LS3:origin = 0x008000、length = 0x002000
/*RAMLS0:origin = 0x008000,length = 0x000800
RAMLS1:origin = 0x008800、length = 0x000800
RAMLS2:origin = 0x009000、length = 0x000800
RAMLS3:origin = 0x009800,length = 0x000800*/
RAMLS4LS5LS6LS7:origin = 0x00A000、length = 0x002000
/* RAMLS4:origin = 0x00A000、length = 0x000800
RAMLS5 : origin = 0x00A800 , length = 0x000800
RAMLS6:origin = 0x00B000、length = 0x000800
RAMLS7:origin = 0x00B800,length = 0x000800*/
RAMLS8:origin = 0x022000、length = 0x002000 //配置为 CLA 程序时使用地址0x4000
RAMLS9:origin = 0x024000、length = 0x002000 //当被配置为 CLA 程序时使用地址0x6000

/*RAMLS8_CLA:origin = 0x004000、length = 0x002000 //仅在配置为 CLA 程序存储器时使用
RAMLS9_CLA:origin = 0x006000,length = 0x002000*///仅在配置为 CLA 程序存储器时使用

RAMGS0:origin = 0x010000、length = 0x002000
RAMGS1:origin = 0x012000、length = 0x002000
RAMGS2:origin = 0x014000、length = 0x002000
RAMGS3:origin = 0x016000、length = 0x002000
RAMGS4:origin = 0x018000,length = 0x002000

/*闪存组(每个128个扇区)*/
/*FLASH_BANK0:origin = 0x080002,length = 0x1FFFE //可以映射到 CPU1或 CPU2。 用户应根据核心选择注释/取消注释*/

/*引导加载程序区域*/
FLASH_BANK0_SEC_0_3:origin = 0x080002、length = 0xFFE、/*片上闪存*/
FLASH_BANK0_SEC_4_23:origin = 0x081000、length = 0x5000、/*片上闪存*/

PSU_APP_FLAG:origin = 0x086002,length = 0x0002 /* shelf app state word*/
/* CLA 面积*/
FLASH_BANK0_SEC_24_27:origin = 0x086004、length = 0xFFC、/*片上闪存*/
/*BSS 区域*/
FLASH_BANK0_SEC_28_31:origin = 0x087000、length = 0x1000、/*片上闪存*/
/*文本区域*/
FLASH_BANK0_SEC_32_55:origin = 0x088000、length = 0x5FFC、/*片上闪存*/

BOOT_DONE_FLAG:origin = 0x08DFFC、length = 0x0002 /* App update Success flag */

FLASH_BANK0_SEC_56_63:origin = 0x08E000、length = 0x2000、
FLASH_BANK0_SEC_64_71:origin = 0x090000、length = 0x2000、
FLASH_BANK0_SEC_72_79:origin = 0x092000、length = 0x2000、
FLASH_BANK0_SEC_80_87:origin = 0x094000、length = 0x2000、
FLASH_BANK0_SEC_88_95:origin = 0x096000、length = 0x2000、
FLASH_BANK0_SEC_96_103:origin = 0x098000、length = 0x2000、
FLASH_BANK0_SEC_104_111:origin = 0x09A000、length = 0x2000、
FLASH_BANK0_SEC_112_119:origin = 0x09C000、length = 0x2000、/*片上闪存*/
/*FLASH_BANK0_SEC_24_31:origin = 0x086000、length = 0x2000、*//*片上闪存*/
/*FLASH_BANK0_SEC_32_39:origin = 0x088000、length = 0x2000、*//*片上闪存*/
/*FLASH_BANK0_SEC_40_47:origin = 0x08A000、length = 0x2000、*//*片上闪存*/
/*FLASH_BANK0_SEC_48_55:origin = 0x08C000,length = 0x2000,*//*片上闪存*/
/* boot_done_flag:origin = 0x08DFFC,length = 0x000002*//*应用程序更新成功标志*/

/*FLASH_BANK0_SEC_56_63:origin = 0x08E000、length = 0x2000、*//*片上闪存*/
/*FLASH_BANK0_SEC_64_71:origin = 0x090000、length = 0x2000、
FLASH_BANK0_SEC_72_79:origin = 0x092000、length = 0x2000、
FLASH_BANK0_SEC_80_87:origin = 0x094000、length = 0x2000、
FLASH_BANK0_SEC_88_95:origin = 0x096000、length = 0x2000、
FLASH_BANK0_SEC_96_103:origin = 0x098000、length = 0x2000、
FLASH_BANK0_SEC_104_111:origin = 0x09A000、length = 0x2000、
FLASH_BANK0_SEC_112_119:origin = 0x09C000、length = 0x2000、
FLASH_BANK0_SEC_120_127:origin = 0x09E000、length = 0x1FF0、*/

Flash_BANK1:origin = 0x0A0000、length = 0x20000 //可映射至 CPU1或 CPU2。 用户应根据核心选择来注释/取消注释
Flash_BANK2:origin = 0x0C0000、length = 0x20000 //可映射至 CPU1或 CPU2。 用户应根据核心选择来注释/取消注释
FLASH_BANK3:origin = 0x0E0000、length = 0x20000 //可被映射至 CPU1或 CPU2。 用户应根据核心选择来注释/取消注释
FLASH_BANK4:origin = 0x100000、length = 0x20000 //可映射到 CPU1或 CPU2。 用户应根据核心选择来注释/取消注释

CPU1TOCPU2RAM:origin = 0x03A000、length = 0x000800
CPU2TOCPU1RAM:origin = 0x03B000、length = 0x000800

CLATOCPURAM:origin = 0x001480、length = 0x000080
CPUTOCLARAM:origin = 0x001500、length = 0x000080

CLATODMARAM:origin = 0x001680、length = 0x000080
DMATOCLARAM:origin = 0x001700、length = 0x000080

CANA_MSG_RAM:origin = 0x049000、length = 0x000800
CANB_MSG_RAM:origin = 0x04B000、length = 0x000800
复位:origin = 0x3FFFC0、length = 0x000002


部分
{
代码开始:>开始
.text:>> FLASH_BANK0_SEC_32_55、align (8)
.cinit:> FLASH_BANK0_SEC_28_31、align (8)
.switch:> FLASH_BANK0_SEC_28_31、ALIGN (8)
.reset:> reset,type = DSECT /*未使用,*/

.stack:> RAMM1
#if defined (__TI_EABI __)
bss:> RAMD1
.bss:输出:> RAMD1
init_array:> FLASH_BANK0_SEC_28_31、align (8)
.const:> FLASH_BANK0_SEC_28_31、ALIGN (8)
.data:> RAMD1
.sysmem:> RAMD1
#else
.pinit:> FLASH_BANK0_SEC_28_31、align (8)
.ebss :>> RAMD1
econst:> FLASH_BANK0_SEC_28_31、ALIGN (8)
.esysmem :> RAMD1
#endif

Psu_App_Flag :> PSU_APP_FLAG
Psu_Done_Flag :> boot_done_flag

ramgs0:> RAMGS0、type=NOINIT
ramgs1:> RAMGS1、type=NOINIT
ramgs2:> RAMGS2、type=NOINIT

MSGRAM_CPU1_TO_CPU2 > CPU1TOCPU2RAM、类型= NOINIT
MSGRAM_CPU2_TO_CPU1 > CPU2TOCPU1RAM、类型= NOINIT

#if defined (__TI_EABI __)
.TI.ramfunc:{}load = FLASH_BANK0_SEC_28_31、
Run = RAMD1、
Load_start (RamfuncsLoadStart)、
Load_Size (RamfuncsLoadSize)、
Load_End (RamfuncsLoadEnd)、
RUN_START (RamfuncsRunStart)、
RUN_SIZE (RamfuncsRunSize)、
RUN_END (RamfuncsRunEnd)、
对齐(8)
#else
.TI.ramfunc:{}load = FLASH_BANK0_SEC_28_31、
Run = RAMD1、
Load_start (_RamfuncsLoadStart)、
Load_Size (_RamfuncsLoadSize)、
Load_End (_RamfuncsLoadEnd)、
RUN_START (_RamfuncsRunStart)、
RUN_SIZE (_RamfuncsRunSize)、
RUN_END (_RamfuncsRunEnd)、
对齐(8)
#endif


/* CLA 特定部分*/

#if defined (__TI_EABI __)
/* CLA 特定部分*/
Cla1Prog:load = flash_BANK0_SEC_24_27、
运行= RAMLS4LS5LS6LS7、
Load_Start (Cla1ProgLoadStart)、
RUN_START (Cla1ProgRunStart)、
Load_Size (Cla1ProgLoadSize)、
对齐(4)
#else
/* CLA 特定部分*/
Cla1Prog:load = flash_BANK0_SEC_24_27、
运行= RAMLS4LS5LS6LS7、
Load_Start (_Cla1ProgLoadStart)、
RUN_START (_Cla1ProgRunStart)、
Load_Size (_Cla1ProgLoadSize)、
对齐(4)
#endif

Cla1ToCpuMsgRAM:> CLATOCPURAM
CpuToCla1MsgRAM:> CPUTOCLARAM

.scratchpad:> RAMLS0LS1LS2LS3
.bss_cla:> RAMLS0LS1LS2LS3
控制变量:> RAMLS0LS1LS2LS3

Cla1DataRam :> RAMLS0LS1LS2LS3
CLA_shared:> RAMLS0LS1LS2LS3
CLADataLS1:> RAMLS0LS1LS2LS3


#if defined (__TI_EABI __)
.const_cla:load = FLASH_BANK0_SEC_24_27、
运行= RAMLS0LS1LS2LS3、
RUN_START (Cla1ConstRunStart)、
Load_Start (Cla1ConstLoadStart)、
Load_Size (Cla1ConstLoadSize)、
对齐(4)
#else
.const_cla:load = FLASH_BANK0_SEC_24_27、
运行= RAMLS0LS1LS2LS3、
RUN_START (_Cla1ConstRunStart)、
Load_Start (_Cla1ConstLoadStart)、
Load_Size (_Cla1ConstLoadSize)、
对齐(4)
#endif

 JUMP 的指令如下:

  

您能给我一些建议吗?

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

    周老师、您好!

    几个问题:

    1) JumpToAppHandle 函数的目的是什么?

    2) 2)我看到在跳转到应用程序之前调用了 DINT。 您是说您需要在应用程序期间启用中断吗?

    3)在哪里调用 JumpToAppHandle()?

    谢谢。此致、

    查尔斯

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

    1) JumpToAppHandle 函数的目的是什么?

    由于我需要添加第二个引导函数、因此我的项目分为两个部分、一个是用于运行  主体函数的应用程序部分、另一个 是用于通过 CAN 通信在线擦除和更新应用程序闪存区域的引导加载程序部分。 在通过引导加载程序运行之后、项目需要跳转到应用程序部分。 "JumpToAppHandle"用于跳转到应用程序部件。

     2) 2)我看到在跳转到应用程序之前调用了 DINT。 您是说您需要在应用程序期间启用中断吗?

    在跳转到应用部分后、中断将再次初始化。 它将在应用程序期间启用。

    3)在哪里调用 JumpToAppHandle()?

     JumpToAppHandle()存储在引导加载程序区域中,它将在 检查 联机引导加载程序后被调用。

    顺便说一下、如果我的项目仅在没有引导加载程序的情况下运行应用程序部分、则中断函数可以很好地工作。

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

    Steven、

    您可能需要参阅我们的一些其他工程示例、因为这似乎面向实时固件更新(LFU)。 F28003x 器件具有针对闪存内核 SCI 编程的闪存内核示例、此示例采用 LFU 构建配置、以及一个针对 CAN 闪存内核的项目。  

    相关工程路径: C:\ti\c2000\C2000Ware_5_01_00_00\driverlib\f28003x\examples\flash

    将根据需要提供更多帮助。

    谢谢。此致、

    查尔斯