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.

[参考译文] TMS320F28386D:外部中断只能触发 CPU1

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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1056128/tms320f28386d-external-interrupt-can-trigger-cpu1-only

器件型号:TMS320F28386D

你(们)好。

我的要求是通过外部中断触发 CPU1和 CPU2的 DMA 通道1。 外部中断源应该是一个单个 GPIO、例如 GPIO 104。 请参阅我的拓扑、如下所示:
在 CPU1中、我检查了代码的工作方式、如下所示:
Fullscreen
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
// Step 1 : assign XINT1 from some external input
GPIO_SetupXINT1Gpio(104);
// Step 2 : configure polarity
XintRegs.XINT1CR.bit.POLARITY = 1; // Rising edge interrupt
XintRegs.XINT1CR.bit.ENABLE = 1; // Enable XINT1
// Step 3 : assign routine
PieVectTable.DMA_CH1_INT = &DMA_CH1_isr; // assigned routine
// Step 4 : activate dma channel
// Ignore some other DMA CH1 config
....
DmaRegs.CH1.MODE.bit.CHINTE = 1;
PieCtrlRegs.PIEIER7.bit.INTx1 = 1;
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
在 CPU2中、编码步骤2 ~ 4。 步骤1似乎在 CPU2中不可用 (不确定是否可用)。
我已检查 CPU1中的 DMA CH1工作正常、但 CPU2中的 DMA CH1不工作。 请帮帮我。 我还应该做些什么?
此致、
Henry
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、Henry、

    GPIO 和 XBAR 设置只能由 CPU1内核完成。 但 XintRegs 可在两个内核上单独配置。

    您是否在 CPU1和 CPU2代码中将 DMA 触发源配置为 XINT1?

    此致、

    Veena

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

    您好、Veena、

    您是指 DmaClaSrcSelRegs.DMACHSRCSEL1吗? 这个已设置为29。

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

    是的、我指 的是 DMACHSRCSEL 寄存器。 这是在两个内核上配置的吗?

    此致、

    Veena

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

    是的、检查 DMACHSRCSEL 设置。  在 CPU2中 DMACHSRCSEL1.CH1也被设定为29。

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

    我是否可以要求 CPU1中的 DMA CH1和 CPU2中的 DMA CH1是每个 CPU 中的单独单元? 我确保 DMACHSRCSEL 寄存器的设置被执行并且 DMA CH1模式、控制寄存器也被执行、这是因为这些执行被放置在一个函数中并且该函数确实运行。 但我无法读取模式寄存器和控制寄存器(两者均显示为"0")

    此致、

    Henry

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

    您好、Henry、

    是的、这些是每个 CPU 子系统的专用 DMA。

    是否在设置控制寄存器之前使用过 EALLOW。 大多数 DMA 控制寄存器受 EALLOW 保护。

    此致、

    Veena

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

    我确保在 EALLOW 和 EDIS、DMACHSRCSEL 之间都设置了模式和控制寄存器。 我的代码如下所示:

    Fullscreen
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    void DMACH1Config(volatile Uint16 *DMA_Source, volatile Uint16 *DMA_Dest, Uint16 wordLen, Uint16 TriggerSource)
    {
    Uint16 tsize = wordLen % 32 ? (wordLen/32 + 1) : wordLen/32;
    Uint16 bsize = wordLen / tsize;
    EALLOW;
    // Disable DMA channel
    DmaRegs.CH1.CONTROL.bit.RUN = 0;
    // Configure DMA Channel 1 (32-bit datasize)
    // Set up SOURCE address:
    DmaRegs.CH1.SRC_BEG_ADDR_SHADOW = (Uint32)DMA_Source; // Point to beginning of source buffer
    DmaRegs.CH1.SRC_ADDR_SHADOW = (Uint32)DMA_Source;
    // Set up DESTINATION address:
    DmaRegs.CH1.DST_BEG_ADDR_SHADOW = (Uint32)DMA_Dest; // Point to beginning of destination buffer
    DmaRegs.CH1.DST_ADDR_SHADOW = (Uint32)DMA_Dest;
    // Set up BURST registers:
    DmaRegs.CH1.BURST_SIZE.all = bsize-1; // Number of words (X-1) transferred in a burst
    XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

    此部件与 CPU1中的代码相同。 但它在 CPU1中工作正常。

    此外、触发源寄存器设置正确。 还有什么需要注意的吗?

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

    您好、Henry、

    您是否在 CPU2上启用了 DMA 外设时钟? 请注意、这应该由 CPU2进行设置

    CpuSysRegs.PCLKCR0.bit.DMA = 1;

    这是 作为 InitPeripheralClocks (也在 InitSysCtrl 中调用)的一部分完成的

    此致、

    Veena

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

    尚未检查此寄存器!  我将检查并报告它。

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

    谢谢你。 很不错! 我确实忽略了这一基本设置。