| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263 |
-
- #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();
- }
- }
|