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:TMS320F280039 — 矢量表分配

Guru**** 2553260 points
Other Parts Discussed in Thread: TMS320F280039C, C2000WARE

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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1526562/tms320f280039c-tms320f280039---vector-table-allocation

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

工具/软件:

尊敬的 TI 团队:

在 TMS320F280039C 中开发了定制引导加载程序和应用程序工程

1,自定义引导加载程序代码起始地址 — 0x0008 0000 — 闪存组 0

2.应用程序代码(通用电机控制)起始地址 — 0x0009 0000 — 闪存组 1

3.出于 EEPROM 数据目的、我们使用了 0x000a 1000 — 闪存组 2 扇区 1 的位置

个别项目运作良好。 我在自定义引导项目中使用了 UDS 协议来刷写应用程序代码。

刷新过程也可以正常工作。 刷写后、我使用软件复位功能。 复位后、CRC 值验证过程完成。
如果存储器写入 CRC 值和计算出的 CRC 值都相等、则意味着我将程序从自定义引导代码切换到应用项目。

当时我遇到了一个错误、非法的中断处理程序错误。

请建议我解决上述错误。

我想知道以下问题、

1.是否需要为两个项目分别创建引导表?

2.如何在闪存中分配中断向量表的位置?

3. 如何 在运行时将闪存位置重新分配到 RAM 内存位置?

4、如何将闪存 API 库包含在电机控制工程中?

提前感谢、

