dma_drv.c 1.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263
  1. #include "board.h"
  2. static int16_t DMA_ClkNest = 0;
  3. void DMA_ReqClkOn(void)
  4. {
  5. rt_base_t level;
  6. level = rt_hw_interrupt_disable();
  7. DMA_ClkNest++;
  8. M0P_SYSCTRL->PERI_CLKEN0 |= (1u<<29); // set DMA clk on
  9. rt_hw_interrupt_enable(level);
  10. }
  11. void DMA_ReqClkOff(void)
  12. {
  13. rt_base_t level;
  14. level = rt_hw_interrupt_disable();
  15. DMA_ClkNest--;
  16. if (DMA_ClkNest<=0){
  17. DMA_ClkNest = 0;
  18. M0P_SYSCTRL->PERI_CLKEN0 &= ~(1u<<29); // set DMA clk off
  19. }
  20. rt_hw_interrupt_enable(level);
  21. }
  22. uint16_t DMA_Busy(void)
  23. {
  24. uint16_t Flag;
  25. rt_base_t level;
  26. level = rt_hw_interrupt_disable();
  27. if (DMA_ClkNest<=0){ // must judge it at first to assure DMA clock is on
  28. Flag = 0x0000u;
  29. } else if ((M0P_DMAC->CONFA0 | M0P_DMAC->CONFA1) & (0x1u<<31)){
  30. Flag = 0x0001u;
  31. } else {
  32. Flag = 0x0000u;
  33. }
  34. rt_hw_interrupt_enable(level);
  35. return(Flag);
  36. }
  37. // interrupt routine
  38. void DMAC_IRQHandler(void)
  39. {
  40. // // for TDC SPI
  41. // if (M0P_DMAC->CONFB0_f.STAT) {
  42. // M0P_DMAC->CONFB0_f.STAT = 0; // clear DMA interrupt
  43. // DMA_ReqClkOff();
  44. // }
  45. // for LPUART1 Serplot
  46. if (M0P_DMAC->CONFB1_f.STAT) {
  47. M0P_DMAC->CONFB1_f.STAT = 0; // clear DMA interrupt
  48. DMA_ReqClkOff();
  49. }
  50. }