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.

[参考译文] 编译器/TMS320F28379D:TMS320F28379D 的实验和示例代码-中断和 PIECTRL.c

Guru**** 2562120 points
Other Parts Discussed in Thread: TMS320F28379D, C2000WARE

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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/636501/compiler-tms320f28379d-lab-and-example-code-for-tms320f28379d---interruption-and-piectrl-c

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

工具/软件:TI C/C++编译器

我已经完成了有关 TMS320F28379D LaunchPad 和 PIECTRL.c 文件的多日实验室技术讲座、其中显式显示了用于初始化 DE PIE RAM 的折线:

//--初始化 PIE_RAM。 其中包括:

//  32个基本向量+(12个 PIE 组* 16个向量/组)= 224个 PIE 向量(448个字)。

      PieCtrlRegs.PIECTRL.bit.ENPIE = 0;     //禁用 PIE

     asm (" EALLOW");                //启用 EALLOW 受保护寄存器访问

      //围绕前三个32位位置(六个16位位置)步进。

      //这些位置在调试期间由 ROM 引导加载程序使用。

      memcpy (((uint16 *)&PieVectTable+6、(uint16 *)&PieVectTableInit+6、448-6);

      asm (" EDIS");                    //禁用 EALLOW 受保护寄存器访问

但在 CCSv7中提供的示例中、我找不到存储器副本的代码。

那么、问题是代码在哪里、我是说、在哪里:

      memcpy (((uint16 *)&PieVectTable+6、(uint16 *)&PieVectTableInit+6、448-6);

在提供的示例中?

或者、在另一种方法中、是否有其他方法可以将表矢量复制到 RAM 中? 在这种情况下、如何实现?

提前感谢您、

佩德罗·A.

我已经完成了 Mul 的工作

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

    您好、Pedro、

    查看 C2000Ware/device_support/f2837xd/common/source 中的文件 F2837xD_PieVect.c。 它包含正确初始化 PIE 表的函数"InitPieVectTable"。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    谢谢 Frank、
    它对我有所帮助、但我想了解中断地址是如何从代码中获取的、以及为什么将源指针复制到 DES 指针而不再使用:

    空 InitPieVectTable (空)

    uint16 i;
    uint32 *源=(void *)&PieVectTableInit;
    uint32 * dest =(void *) PieVectTable (PieVectTable);
    //
    //请勿在前3个32位位置上进行写操作(这些位置是
    //由具有引导变量的引导 ROM 初始化)
    //
    Source = Source + 3;
    DEST = Dest + 3;

    EALLOW;
    对于(I = 0;I < 221;I++)

    *目的地++=*来源++;

    EDIS;

    //
    //启用 PIE 矢量表
    //
    PieCtrlRegs.PIECTRL.bit.ENPIE = 1;


    再次感谢您、
    佩德罗 A
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    好的,让我看看我是否有正确的理解...
    这是一个指向函数的指针、在本例中是一个为结构体的第一个地址初始化的结构、该结构体具有中断名称(在 PieVectTableInit 中定义)。 目的是为中断的名称(在 PieVectTableInit 中为某些东西_ISR)指定在另一个结构(PieVectTable)中定义的中断类型。
    我是对的吗?
    谢谢、
    佩德罗·A.
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    佩德罗

    是的。 当一个被启用的外设中断发生时、CPU 转至 PIE 矢量表来检索 ISR 函数的矢量/地址、以便在任何时候调用、 即使表指向的函数是占位符函数、PIE 矢量表也必须包含有效地址、并且实际上不执行任何操作。 如果在启用 PIE 之前未正确初始化表、则中断会导致代码进入杂草。

    在上面的代码片段中、目的是指向 PIE 矢量表起始地址的指针、源是结构常量的地址、函数指针作为成员。 这些占位符函数在循环的 PIE 矢量表之后填充该表。

    在代码中、您必须使用中断发生时需要调用的函数来覆盖每个 PIE 占位符矢量。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    谢谢 Frank、
    这回答了我的疑问。
    佩德罗·A.