/*********************************************************************//** * @brief Check if corresponding channel does have an active interrupt * request or not * @param[in] type type of status, should be: * - GPDMA_STAT_INT: GPDMA Interrupt Status * - GPDMA_STAT_INTTC: GPDMA Interrupt Terminal Count Request Status * - GPDMA_STAT_INTERR: GPDMA Interrupt Error Status * - GPDMA_STAT_RAWINTTC: GPDMA Raw Interrupt Terminal Count Status * - GPDMA_STAT_RAWINTERR: GPDMA Raw Error Interrupt Status * - GPDMA_STAT_ENABLED_CH:GPDMA Enabled Channel Status * @param[in] channel GPDMA channel, should be in range from 0 to 7 * @return IntStatus status of DMA channel interrupt after masking * Should be: * - SET: the corresponding channel has no active interrupt request * - RESET: the corresponding channel does have an active interrupt request **********************************************************************/ IntStatus GPDMA_IntGetStatus(GPDMA_Status_Type type, uint8_t channel) { CHECK_PARAM(PARAM_GPDMA_STAT(type)); CHECK_PARAM(PARAM_GPDMA_CHANNEL(channel)); switch (type) { case GPDMA_STAT_INT: //check status of DMA channel interrupts if (LPC_GPDMA->DMACIntStat & (GPDMA_DMACIntStat_Ch(channel))) return SET; return RESET; case GPDMA_STAT_INTTC: // check terminal count interrupt request status for DMA if (LPC_GPDMA->DMACIntTCStat & GPDMA_DMACIntTCStat_Ch(channel)) return SET; return RESET; case GPDMA_STAT_INTERR: //check interrupt status for DMA channels if (LPC_GPDMA->DMACIntErrStat & GPDMA_DMACIntTCClear_Ch(channel)) return SET; return RESET; case GPDMA_STAT_RAWINTTC: //check status of the terminal count interrupt for DMA channels if (LPC_GPDMA->DMACRawIntErrStat & GPDMA_DMACRawIntTCStat_Ch(channel)) return SET; return RESET; case GPDMA_STAT_RAWINTERR: //check status of the error interrupt for DMA channels if (LPC_GPDMA->DMACRawIntTCStat & GPDMA_DMACRawIntErrStat_Ch(channel)) return SET; return RESET; default: //check enable status for DMA channels if (LPC_GPDMA->DMACEnbldChns & GPDMA_DMACEnbldChns_Ch(channel)) return SET; return RESET; } }
/*********************************************************************//** * @brief Standard GPDMA interrupt handler, this function will check * all interrupt status of GPDMA channels, then execute the call * back function id they're already installed * @param[in] None * @return None **********************************************************************/ void GPDMA_IntHandler(void) { uint32_t tmp; // Scan interrupt pending for (tmp = 0; tmp <= 7; tmp++) { if (LPC_GPDMA->DMACIntStat & GPDMA_DMACIntStat_Ch(tmp)) { // Check counter terminal status if (LPC_GPDMA->DMACIntTCStat & GPDMA_DMACIntTCStat_Ch(tmp)) { // Clear terminate counter Interrupt pending LPC_GPDMA->DMACIntTCClear = GPDMA_DMACIntTCClear_Ch(tmp); // Execute call-back function if it is already installed if(_apfnGPDMACbs[tmp] != NULL) { _apfnGPDMACbs[tmp](GPDMA_STAT_INTTC); } } // Check error terminal status if (LPC_GPDMA->DMACIntErrStat & GPDMA_DMACIntErrStat_Ch(tmp)) { // Clear error counter Interrupt pending LPC_GPDMA->DMACIntErrClr = GPDMA_DMACIntErrClr_Ch(tmp); // Execute call-back function if it is already installed if(_apfnGPDMACbs[tmp] != NULL) { _apfnGPDMACbs[tmp](GPDMA_STAT_INTERR); } } } } }