/*! \brief check DMA flag and interrupt enable bit is set or not \param[in] dma_periph: DMAx(x=0,1) \arg DMAx(x=0,1) \param[in] channelx: specify which DMA channel to get flag \arg DMA0: DMA_CHx(x=0..6), DMA1: DMA_CHx(x=0..4) \param[in] flag: specify get which flag only one parameter can be selected which is shown as below: \arg DMA_INT_FLAG_FTF: full transfer finish interrupt flag of channel \arg DMA_INT_FLAG_HTF: half transfer finish interrupt flag of channel \arg DMA_INT_FLAG_ERR: error interrupt flag of channel \param[out] none \retval FlagStatus: SET or RESET */ FlagStatus dma_interrupt_flag_get(uint32_t dma_periph, dma_channel_enum channelx, uint32_t flag) { uint32_t interrupt_enable = 0U, interrupt_flag = 0U; switch(flag){ case DMA_INT_FLAG_FTF: interrupt_flag = DMA_INTF(dma_periph) & DMA_FLAG_ADD(flag, channelx); interrupt_enable = DMA_CHCTL(dma_periph, channelx) & DMA_CHXCTL_FTFIE; break; case DMA_INT_FLAG_HTF: interrupt_flag = DMA_INTF(dma_periph) & DMA_FLAG_ADD(flag, channelx); interrupt_enable = DMA_CHCTL(dma_periph, channelx) & DMA_CHXCTL_HTFIE; break; case DMA_INT_FLAG_ERR: interrupt_flag = DMA_INTF(dma_periph) & DMA_FLAG_ADD(flag, channelx); interrupt_enable = DMA_CHCTL(dma_periph, channelx) & DMA_CHXCTL_ERRIE; break; default: DMA_WRONG_HANDLE } if(interrupt_flag && interrupt_enable){ return SET; }else{ return RESET; } }
/*! \brief clear DMA a channel interrupt flag \param[in] dma_periph: DMAx(x=0,1) \arg DMAx(x=0,1) \param[in] channelx: specify which DMA channel to clear interrupt flag \arg DMA_CHx(x=0..7) \param[in] interrupt: specify get which flag \arg DMA_INTC_FEEIFC: clear FIFO error and exception flag \arg DMA_INTC_SDEIFC: clear single data mode exception flag \arg DMA_INTC_TAEIFC: clear transfer access error flag \arg DMA_INTC_HTFIFC: clear half transfer finish flag \arg DMA_INTC_FTFIFC: clear full transger finish flag \param[out] none \retval none */ void dma_interrupt_flag_clear(uint32_t dma_periph,dma_channel_enum channelx,uint32_t interrupt) { if(channelx < DMA_CH4){ DMA_INTC0(dma_periph) |= DMA_FLAG_ADD(interrupt,channelx); }else{ channelx -= (dma_channel_enum)4; DMA_INTC1(dma_periph) |= DMA_FLAG_ADD(interrupt,channelx); } }
/*! \brief deinitialize DMA a channel registers \param[in] dma_periph: DMAx(x=0,1) \arg DMAx(x=0,1) \param[in] channelx: specify which DMA channel is deinitialized \arg DMA_CHx(x=0..7) \param[out] none \retval none */ void dma_deinit(uint32_t dma_periph,dma_channel_enum channelx) { /* disable DMA a channel */ DMA_CHCTL(dma_periph,channelx) &= ~DMA_CHXCTL_CHEN; /* reset DMA channel registers */ DMA_CHCTL(dma_periph,channelx) = DMA_CHCTL_RESET_VALUE; DMA_CHCNT(dma_periph,channelx) = DMA_CHCNT_RESET_VALUE; DMA_CHPADDR(dma_periph,channelx) = DMA_CHPADDR_RESET_VALUE; DMA_CHM0ADDR(dma_periph,channelx) = DMA_CHMADDR_RESET_VALUE; DMA_CHM1ADDR(dma_periph,channelx) = DMA_CHMADDR_RESET_VALUE; DMA_CHFCTL(dma_periph,channelx) = DMA_CHFCTL_RESET_VALUE; if(channelx < DMA_CH4){ DMA_INTC0(dma_periph) |= DMA_FLAG_ADD(DMA_CHINTF_RESET_VALUE,channelx); }else{ DMA_INTC1(dma_periph) |= DMA_FLAG_ADD(DMA_CHINTF_RESET_VALUE,channelx); } }
/*! \brief get DMA flag is set or not \param[in] dma_periph: DMAx(x=0,1) \arg DMAx(x=0,1) \param[in] channelx: specify which DMA channel to get flag \arg DMA_CHx(x=0..7) \param[in] flag: specify get which flag \arg DMA_INTF_FEEIF: FIFO error and exception flag \arg DMA_INTF_SDEIF: single data mode exception flag \arg DMA_INTF_TAEIF: transfer access error flag \arg DMA_INTF_HTFIF: half transfer finish flag \arg DMA_INTF_FTFIF: full transger finish flag \param[out] none \retval FlagStatus: SET or RESET */ FlagStatus dma_flag_get(uint32_t dma_periph,dma_channel_enum channelx,uint32_t flag) { if(channelx < DMA_CH4){ if(DMA_INTF0(dma_periph) & DMA_FLAG_ADD(flag,channelx)){ return SET; }else{ return RESET; } }else{ channelx -= (dma_channel_enum)4; if(DMA_INTF1(dma_periph) & DMA_FLAG_ADD(flag,channelx)){ return SET; }else{ return RESET; } } }
/*! \brief check DMA flag is set or not \param[in] channelx: specify which DMA channel to get flag \arg DMA_CHx(x=0..6) \param[in] flag: specify get which flag \arg DMA_INTF_ANYIF: global interrupt flag of channel \arg DMA_CHXCTL_FTFIF: transfer complete flag of channel \arg DMA_CHXCTL_HTFIF: half transfer complete flag of channel \arg DMA_CHXCTL_TAEIF: error flag of channel \param[out] none \retval FlagStatus: SET or RESET */ FlagStatus dma_interrupt_flag_get(dma_channel_enum channelx,uint32_t flag) { if(DMA_INTF & DMA_FLAG_ADD(flag,channelx)){ return SET; }else{ return RESET; } }
/*! \brief deinitialize DMA a channel registers \param[in] channelx: specify which DMA channel is deinitialized \arg DMA_CHx(x=0..6) \param[out] none \retval none */ void dma_deinit(dma_channel_enum channelx) { /* disable DMA a channel */ DMA_CHCTL(channelx) &= ~DMA_CHXCTL_CHEN; /* reset DMA channel registers */ DMA_CHCTL(channelx) = DMA_CHCTL_RESET_VALUE; DMA_CHCNT(channelx) = DMA_CHCNT_RESET_VALUE; DMA_CHPADDR(channelx) = DMA_CHPADDR_RESET_VALUE; DMA_CHMADDR(channelx) = DMA_CHMADDR_RESET_VALUE; DMA_INTC |= DMA_FLAG_ADD(DMA_CHINTF_RESET_VALUE,channelx); }
/*! \brief check DMA flag is set or not \param[in] dma_periph: DMAx(x=0,1) \arg DMAx(x=0,1) \param[in] channelx: specify which DMA channel to get flag \arg DMA0: DMA_CHx(x=0..6), DMA1: DMA_CHx(x=0..4) \param[in] flag: specify get which flag only one parameter can be selected which is shown as below: \arg DMA_FLAG_G: global interrupt flag of channel \arg DMA_FLAG_FTF: full transfer finish flag of channel \arg DMA_FLAG_HTF: half transfer finish flag of channel \arg DMA_FLAG_ERR: error flag of channel \param[out] none \retval FlagStatus: SET or RESET */ FlagStatus dma_flag_get(uint32_t dma_periph, dma_channel_enum channelx, uint32_t flag) { FlagStatus reval; if(RESET != (DMA_INTF(dma_periph) & DMA_FLAG_ADD(flag, channelx))){ reval = SET; }else{ reval = RESET; } return reval; }
/*! \brief deinitialize DMA a channel registers \param[in] dma_periph: DMAx(x=0,1) \arg DMAx(x=0,1) \param[in] channelx: specify which DMA channel is deinitialized \arg DMA0: DMA_CHx(x=0..6), DMA1: DMA_CHx(x=0..4) \param[out] none \retval none */ void dma_deinit(uint32_t dma_periph, dma_channel_enum channelx) { if(ERROR == dma_periph_and_channel_check(dma_periph, channelx)){ DMA_WRONG_HANDLE } /* disable DMA a channel */ DMA_CHCTL(dma_periph, channelx) &= ~DMA_CHXCTL_CHEN; /* reset DMA channel registers */ DMA_CHCTL(dma_periph, channelx) = DMA_CHCTL_RESET_VALUE; DMA_CHCNT(dma_periph, channelx) = DMA_CHCNT_RESET_VALUE; DMA_CHPADDR(dma_periph, channelx) = DMA_CHPADDR_RESET_VALUE; DMA_CHMADDR(dma_periph, channelx) = DMA_CHMADDR_RESET_VALUE; DMA_INTC(dma_periph) |= DMA_FLAG_ADD(DMA_CHINTF_RESET_VALUE, channelx); }
/*! \brief get DMA interrupt flag is set or not \param[in] dma_periph: DMAx(x=0,1) \arg DMAx(x=0,1) \param[in] channelx: specify which DMA channel to get interrupt flag \arg DMA_CHx(x=0..7) \param[in] interrupt: specify get which flag \arg DMA_INTF_FEEIF: FIFO error and exception flag \arg DMA_INTF_SDEIF: single data mode exception flag \arg DMA_INTF_TAEIF: transfer access error flag \arg DMA_INTF_HTFIF: half transfer finish flag \arg DMA_INTF_FTFIF: full transger finish flag \param[out] none \retval FlagStatus: SET or RESET */ FlagStatus dma_interrupt_flag_get(uint32_t dma_periph,dma_channel_enum channelx,uint32_t interrupt) { uint32_t interrupt_enable = 0U,interrupt_flag = 0U; dma_channel_enum channel_flag_offset = channelx; if(channelx < DMA_CH4){ switch(interrupt){ case DMA_INTF_FEEIF: interrupt_flag = DMA_INTF0(dma_periph) & DMA_FLAG_ADD(interrupt,channelx); interrupt_enable = DMA_CHFCTL(dma_periph,channelx) & DMA_CHXFCTL_FEEIE; break; case DMA_INTF_SDEIF: interrupt_flag = DMA_INTF0(dma_periph) & DMA_FLAG_ADD(interrupt,channelx); interrupt_enable = DMA_CHCTL(dma_periph,channelx) & DMA_CHXCTL_SDEIE; break; case DMA_INTF_TAEIF: interrupt_flag = DMA_INTF0(dma_periph) & DMA_FLAG_ADD(interrupt,channelx); interrupt_enable = DMA_CHCTL(dma_periph,channelx) & DMA_CHXCTL_TAEIE; break; case DMA_INTF_HTFIF: interrupt_flag = DMA_INTF0(dma_periph) & DMA_FLAG_ADD(interrupt,channelx); interrupt_enable = DMA_CHCTL(dma_periph,channelx) & DMA_CHXCTL_HTFIE; break; case DMA_INTF_FTFIF: interrupt_flag = (DMA_INTF0(dma_periph) & DMA_FLAG_ADD(interrupt,channelx)); interrupt_enable = (DMA_CHCTL(dma_periph,channelx) & DMA_CHXCTL_FTFIE); break; default: break; } }else{ channel_flag_offset -= (dma_channel_enum)4; switch(interrupt){ case DMA_INTF_FEEIF: interrupt_flag = DMA_INTF1(dma_periph) & DMA_FLAG_ADD(interrupt,channel_flag_offset); interrupt_enable = DMA_CHFCTL(dma_periph,channelx) & DMA_CHXFCTL_FEEIE; break; case DMA_INTF_SDEIF: interrupt_flag = DMA_INTF1(dma_periph) & DMA_FLAG_ADD(interrupt,channel_flag_offset); interrupt_enable = DMA_CHCTL(dma_periph,channelx) & DMA_CHXCTL_SDEIE; break; case DMA_INTF_TAEIF: interrupt_flag = DMA_INTF1(dma_periph) & DMA_FLAG_ADD(interrupt,channel_flag_offset); interrupt_enable = DMA_CHCTL(dma_periph,channelx) & DMA_CHXCTL_TAEIE; break; case DMA_INTF_HTFIF: interrupt_flag = DMA_INTF1(dma_periph) & DMA_FLAG_ADD(interrupt,channel_flag_offset); interrupt_enable = DMA_CHCTL(dma_periph,channelx) & DMA_CHXCTL_HTFIE; break; case DMA_INTF_FTFIF: interrupt_flag = DMA_INTF1(dma_periph) & DMA_FLAG_ADD(interrupt,channel_flag_offset); interrupt_enable = DMA_CHCTL(dma_periph,channelx) & DMA_CHXCTL_FTFIE; break; default: break; } } if(interrupt_flag && interrupt_enable){ return SET; }else{ return RESET; } }
/*! \brief clear DMA a channel flag \param[in] dma_periph: DMAx(x=0,1) \arg DMAx(x=0,1) \param[in] channelx: specify which DMA channel to clear flag \arg DMA0: DMA_CHx(x=0..6), DMA1: DMA_CHx(x=0..4) \param[in] flag: specify get which flag only one parameter can be selected which is shown as below: \arg DMA_INT_FLAG_G: global interrupt flag of channel \arg DMA_INT_FLAG_FTF: full transfer finish interrupt flag of channel \arg DMA_INT_FLAG_HTF: half transfer finish interrupt flag of channel \arg DMA_INT_FLAG_ERR: error interrupt flag of channel \param[out] none \retval none */ void dma_interrupt_flag_clear(uint32_t dma_periph, dma_channel_enum channelx, uint32_t flag) { DMA_INTC(dma_periph) |= DMA_FLAG_ADD(flag, channelx); }
/*! \brief clear DMA a channel flag \param[in] channelx: specify which DMA channel to clear flag \arg DMA_CHx(x=0..6) \param[in] flag: specify get which flag \arg DMA_INTF_ANYIC: clear global interrupt flag of channel \arg DMA_CHXCTL_FTFIF: clear transfer complete flag of channel \arg DMA_CHXCTL_HTFIFC: clear half transfer complete flag of channel \arg DMA_CHXCTL_TAEIFC: clear error flag of channel \param[out] none \retval none */ void dma_interrupt_flag_clear(dma_channel_enum channelx,uint32_t flag) { DMA_INTC |= DMA_FLAG_ADD(flag,channelx); }