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.
你(们)好。
// 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;
您好、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
尚未检查此寄存器! 我将检查并报告它。
谢谢你。 很不错! 我确实忽略了这一基本设置。