void PDMA_Init(void) { /* Open PDMA Channel */ PDMA_Open(1 << 0); // Channel 0 for UART1 TX PDMA_Open(1 << 1); // Channel 1 for UART1 RX // Select basic mode PDMA_SetTransferMode(0, PDMA_UART1_TX, 0, 0); PDMA_SetTransferMode(1, PDMA_UART1_RX, 0, 0); // Set data width and transfer count PDMA_SetTransferCnt(0, PDMA_WIDTH_8, PDMA_TEST_LENGTH); PDMA_SetTransferCnt(1, PDMA_WIDTH_8, PDMA_TEST_LENGTH); //Set PDMA Transfer Address PDMA_SetTransferAddr(0, ((uint32_t) (&g_u8Tx_Buffer[PDMA_TEST_LENGTH])), PDMA_SAR_INC, UART1_BASE, PDMA_DAR_FIX); PDMA_SetTransferAddr(1, UART1_BASE, PDMA_SAR_FIX, ((uint32_t) (&g_u8Rx_Buffer[PDMA_TEST_LENGTH])), PDMA_DAR_INC); //Select Single Request PDMA_SetBurstType(0, PDMA_REQ_SINGLE, 0); PDMA_SetBurstType(1, PDMA_REQ_SINGLE, 0); //Set timeout //PDMA_SetTimeOut(0, 0, 0x5555); //PDMA_SetTimeOut(1, 0, 0x5555); #ifdef ENABLE_PDMA_INTERRUPT PDMA_EnableInt(0, 0); PDMA_EnableInt(1, 0); NVIC_EnableIRQ(PDMA_IRQn); u32IsTestOver = 0; #endif }
/*---------------------------------------------------------------------------------------------------------*/ int PDMA_Example(void) { uint32_t u32EndSrc, u32EndDst; /* Init System, IP clock and multi-function I/O */ SYS_Init(); //In the end of SYS_Init() will issue SYS_LockReg() to lock protected register. If user want to write protected register, please issue SYS_UnlockReg() to unlock protected register. /* Init UART for printf */ UART0_Init(); printf("\n\nCPU @ %dHz\n", SystemCoreClock); printf("+------------------------------------------------------+ \n"); printf("| NUC400 PDMA Memory to Memory Driver Sample Code | \n"); printf("+------------------------------------------------------+ \n"); /* Open Channel 2 */ PDMA_Open(1 << 2); PDMA_SetTransferCnt(2, PDMA_WIDTH_32, PDMA_TEST_LENGTH); u32EndSrc = (uint32_t)SrcArray + PDMA_TEST_LENGTH * 4; u32EndDst = (uint32_t)DestArray + PDMA_TEST_LENGTH * 4; PDMA_SetTransferAddr(2, u32EndSrc, PDMA_SAR_INC, u32EndDst, PDMA_DAR_INC); PDMA_SetTransferMode(2, PDMA_MEM, 0, 0); PDMA_SetBurstType(2, PDMA_REQ_BURST, PDMA_BURST_4); PDMA_SetTimeOut(2, 0, 0x5); PDMA_EnableInt(2, 0); NVIC_EnableIRQ(PDMA_IRQn); u32IsTestOver = 0; PDMA_Trigger(2); while(u32IsTestOver == 0); if (u32IsTestOver == 1) printf("test done...\n"); else if (u32IsTestOver == 2) printf("target abort...\n"); else if (u32IsTestOver == 3) printf("timeout...\n"); PDMA_Close(); }