/*---------------------------------------------------------------------------------------------------------*/ void PDMA_UART(int32_t i32option) { /* Source data initiation */ BuildSrcPattern((uint32_t)SrcArray, UART_TEST_LENGTH); ClearBuf((uint32_t)DestArray, UART_TEST_LENGTH, 0xFF); /* Reset PDMA module */ SYS->IPRSTC1 |= SYS_IPRSTC1_PDMA_RST_Msk; SYS->IPRSTC1 &= ~SYS_IPRSTC1_PDMA_RST_Msk; if(i32option =='1') { printf(" [Using TWO PDMA channel].\n"); printf(" This sample code will use PDMA to do UART1 loopback test 10 times.\n"); printf(" Please connect UART1_RXD(PB.4) <--> UART1_TXD(PB.5) before testing.\n"); printf(" After connecting PB.4 <--> PB.5, press any key to start transfer.\n"); g_u32TwoChannelPdmaTest = 1; getchar(); } else { UART_TEST_LENGTH = 2; /* Test Length */ printf(" [Using ONE PDMA channel].\n"); printf(" This sample code will use PDMA to do UART1 Rx test 10 times.\n"); printf(" Please connect UART1_RXD(PB.4) <--> UART1_TXD(PB.5) before testing.\n"); printf(" After connecting PB.4 <--> PB.5, press any key to start transfer.\n"); g_u32TwoChannelPdmaTest = 0; getchar(); printf(" Please input %d bytes to trigger PDMA one time.(Ex: Press 'a''b')\n", UART_TEST_LENGTH); } if(g_u32TwoChannelPdmaTest==1) { /* Enable PDMA channel 1 clock */ PDMA_GCR->GCRCSR |= PDMA_GCRCSR_CLK1_EN_Msk; /* UART Tx PDMA configuration */ PDMA_UART_TxTest(); } /* Enable PDMA channel 0 clock */ PDMA_GCR->GCRCSR |= PDMA_GCRCSR_CLK0_EN_Msk; /* UART Rx PDMA configuration */ PDMA_UART_RxTest(); /* Enable PDMA Channel 0 Block Transfer Done Interrupt */ PDMA0->IER |= PDMA_IER_BLKD_IE_Msk; IntCnt = 0; IsTestOver = FALSE; NVIC_EnableIRQ(PDMA_IRQn); /* Enable UART0 RDA interrupt */ if(g_u32TwoChannelPdmaTest==0) { UART_ENABLE_INT(UART0, UART_IER_RDA_IEN_Msk); NVIC_EnableIRQ(UART02_IRQn); } /* Trigger PDMA */ PDMA0->CSR |= (PDMA_CSR_TRIG_EN_Msk | PDMA_CSR_PDMACEN_Msk); if(g_u32TwoChannelPdmaTest==1) PDMA1->CSR |= (PDMA_CSR_TRIG_EN_Msk | PDMA_CSR_PDMACEN_Msk); /* Enable UART Tx and Rx PDMA function */ if(g_u32TwoChannelPdmaTest==1) UART1->IER |= UART_IER_DMA_TX_EN_Msk; else UART1->IER &= ~UART_IER_DMA_TX_EN_Msk; UART1->IER |= UART_IER_DMA_RX_EN_Msk; /* Wait for PDMA operation finish */ while(IsTestOver == FALSE); /* Disable UART Tx and Rx PDMA function */ UART1->IER &= ~(UART_IER_DMA_TX_EN_Msk|UART_IER_DMA_RX_EN_Msk); /* Disable PDMA channel */ PDMA_GCR->GCRCSR = 0; /* Disable PDMA Interrupt */ PDMA0->IER &= ~PDMA_IER_BLKD_IE_Msk; NVIC_DisableIRQ(PDMA_IRQn); /* Disable UART0 RDA interrupt */ UART_DISABLE_INT(UART0, UART_IER_RDA_IEN_Msk); NVIC_DisableIRQ(UART02_IRQn); }
/*---------------------------------------------------------------------------------------------------------*/ void PDMA_UART(int32_t i32option) { uint32_t UARTPort; volatile uint32_t i; BuildSrcPattern((uint32_t)SrcArray,UART_TEST_LENGTH); UARTPort = UART1_BASE; ClearBuf((uint32_t)DestArray, UART_TEST_LENGTH,0xFF); SYSCLK->AHBCLK|= SYSCLK_AHBCLK_PDMA_EN_Msk; if(i32option =='1') { printf(" [Using TWO PDMA channel]. \n"); printf(" This sample code will use PDMA to do UART1 loopback 10 times test. \n"); printf(" Please connect GPB4 <--> GPB5 before testing.\n"); printf(" After connecting GPB4 <--> GPB5, press any key to start transfer.\n"); g_u32TwoChannelPdmaTest = 1; uart_getchar(); } else { UART_TEST_LENGTH = 2; /* Test Length */ printf(" [Using ONE PDMA channel]. \n"); printf(" This sample code will use PDMA to do UART1 Rx test ten times. \n"); printf(" Please connect GPB4 <--> GPB5 before testing.\n"); printf(" After connecting GPB4 <--> GPB5, press any key to start transfer.\n"); g_u32TwoChannelPdmaTest = 0; uart_getchar(); printf(" Please input %d bytes to trigger PDMA one time.(Ex: Press 'a''b')\n",UART_TEST_LENGTH); } if(g_u32TwoChannelPdmaTest==1) { /* PDMA Setting */ _PDMAGCR_PDSSR1_UART1_TXSEL(1); /* CH1 TX Setting */ /* Enable PDMA channel 1 clock */ PDMA_GCR->GCRCSR|= PDMA_GCRCSR_CLK1_EN_Msk; /* Enable PDMA channel 1, Set Source/destination transfer direction, Set PDMA mode, Set peripheral transfer width */ PDMA1->CSR = PDMA_CSR_PDMACEN_Msk | PDMA_CSR_SAD_SEL_INCREASE | PDMA_CSR_DAD_SEL_FIXED | PDMA_CSR_APB_TWS_8BITS | PDMA_CSR_MODE_SEL_M2P; PDMA1->SAR = (uint32_t)SrcArray; /* Set Source Address */ PDMA1->DAR = UARTPort; /* Set Destination Address */ PDMA1->BCR = UART_TEST_LENGTH; } /* PDMA Setting */ _PDMAGCR_PDSSR1_UART1_RXSEL(0); /* CH0 RX Setting */ /* Enable PDMA channel 0 clock */ PDMA_GCR->GCRCSR|= PDMA_GCRCSR_CLK0_EN_Msk; /* Enable PDMA channel 0, Set Source/destination transfer direction, Set PDMA mode, Set peripheral transfer width */ PDMA0->CSR = PDMA_CSR_PDMACEN_Msk | PDMA_CSR_SAD_SEL_FIXED | PDMA_CSR_DAD_SEL_INCREASE | PDMA_CSR_APB_TWS_8BITS | PDMA_CSR_MODE_SEL_P2M; PDMA0->SAR = UARTPort; /* Set Source Address */ PDMA0->DAR = (uint32_t)DestArray; /* Set Destination Address */ PDMA0->BCR = UART_TEST_LENGTH; /* Enable PDMA Block Transfer Done Interrupt */ PDMA0->IER = PDMA_IER_BLKD_IE_Msk; NVIC_EnableIRQ(PDMA_IRQn); if(g_u32TwoChannelPdmaTest==0) { UART0->IER|= UART_IER_RDA_IEN_Msk; NVIC_EnableIRQ(UART02_IRQn); } /* Trigger PDMA0 */ PDMA0->CSR|= PDMA_CSR_TRIG_EN_Msk; if(g_u32TwoChannelPdmaTest==1) PDMA1->CSR|= PDMA_CSR_TRIG_EN_Msk; /* Enable UART1 TX and RX DMA function */ if(g_u32TwoChannelPdmaTest==1) UART1->IER|= UART_IER_DMA_TX_EN_Msk; else UART1->IER&= ~UART_IER_DMA_TX_EN_Msk; UART1->IER|= UART_IER_DMA_RX_EN_Msk; IntCnt = 0; /* Trigger PDMA 10 time and the S/W Flag will be change in PDMA callback funtion */ while(IsTestOver==FALSE); /* Disable PDMA clock */ SYSCLK->AHBCLK&= ~SYSCLK_AHBCLK_PDMA_EN_Msk; /* Disable UART0 RDA interrupt */ UART0->IER&= ~UART_IER_RDA_IEN_Msk; NVIC_DisableIRQ(UART02_IRQn); return; }