Example #1
0
/*---------------------------------------------------------------------------------------------------------*/
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);   	
}
Example #2
0
/*---------------------------------------------------------------------------------------------------------*/
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;

}