B. Punitha.

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

    您好、

    我将能够在第二天内回答您的问题。

    谢谢。此致、

    Charles

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

    尊敬的 Charles:

          等待您的回复。

    谢谢、

    B. Punitha.

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

    嗨、Punitha、

    1、2。 有关该问题、请参阅以下主题解决方案:  

    TMS320F280049C:移位中断矢量表和跳转到应用 — C2000 微控制器论坛 — C2000Tm μ︎ 微控制器 — TI E2E 支持论坛

    要在运行期间将闪存存储器重新分配给 RAM、 您可以查看 F28003x 闪存 API 链接器命令文件中提供的示例:

     GROUP
       {
           .TI.ramfunc
           { -l FAPI_F28003x_EABI_v1.58.10.lib}
    
       }  LOAD = FLASH_BANK0_SEC1,
          RUN = RAMLS03,
          LOAD_START(RamfuncsLoadStart),
          LOAD_SIZE(RamfuncsLoadSize),
          LOAD_END(RamfuncsLoadEnd),
          RUN_START(RamfuncsRunStart),
          RUN_SIZE(RamfuncsRunSize),
          RUN_END(RamfuncsRunEnd),
          ALIGN(8)

    4.要将闪存 API 库包含在电机控制工程中、 您可以 在 C2000ware 中查看该器件的 flashapi_ex1_programming 提供的示例、并检查“Properties"->"C2000 Linker"->"File“ Linker"->"File Search“ Search Path"“ Path":“:</s>“

    可在此处找到该器件的闪存 API 库:

    C2000Ware_5_04_00_00\libraries\flash_api\f28003x\lib

    谢谢。此致、

    Charles

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

    尊敬的查尔斯:

    1、2 — 我已经遵循威胁并执行了步骤,此时将发生以下错误。

    我移除了 EALLOW 部分,当时从引导代码跳转到应用程序代码。 发生控制器重置。

    3、4 — 我已经在我们的代码中执行了上述步骤。

    在节映射中、

    它包含了文件搜索路径、

    在包含的选项中、

      

    之后也发生了以下错误。 我无法包含闪存 API

    谢谢、  

    B. Punitha.

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

    为了包含 PieVectTable、“device.h"头“头文件是否包含在此源文件中?

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

    是的。 我 在源代码中包含了 device.h 头文件。

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

    嗨、Punitha、

    您能否说明 initCanCOM 函数驻留的位置? 是否是调用“run_app"函“函数的函数?

    对于 PieVectTable、其定义应驻留在器件的 globalvariabledefs.c 文件中。 您是否可以查看 C2000Ware 器件支持文件夹中的 f28003x LED 闪烁示例、以了解如何为此文件考虑包括哪些内容?

    谢谢。此致、

    Charles

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

    尊敬的 Charles:

     我注意到 PieVectTable 定义 仅位于 globalvariableDES.c 文件中。 但在中断函数上方的代码中、有以下行可用

    #pragma CODE_SECTION (canaISR、“.TI.ramfunc")“)

    电机控制工程中的可用行数如下

    #pragma CODE_SECTION (motor1CtrlISR、“.TI.ramfunc")“);
    #pragma INTERRUPT(motor1CtrlISR、{hp});

    我还注意到另一点、在映射文件中、闪存存储器中提供了 ISR 例程。 但在 RAM 中仍然执行。

    电机控制映射文件

    自定义启动代码

    在上述两个工程中、ISR 例程在闪存中可用、但在 RAM 中仍然执行。

    将控制从自定义启动代码更改为应用代码时、该代码进入复位功能。

    建议解决该问题、并将控制权从引导代码更改为应用程序代码。

    谢谢。此致、

    B. Punitha.

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

    您好、

    在配置中断向量表之前、中断必须由之前的引导加载程序代码应用程序清除(因为两个示例中都存在 canaISR) 。 您可以在分支到应用程序之前尝试禁用中断吗?

    谢谢。此致、

    Charles  

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

    尊敬的 Charles:  

    是的。 我在从引导代码分支到应用程序代码之前禁用所有中断。

    以下代码是在我们的源代码中实现的

    执行上述代码后、发生以下错误

    执行 PC 后、进入引导代码起点。

    请检查上述过程是否正常。

    谢谢。此致、

    B. Punitha.

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

    嗨、Punitha、

    您能否在分支到下一个应用程序之前退出主应用程序? 您要返回哪个条目地址?

    另外,为什么跳到  cinit  而不是  codestart ?

    您可以查看   F28003x 器件的 C2000 微控制器 CAN 闪存编程应用手册中的示例作为参考。

    谢谢。此致、

    Charles

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

    尊敬的 Charles:

            我无法理解上述应用。

    闪存组 0 中的自定义启动代码项目。 起始地址= 0x80000

    应用代码位于闪存组 1 中。 起始地址= 0x90000

    我曾经 使用自定义启动代码通过 CAN - UDS 协议对器件进行编程。

    编程后、强制器件复位。 复位结束后、程序会检查 CRC 值、并且该过程必须移动应用工程、起始地址为 0x90000。

    在上电情况下、程序也从引导代码启动、在 CRC 验证后、工程必须跳转应用程序部分。

    我需要的上述要求。

    请建议从引导项目跳转到应用项目的过程。

    谢谢。此致、

    B. Punitha.

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

    嗨、Punitha、

    我们的专家本周已离职、因此请预计回复会有一些延迟。 同时、您是否可以引用 C2000Ware SDK 中的 flash_kernel_ex3_codestartbranch.asm 文件 (C2000Ware\driverlib\f28003x\examples\flash\flash_kernel_ex3_codestartbranch.asm)? 理想情况下、您应  从引导加载程序的主函数返回应用程序的 codestart 地址、而不是直接跳转到该地址。

    此致、

    Alex

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

    您好 Alex、

    但我仍然无法解决问题。  

    自定义的引导项目详细信息、

    1.起始地址= 0x80000

    2.堆栈= M1

    3、使用中断 = CAN 中断

    4. RAM used = RAM LS  

    通用电机控制应用 工程详细信息、

    1、起始地址= 0x90000

    2.堆栈= M0

    3、使用中断 = CAN 中断、用于电机控制的 ADC 中断

    4.使用的 RAM = RAM GS

    下面的问题、我需要澄清与从一个项目跳 到另一个项目相关的问题。

    1. 如何 在运行时从一个闪存存储体更改为另一个闪存存储体。
    2. 在运行时将一个项目更改为另一个项目期间的矢量表和重置中断处理。
    3. 如何编辑工程中的 codestartbranch.asm 文件

    能详细解释一下吗?

    谢谢。此致、

    B. Punitha.

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

    嗨、Punitha、

    您能否确认您已尝试从引导加载程序的主函数返回通用电机控制应用程序 (0x90000) 的入口点? 切换闪存存储体不应该是问题。

    codestartbranch.asm 应该是工程中的一个文件、您可以修改它、看起来像  flash_kernel_ex3_codestartbranch.asm。

    您可能还需要查看 C2000 MCU 上具有器件复位功能的实时固件更新(修订版 A) 、以了解有关中断处理的信息。

    此致、

    Alex

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

    您好 Alex、

    感谢您的答复。

       我在引导加载程序主函数中包括了以下代码、  

    APP_ENTRY_ADDRESS = 0x90000;

    执行上述代码时、会首先执行以下代码   

    工作完成。 执行了一段时间  

    然后控制器进入软件复位状态、仅继续同一引导项目。

    在 codestartbranch.asm 文件中,我没有做任何更正

    而我进行了与  flash_kernel_ex3_codestartbranch.asm 相同的校正 、因为代码无法正常工作。  

    退出:

    __stack:.usect “.stack",“,0、0
    MOV SP、#__STACK
    MOV *SP++、#0
    MOV *SP++、#0
    按下 ACC
    POP RPC
    ZAPA
    MOVL XT、符合
    MOVZ AR0, AL
    MOVZ AR1、AL
    MOVZ AR2、AL
    MOVZ AR3, AL
    MOVZ AR4、AL
    MOVZ AR5, AL
    MOVZ AR6、AL
    MOVZ AR7, AL
    MOVW DP、#0
    MOV *SP++、#0
    MOV *SP++、#0x0A0B
    弹出 ST1
    弹出 ST0
    LRETR
    .end

    .end

    如果当时我在 codestartbranch.asm 文件中包含上述更正、则可以中断并且引导加载程序工程未工作。

    谢谢、

    B. Punitha.

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

    嗨、Punitha、

     当应用程序项目复位时、CpuSysRegs 下的复位原因寄存器 (RESC) 的内容是什么?

    此外、分支到应用程序后、您是否能够确定复位在什么地址以及在什么函数内发生?

    您需要在分支后加载应用项目的符号。

    谢谢。此致、

    Charles

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

    尊敬的 Charles:

         当应用程序项目复位时、CpuSysRegs 下的复位原因寄存器 (RESC) 的内容是什么?       

          

    发生看门狗复位。

    此外、分支到应用程序后、您是否能够确定复位在什么地址以及在什么函数内发生?

     控制器最初输入 0x90000 地址

    按下 F5 控制器后、进入 0x90084

     

    在 0x3FEEF9 位置、控制器会等待一段时间。 我想这是在 ITRAP ISR 位置

    持续运行后、器件进入 main 的启动代码起始点。

    您需要在分支后加载应用项目的符号。

     我是否知道必须在应用程序工程中加载哪些符号?

    谢谢。此致、

    B. Punitha.

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

    嗨、Punitha、

    是否在电机控制应用中禁用了看门狗? 您可以在分支到电机控制应用后为其加载符号。 这可以通过依次转到 Load > Load symbols、然后选择您的应用.out 文件来实现。

    此致、

    Alex

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

    您好 Alex、

         是的。 我会在电机控制应用中禁用看门狗。 此时、控制器也未切换到应用程序工程。  

    自定义引导项目本身我必须加载.out 文件 eh 的加载符号?

    谢谢。此致、

    B. Punitha.

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

    嗨、Punitha、

    是的、具体过程是运行引导加载程序工程、分支到地址为 0x90000 的应用程序、然后加载应用程序的符号并逐步执行、直到看到复位。 此外、在观察复位之前、是否在分支到应用程序时设置了看门狗位?

    此致、

    Alex

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

    您好 Alex  

    在跳转到应用项目时、PC 加载 0x3FDBA4 位置、运行后、PC 进入 0x3FEEF8 位置、发生 Estop。

    需要一个说明、

    引导表值是否影响此过程?

    0xd00、0xd01 表示引导表值

    0xd04 =保存工程起始地址、

    在我们的启动项目中、我加载了 0x03 = 0xd04 位置作为起始点 0x80000。

    但我们的应用工程必须以 0x63 为起点。

    在更改应用工程之前、我是否将 0x63 值加载到 0xd04 位置?

    谢谢。此致、

    B. Punitha.

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

    嗨、Punitha、

     最初控制器输入 0x90000 地址

    这看起来像是两种不同的行为、PC 是否曾经进入 0x90000、或者是否立即进入 ITRAP?

    引导表值是否会影响此过程?

    不、这不应该是一个因素。 您的器件应处于闪存引导模式并引导至地址 0x80000、以便引导加载程序在器件上电时启动。 然后、引导加载程序将在 CRC 校验后跳转到应用程序、即不需要通过引导 ROM 返回。

    您能否确认您的应用程序是否使用 CCS 片上闪存编程工具中的“仅验证“功能进行了正确编程? 根据先前的汇编代码图像、似乎可能存在编程问题。

    此致、

    Alex

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

    您好 Alex、

         此时使用调试器工具加载的应用代码、

    使用 CAN 工具通过我们的自定义引导加载程序代码加载应用程序代码、此时会加载映像

         

    两个图像是相同的。 我认为编程过程没有什么不同。

    当从自定义启动代码跳转到应用项目时、  

    最初 PC 加载 0x90000 地址

     

    在 PC 加载 0x900F6 地址时按下 F5

    按 F5 => 0x3F00FF

    按 F5 ==>0x3FEEC9

    按 F5 => 0x3FEE8

    按 F5 ==>后、PC 返回到引导代码中的 main 开始。

    但是、在通过调试器运行应用程序代码时、PC 此时不会进入引导 ROM 部分。

    在跳转过程中、我遵循以下例程、

     asm(“ LB *XAR7“);

    }

    在上述例程中、加载地址= 0x90000

    请建议解决该问题。

    谢谢。此致、

    B. Punitha.

     

     

      

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

    Punitha、

    您能共享应用的 TI-TXT 转储吗?

    此致、

    Alex

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

    您好 Alex、

          我在编程过程中执行了一个操作、我错过了每个存储器位置的上半字节。  

    这意味着对于每个地址、我只写入低 8 位、我没有写入高 8 位。 所以只有我的跳转函数不能正常工作。  

    我尝试在每个地址位置写入这两个 16 位值。 一旦我完成,然后跳转函数工作正常,我认为。  

    完成后,我会通知..

    感谢您的建议,

    B. Punitha.