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**** 2454880 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中、我检查了代码的工作方式、如下所示:
// 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;
在 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 之间都设置了模式和控制寄存器。 我的代码如下所示:

    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
    	DmaRegs.CH1.SRC_BURST_STEP = 2;						// Increment source addr between each word transferred
    	DmaRegs.CH1.DST_BURST_STEP = 2;						// Increment dest addr between each word transferred
    
    	// Set up TRANSFER registers:
    	DmaRegs.CH1.TRANSFER_SIZE = tsize-1;				// Number of bursts (X-1) per transfer, DMA interrupt will occur after completed transfer
    	DmaRegs.CH1.SRC_TRANSFER_STEP = 2;					// TRANSFER_STEP is ignored when WRAP occurs
    	DmaRegs.CH1.DST_TRANSFER_STEP = 2;					// TRANSFER_STEP is ignored when WRAP occurs
    
    	// Set up WRAP registers:
    	DmaRegs.CH1.SRC_WRAP_SIZE = 0xFFFF;					// Wrap source address after N bursts
    	DmaRegs.CH1.SRC_WRAP_STEP = 0;						// Step for source wrap
    
    	DmaRegs.CH1.DST_WRAP_SIZE = 0xFFFF;					// Wrap destination address after N bursts
    	DmaRegs.CH1.DST_WRAP_STEP = 0;						// Step for destination wrap
    
    	DmaClaSrcSelRegs.DMACHSRCSEL1.bit.CH1 = TriggerSource;
    
    	// Set up MODE Register:
    	DmaRegs.CH1.MODE.bit.PERINTSEL	= 1;				// Should be hard coded to channel, above now selects source, 36:EPWM1.SOCA
    	DmaRegs.CH1.MODE.bit.PERINTE	= PERINT_ENABLE;	// Peripheral interrupt enable
    	DmaRegs.CH1.MODE.bit.ONESHOT	= ONESHOT_ENABLE;	// Oneshot enable
    	DmaRegs.CH1.MODE.bit.CONTINUOUS	= CONT_ENABLE;		// Continous enable
    	DmaRegs.CH1.MODE.bit.OVRINTE	= OVRFLOW_DISABLE;	// Enable/disable the overflow interrupt
    	DmaRegs.CH1.MODE.bit.DATASIZE	= THIRTYTWO_BIT;	// 16-bit/32-bit data size transfers
    	DmaRegs.CH1.MODE.bit.CHINTMODE	= CHINT_END;		// Generate interrupt to CPU at beginning/end of transfer
    	DmaRegs.CH1.MODE.bit.CHINTE		= CHINT_ENABLE;
    
    	// Clear any spurious flags:
    	DmaRegs.CH1.CONTROL.bit.PERINTCLR = 1;				// Clear any spurious interrupt flags
    	DmaRegs.CH1.CONTROL.bit.ERRCLR = 1;					// Clear any spurious sync error flags
    
    	// Initialize PIE vector for CPU interrupt:
    	PieCtrlRegs.PIEIER7.bit.INTx1 = 1;
    
    	// This function starts DMA Channel 1.
    	DmaRegs.CH1.CONTROL.bit.RUN = 1;
    
    	EDIS;

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

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

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

    您好、Henry、

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

    CpuSysRegs.PCLKCR0.bit.DMA = 1;

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

    此致、

    Veena

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

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

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

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