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

📄 drvpdma.c

📁 cortex-m0 LCD1602程序
💻 C
📖 第 1 页 / 共 4 页
字号:
    volatile uint32_t u32SFR;
	PDMA_T * tPDMA;
    																		/* Check PDMA 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);

    tPDMA->CSR.PDMACEN = 1;
    tPDMA->CSR.TRIG_EN = 1;												   /* PDMA Channl & Trigger Enable */

    return E_SUCCESS;      
}


/*---------------------------------------------------------------------------------------------------------*/
/* Function:     DrvPDMA_EnableInt			                                                               */
/*                                                                                                         */
/* Parameter:        																					   */	
/*				 eChannel				-[in]     PDMA Source: eDRVPDMA_CHANNEL_0 ~ 8                      */
/*               eIntFlag	   			-[in]     Intterrupt source: eDRVPDMA_TABORT/eDRVPDMA_BLKD         */
/* Returns:                                                                                                */
/*               E_SUCCESS               		Success                                                    */
/*               E_DRVPDMA_ERR_PORT_INVALID     Invalid port number                                        */
/* Description:                                                                                            */
/*               The function is used to enable Interrupt for channelx                                     */
/*---------------------------------------------------------------------------------------------------------*/
int32_t DrvPDMA_EnableInt(E_DRVPDMA_CHANNEL_INDEX eChannel,E_DRVPDMA_INT_ENABLE eIntSource)
{
    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); 
	
	if((eIntSource&eDRVPDMA_TABORT)!=0)
		tPDMA->IER.TABORT_IE = 1;

	if((eIntSource&eDRVPDMA_BLKD)!=0)
		tPDMA->IER.BLKD_IE = 1;
	    
    /* Enable Specified Interrupt */
	NVIC_EnableIRQ(PDMA_IRQn);  
   
    return E_SUCCESS;      
}

/*---------------------------------------------------------------------------------------------------------*/
/* Function:     DrvPDMA_DisableInt  		                                                               */
/*                                                                                                         */
/* Parameter:        																					   */	
/*				 eChannel				-[in]     PDMA Source: eDRVPDMA_CHANNEL_0 ~ 8                      */
/*               eIntFlag	   			-[in]     Intterrupt source: eDRVPDMA_TABORT/eDRVPDMA_BLKD         */
/* Returns:                                                                                                */
/*               E_SUCCESS               		Success                                                    */
/*               E_DRVPDMA_ERR_PORT_INVALID     Invalid port number                                        */
/* Description:                                                                                            */
/*               The function is used to disable Interrupt for channelx                                    */
/*---------------------------------------------------------------------------------------------------------*/

int32_t DrvPDMA_DisableInt(E_DRVPDMA_CHANNEL_INDEX eChannel,E_DRVPDMA_INT_ENABLE eIntSource)
{
    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); 
	
	if((eIntSource&eDRVPDMA_TABORT)!=0)					 					/* Disable Specified Interrupt */
		tPDMA->IER.TABORT_IE = 0;

	if((eIntSource&eDRVPDMA_BLKD)!=0)
		tPDMA->IER.BLKD_IE = 0;

	return E_SUCCESS; 
}

/*---------------------------------------------------------------------------------------------------------*/
/* Function:     DrvPDMA_IsIntEnabled   	                                                               */
/*                                                                                                         */
/* Parameter:        																					   */	
/*				 eChannel				-[in]     PDMA Source: eDRVPDMA_CHANNEL_0 ~ 8                      */
/*               eIntFlag	   			-[in]     Intterrupt source: eDRVPDMA_TABORT/eDRVPDMA_BLKD         */
/* Returns:                                                                                                */
/*               TRUE:     The Specified Source Interrupt is enable                                        */
/*               FASLE:    The Specified Source Interrupt is disable                                       */
/* Description:                                                                                            */
/*               The function is used to check if the specified interrupt source is enabled in Channelx    */
/*---------------------------------------------------------------------------------------------------------*/
int32_t	DrvPDMA_IsIntEnabled(E_DRVPDMA_CHANNEL_INDEX eChannel,E_DRVPDMA_INT_ENABLE eIntSource )
{
	PDMA_T * tPDMA;

	tPDMA = (PDMA_T *)((uint32_t)PDMA0 + eChannel * CHANNEL_OFFSET); 
	
	if(eIntSource==eDRVPDMA_TABORT)
	{
	  if(tPDMA->IER.TABORT_IE==1)
        return (tPDMA->IER.TABORT_IE)?TRUE:FALSE;
	}
	if(eIntSource==eDRVPDMA_BLKD)		   
	{
	  if(tPDMA->IER.BLKD_IE==1)
	    return (tPDMA->IER.BLKD_IE)?TRUE:FALSE;
	}
	return 0;
}

