⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 drvpdma.c

📁 cortex-m0 LCD1602程序
💻 C
📖 第 1 页 / 共 4 页
字号:
/* Description:                                                                                            */
/*               The function is used to get peripheral transfer width from channelx                       */
/*---------------------------------------------------------------------------------------------------------*/
int32_t DrvPDMA_GetAPBTransferWidth(E_DRVPDMA_CHANNEL_INDEX eChannel)
{
 	PDMA_T * tPDMA;
	   																		/* Check Channel is valid */
    if (eChannel > MAX_CHANNEL_NUM  )	    						   /* Check Channel is valid */
        return E_DRVPDMA_ERR_PORT_INVALID;    

	tPDMA = (PDMA_T *)((uint32_t)PDMA0 + eChannel * CHANNEL_OFFSET); 

	return (int32_t)(tPDMA->CSR.APB_TWS);            					    /* Get Transfer Length */   
}

/*---------------------------------------------------------------------------------------------------------*/
/* Function:     DrvPDMA_SetCHForAPBDevice                                                                 */
/*                                                                                                         */
/* Parameter:        																					   */	
/*				 eChannel			-[in]   PDMA Source: eDRVPDMA_CHANNEL_0 ~ 8                            */
/*               eDevice	   		-[in]   APB device   					          	         		   */
/*                                          It includes eDRVPDMA_SPI0~3,eDRVPDMA_UART0~1,                  */
/*                                                eDRVPDMA_ADC ,eDRVPDMA_I2S                               */
/*               eRWAPB             -[in]   Access Direction                                               */
/*                                          It includes eDRVPDMA_WRITE_APB/eDRVPDMA_READ_APB               */
/*                                                                                                         */
/* Returns:                                                                                                */
/*               E_SUCCESS            			Success                 								   */
/*               E_DRVPDMA_ERR_PORT_INVALID     Invalid port number        								   */
/*               E_DRVPDMA_FALSE_INPUT          Invalid APB device                                         */
/* Description:                                                                                            */
/*               The function is used to select PDMA channel for APB device                                */
/*---------------------------------------------------------------------------------------------------------*/
int32_t	DrvPDMA_SetCHForAPBDevice(
    E_DRVPDMA_CHANNEL_INDEX eChannel, 
    E_DRVPDMA_APB_DEVICE 	eDevice,
    E_DRVPDMA_APB_RW 		eRWAPB    
)
{  
    if (eChannel > MAX_CHANNEL_NUM  )	    						   /* Check Channel is valid */
        return E_DRVPDMA_ERR_PORT_INVALID;    
   
	switch(eDevice)
	{
		case eDRVPDMA_SPI0:												    /* Set SPI0 PDMA Channel */
			if(eRWAPB)	  
				PDMA_GCR->PDSSR0.SPI0_TXSEL	=	eChannel;
			else
				PDMA_GCR->PDSSR0.SPI0_RXSEL	=	eChannel;
	   		break;

	   	case eDRVPDMA_SPI1:													/* Set SPI1 PDMA Channel */
			if(eRWAPB)	  
				PDMA_GCR->PDSSR0.SPI1_TXSEL	=	eChannel;
			else
				PDMA_GCR->PDSSR0.SPI1_RXSEL	=	eChannel;
	   		break;
																			
		case eDRVPDMA_SPI2:													/* Set SPI2 PDMA Channel */
			if(eRWAPB)	
				PDMA_GCR->PDSSR0.SPI2_TXSEL	=	eChannel;
			else
				PDMA_GCR->PDSSR0.SPI2_RXSEL	=	eChannel;
	   		break;
																		   	
		case eDRVPDMA_SPI3:													/* Set SPI3 PDMA Channel */
			if(eRWAPB)	
				PDMA_GCR->PDSSR0.SPI3_TXSEL	=	eChannel;
			else
				PDMA_GCR->PDSSR0.SPI3_RXSEL	=	eChannel;
	   		break;

		case eDRVPDMA_UART0:											   	/* Set UART0 PDMA Channel */
			if(eRWAPB)	
				PDMA_GCR->PDSSR1.UART0_TXSEL	=	eChannel;
			else
				PDMA_GCR->PDSSR1.UART0_RXSEL	=	eChannel;
	   		break;
		case eDRVPDMA_UART1:												/* Set UART1 PDMA Channel */
			if(eRWAPB)	
				PDMA_GCR->PDSSR1.UART1_TXSEL	=	eChannel;
			else
				PDMA_GCR->PDSSR1.UART1_RXSEL	=	eChannel;
	   		break;
		case eDRVPDMA_ADC:													/* Set ADC PDMA Channel */
			if(eRWAPB)	
				return 	E_DRVPDMA_FALSE_INPUT;
			else
				PDMA_GCR->PDSSR1.ADC_RXSEL	=	eChannel;
	   		break;
		case eDRVPDMA_I2S:													/* Set I2S PDMA Channel */
			if(eRWAPB)	
				PDMA_GCR->PDSSR2.I2S_TXSEL	=	eChannel;
			else
				PDMA_GCR->PDSSR2.I2S_RXSEL	=	eChannel;
	   		break;
		default:
			return 	E_DRVPDMA_FALSE_INPUT;
	}
 
    return E_SUCCESS;  
}

