#include "board.h" static int16_t DMA_ClkNest = 0; void DMA_ReqClkOn(void) { rt_base_t level; level = rt_hw_interrupt_disable(); DMA_ClkNest++; M0P_SYSCTRL->PERI_CLKEN0 |= (1u<<29); // set DMA clk on rt_hw_interrupt_enable(level); } void DMA_ReqClkOff(void) { rt_base_t level; level = rt_hw_interrupt_disable(); DMA_ClkNest--; if (DMA_ClkNest<=0){ DMA_ClkNest = 0; M0P_SYSCTRL->PERI_CLKEN0 &= ~(1u<<29); // set DMA clk off } rt_hw_interrupt_enable(level); } uint16_t DMA_Busy(void) { uint16_t Flag; rt_base_t level; level = rt_hw_interrupt_disable(); if (DMA_ClkNest<=0){ // must judge it at first to assure DMA clock is on Flag = 0x0000u; } else if ((M0P_DMAC->CONFA0 | M0P_DMAC->CONFA1) & (0x1u<<31)){ Flag = 0x0001u; } else { Flag = 0x0000u; } rt_hw_interrupt_enable(level); return(Flag); } // interrupt routine void DMAC_IRQHandler(void) { // // for TDC SPI // if (M0P_DMAC->CONFB0_f.STAT) { // M0P_DMAC->CONFB0_f.STAT = 0; // clear DMA interrupt // DMA_ReqClkOff(); // } // for LPUART1 Serplot if (M0P_DMAC->CONFB1_f.STAT) { M0P_DMAC->CONFB1_f.STAT = 0; // clear DMA interrupt DMA_ReqClkOff(); } }