📄 drvpdma.c
字号:
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 + -