/*---------------------------------------------------------------------------------------------------------*/
/* Function:     DrvPDMA_GetCHForAPBDevice	                                                               */
/*                                                                                                         */
/* Parameter:        																					   */	
/*				 eChannel			-[in]   PDMA Source: eDRVPDMA_CHANNEL_0 ~ 8                            */
/*               eDevice	   		-[in]   CH for APB device 			          	         			   */
/*                                          It includes eDRVPDMA_SPI0~3,eDRVPDMA_UART0~1,                  */
/*                                                eDRVPDMA_ADC,eDRVPDMA_I2S                                */
/* Returns:                                                                                                */
/*               0~8 : Channel 0~8                                                                         */
/*               E_DRVPDMA_FALSE_INPUT:   Wrong parameter                                                  */
/*               Others: Reserved                                                                          */
/*                                                                                                         */
/* Description:                                                                                            */
/*               The function is used to get PDMA channel for specified APB device                         */
/*---------------------------------------------------------------------------------------------------------*/
int32_t DrvPDMA_GetCHForAPBDevice(E_DRVPDMA_APB_DEVICE eDevice,E_DRVPDMA_APB_RW eRWAPB)
{
  
	switch(eDevice)
	{
		case eDRVPDMA_SPI0:
			if(eRWAPB)	  
				return PDMA_GCR->PDSSR0.SPI0_TXSEL;						 	/* Get SPI0 PDMA Channel */
			else
				return PDMA_GCR->PDSSR0.SPI0_RXSEL;
	   		
	   	case eDRVPDMA_SPI1:												 	/* Get SPI1 PDMA Channel */
			if(eRWAPB)	  
				return PDMA_GCR->PDSSR0.SPI1_TXSEL;
			else
				return PDMA_GCR->PDSSR0.SPI1_RXSEL;
	   		
		case eDRVPDMA_SPI2:												 	/* Get SPI2 PDMA Channel */
			if(eRWAPB)	
				return PDMA_GCR->PDSSR0.SPI2_TXSEL;
			else
				return PDMA_GCR->PDSSR0.SPI2_RXSEL;
	   																	 	
		case eDRVPDMA_SPI3:													/* Get SPI3 PDMA Channel */
			if(eRWAPB)	
				return PDMA_GCR->PDSSR0.SPI3_TXSEL;
			else
				return PDMA_GCR->PDSSR0.SPI3_RXSEL;
	   		
		case eDRVPDMA_UART0:											 	/* Get UART0 PDMA Channel */
			if(eRWAPB)	
				return PDMA_GCR->PDSSR1.UART0_TXSEL;
			else
				return PDMA_GCR->PDSSR1.UART0_RXSEL;
	   		
		case eDRVPDMA_UART1:											 	/* Get UART1 PDMA Channel */
			if(eRWAPB)	
				return PDMA_GCR->PDSSR1.UART1_TXSEL;
			else
				return PDMA_GCR->PDSSR1.UART1_RXSEL;
	   		
		case eDRVPDMA_ADC:													/* Get ADC PDMA Channel */
			if(eRWAPB)	
				return E_DRVPDMA_FALSE_INPUT;
			else
				return PDMA_GCR->PDSSR1.ADC_RXSEL;

		case eDRVPDMA_I2S:													/* Set I2S PDMA Channel */
			if(eRWAPB)	
				return PDMA_GCR->PDSSR2.I2S_TXSEL;
			else								 
				return PDMA_GCR->PDSSR2.I2S_RXSEL;
	   		
		default:
			return 	E_DRVPDMA_FALSE_INPUT;
	}
}


/*---------------------------------------------------------------------------------------------------------*/
/* Function:     DrvPDMA_CHSoftwareReset                                                                   */
/*                                                                                                         */
/* Parameter:        																					   */	
/*				 eChannel			-[in]   PDMA Source: eDRVPDMA_CHANNEL_0 ~ 8                            */
/* Returns:                                                                                                */
/*               E_SUCCESS               		Success                                                    */
/*               E_DRVPDMA_ERR_PORT_INVALID     Invalid port number                                        */
/* Description:                                                                                            */
/*               The function is used to do software reset Channelx                                        */
/*---------------------------------------------------------------------------------------------------------*/
int32_t DrvPDMA_CHSoftwareReset(E_DRVPDMA_CHANNEL_INDEX eChannel)
{
	PDMA_T * tPDMA;
	    
    if (eChannel > MAX_CHANNEL_NUM  )	    						   /* Check Channel is valid */
        return E_DRVPDMA_ERR_PORT_INVALID;    

	tPDMA = (PDMA_T *)((uint32_t)PDMA0 + eChannel * CHANNEL_OFFSET); 
 
   	tPDMA->CSR.SW_RST = 1;											   /* Set S/W Reset Bit */
 	
    return E_SUCCESS;     
}


/*---------------------------------------------------------------------------------------------------------*/
/* Function:     DrvPDMA_CHEnablelTransfer                                                                 */
/*                                                                                                         */
/* Parameter:        																					   */	
/*				 eChannel			-[in]   PDMA Source: eDRVPDMA_CHANNEL_0 ~ 8                            */
/* Returns:                                                                                                */
/*               E_SUCCESS               		Success                                                    */
/*               E_DRVPDMA_ERR_PORT_INVALID     Invalid port number                                        */
/* Description:                                                                                            */
/*               The function is used to enable PDMA channelx and enable channelx                          */
/*               data read or write transfer                                                               */
/*---------------------------------------------------------------------------------------------------------*/

int32_t	DrvPDMA_CHEnableTransfer(E_DRVPDMA_CHANNEL_INDEX eChannel)
{

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -