Dear community.
I started experimenting with imxrt1011 (on EVK board) and can't get eDMA to read GPIO2 periodically. I verified that GPIO2->PSR returns the state of my pins (polling). Pin configuration is generated by MCUXpresso Config Tool BTW - 8 pins are set to GPIO2 inputs. I checked that my DMA example (modified ping-pong example) woks when I source data from memory buffer instead of GPIO2->PSR. PIT also seems to be working, because I checked on an oscilloscope that I can slow down DMA transfers using it. Yet, when I try to source data from GPIO2->PSR nothing happens, and even my callback (EDMA_Callback) doesn't get called. My DMA configuration is as follows:
AT_NONCACHEABLE_SECTION_ALIGN_INIT (uint8_t destBuf[BUFFER_LENGTH], 32) = {0x00U, 0x00U, 0x00U, 0x00U, 0x00U, 0x00U, 0x00U, 0x00U};
void init ()
{
CLOCK_SetMux (kCLOCK_PerclkMux, 1U);
CLOCK_SetDiv (kCLOCK_PerclkDiv, 0U);
pit_config_t pitConfig{};
PIT_GetDefaultConfig (&pitConfig);
PIT_Init (PIT, &pitConfig);
PIT_SetTimerPeriod (PIT, kPIT_Chnl_0, USEC_TO_COUNT (1000U, CLOCK_GetFreq (kCLOCK_OscClk)));
PIT_StartTimer (PIT, kPIT_Chnl_0);
edma_transfer_config_t transferConfig{};
edma_config_t userConfig{};
DMAMUX_Init (DMAMUX);
DMAMUX_EnableChannel (DMAMUX, EDMA_CHANNEL_0);
DMAMUX_EnableAlwaysOn (DMAMUX, EDMA_CHANNEL_0, true);
DMAMUX_EnablePeriodTrigger (DMAMUX, EDMA_CHANNEL_0);
EDMA_GetDefaultConfig (&userConfig);
EDMA_Init (DMA0, &userConfig);
EDMA_CreateHandle (&g_EDMA_Handle, DMA0, EDMA_CHANNEL_0);
EDMA_SetCallback (&g_EDMA_Handle, EDMA_Callback, nullptr);
EDMA_ResetChannel (g_EDMA_Handle.base, g_EDMA_Handle.channel);
// Prepare descroptor 0
EDMA_PrepareTransfer (&transferConfig,
(void *)&GPIO2->PSR, // srcAddr eDMA transfer source address.
1, // srcWidth eDMA transfer source address width(bytes).
&destBuf[0], // destAddr eDMA transfer destination address.
1, // destWidth eDMA transfer destination address width(bytes).
1, // bytesEachRequest (minor count B) eDMA transfer bytes per channel request.
HALF_BUFFER_LENGTH, // transferBytes (major * minor count B) eDMA transfer total B.
kEDMA_PeripheralToMemory); // transferType eDMA transfer type.
EDMA_TcdSetTransferConfig (&tcdMemoryPoolPtr[0], &transferConfig, &tcdMemoryPoolPtr[1]);
// Prepare descroptor 1
EDMA_PrepareTransfer (&transferConfig,
(void *)&GPIO2->PSR, // srcAddr
1, // srcWidth
&destBuf[HALF_BUFFER_LENGTH], // destAddr
1, // destWidth
1, // bytesEachRequest
HALF_BUFFER_LENGTH, // transferBytes
kEDMA_PeripheralToMemory); // transferType
EDMA_TcdSetTransferConfig (&tcdMemoryPoolPtr[1], &transferConfig, &tcdMemoryPoolPtr[0]);
EDMA_TcdEnableInterrupts (&tcdMemoryPoolPtr[0], kEDMA_ErrorInterruptEnable | kEDMA_MajorInterruptEnable);
EDMA_TcdEnableInterrupts (&tcdMemoryPoolPtr[1], kEDMA_ErrorInterruptEnable | kEDMA_MajorInterruptEnable);
EDMA_InstallTCD (DMA0, EDMA_CHANNEL_0, tcdMemoryPoolPtr);
EDMA_EnableAutoStopRequest (DMA0, EDMA_CHANNEL_0, false);
EDMA_StartTransfer (&g_EDMA_Handle);
}