/*---------------------------------------------------------------------------------------------------------*/
/* Function:     DrvPDMA_ClearIntFlag		                                                               */
/*                                                                                                         */
/* Parameter:        																					   */	
/*				 eChannel				-[in]     PDMA Source: eDRVPDMA_CHANNEL_0 ~ 8                      */
/*               eIntFlag	   			-[in]     Intterrupt source: eDRVPDMA_TABORT/eDRVPDMA_BLKD         */
/* Returns:                                                                                                */
/*               None                                                                                      */
/* Description:                                                                                            */
/*               The function is used to clear interrupt status for channelx                               */
/*---------------------------------------------------------------------------------------------------------*/
void DrvPDMA_ClearIntFlag(E_DRVPDMA_CHANNEL_INDEX eChannel,E_DRVPDMA_INT_FLAG eIntFlag)
{
    volatile uint32_t u32SFR;
	
	u32SFR = (uint32_t)&PDMA0->ISR + eChannel * CHANNEL_OFFSET; 
    
    outpw(u32SFR, eIntFlag);
}
						  

/*---------------------------------------------------------------------------------------------------------*/
/* Function:     DrvPDMA_PollInt    		                                                               */
/*                                                                                                         */
/* Parameter:        																					   */	
/*				 eChannel				-[in]     PDMA Source: eDRVPDMA_CHANNEL_0 ~ 8                      */
/*               eIntFlag	   			-[in]     Intterrupt source: eDRVPDMA_TABORT/eDRVPDMA_BLKD         */
/* Returns:                                                                                                */
/*               TRUE:     The Source Interrupt Flag is set                                                */
/*               FASLE:    The Source Interrupt Flag is clear                                              */
/* Description:                                                                                            */
/*               The function is used to polling channel interrupt status                                  */
/*---------------------------------------------------------------------------------------------------------*/
int32_t	DrvPDMA_PollInt(E_DRVPDMA_CHANNEL_INDEX eChannel,E_DRVPDMA_INT_FLAG eIntFlag)
{
    volatile uint32_t u32SFR;
    
    u32SFR = (uint32_t) & PDMA0->ISR + eChannel * CHANNEL_OFFSET; 
    return inpw(u32SFR) & eIntFlag;
}
/*---------------------------------------------------------------------------------------------------------*/
/* Function:     DrvPDMA_GetInternalBufPointer				                                               */
/*                                                                                                         */
/* Parameter:        																					   */	
/*				 eChannel				-[in]     PDMA Source: eDRVPDMA_CHANNEL_0 ~ 8                      */
/* Returns:                                                                                                */
/*               Internal Buffer Pointer                                                                   */
/* Description:                                                                                            */
/*               The function is used to  Get Internal Buffer Pointer                                      */
/*---------------------------------------------------------------------------------------------------------*/
uint32_t DrvPDMA_GetInternalBufPointer(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); 

	return (uint32_t)(tPDMA->u32POINT);
}

/*---------------------------------------------------------------------------------------------------------*/
/* Function:     DrvPDMA_GetSharedBufData                                                                  */
/*                                                                                                         */
/* Parameter:        																					   */	
/*				 eChannel				-[in]     PDMA Source: eDRVPDMA_CHANNEL_0 ~ 8                      */
/* Returns:                                                                                                */
/*               Shard Buffer Content register                                                             */
/* Description:                                                                                            */
/*               The function is used to get shared buffer content from Channelx                           */
/*---------------------------------------------------------------------------------------------------------*/
uint32_t DrvPDMA_GetSharedBufData(E_DRVPDMA_CHANNEL_INDEX eChannel)
{
    volatile uint32_t u32SFR;
    
    u32SFR = (uint32_t)&PDMA0->SBUF + eChannel * CHANNEL_OFFSET;  
    
    return inpw(u32SFR);
}


/*---------------------------------------------------------------------------------------------------------*/
/* Function:     PDMA_IRQHandler     		                                                               */
/*                                                                                                         */
/* Parameter:        																					   */	
/*				 None 												                                       */
/* Returns:                                                                                                */
/*               None                                                                                      */
/* Description:                                                                                            */
/*               The function is used to  PDMA ISR                                                         */
/*---------------------------------------------------------------------------------------------------------*/
void PDMA_IRQHandler(void)
{
    volatile uint32_t u32IntStatus;
	volatile uint32_t u32SFR;
    volatile int32_t  i32Channel= 0 ;
	volatile uint32_t u32ISR;
	PDMA_T * tPDMA;
		
	u32SFR = inpw(&PDMA_GCR->GCRISR);

	for(i32Channel=0;i32Channel<MAX_CHANNEL_NUM;i32Channel++)  
	{
		tPDMA = (PDMA_T *)((uint32_t)PDMA0 + i32Channel * CHANNEL_OFFSET); 

		if(u32SFR & (1<<i32Channel))  										 		/* Check INT Channel */	
		{
			if(tPDMA->ISR.TABORT_IF==1)	 											/* Check Target Abort INT and clear */

⌨️ 快捷键说明

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