DMA.c 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138
  1. #include <MyProject.h>
  2. /**
  3. @function Conf_DMA
  4. @brief DMA配置
  5. @param[in] DMAx: DMA通道
  6. ** DMAPipe: DMA管道,可选参数如下
  7. UART1_XDATA UART1-->XDATA
  8. XDATA_UART1 UART1<--XDATA
  9. I2C_XDATA I2C -->XDATA
  10. XDATA_I2C I2C <--XDATA
  11. SPI_XDATA SPI -->XDATA
  12. XDATA_SPI SPI <--XDATA
  13. UART2_XDATA UART2-->XDATA
  14. XDATA_UART2 UART2<--XDATA
  15. ** DMAAddr: 传输首地址,可取地址范围:0x0000~0x0317
  16. ** DMALen: DMALen 数据包大小(1~64)
  17. @return None
  18. @date 2025-11-05
  19. */
  20. void Conf_DMA(uint8_t DMAx, uint8_t DMAPipe, uint16_t DMAAddr, uint8_t DMALen)
  21. {
  22. // 等待DMAx传输结束
  23. Wait_DMA(DMAx);
  24. // 禁止DMAx的传输
  25. ClrBit(*(&DMA0_CR0 + DMAx), DMAEN);
  26. // 设置DMAx的传输管道
  27. SetReg(*(&DMA0_CR0 + DMAx), DMA_PIPE, DMAPipe);
  28. // 设置DMAx传输数量
  29. *(&DMA0_LEN + DMAx) = DMALen - 1;
  30. // 设置DMAx传输首地址
  31. *(&DMA0_BA + DMAx) = DMAAddr & 0x07ff;
  32. }
  33. /**
  34. @function Set_DMA_Pipe
  35. @brief 配置DMA传输通道
  36. @param[in] DMAx: [输入/出]
  37. ** DMAPipe: [输入/出]
  38. @date 2025-11-05
  39. */
  40. void Set_DMA_Pipe(uint8_t DMAx, uint8_t DMAPipe)
  41. {
  42. bool bTmp = false;
  43. if (ReadBit(*(&DMA0_CR0 + DMAx), DMAEN))
  44. {
  45. bTmp = true;
  46. while (ReadBit(*(&DMA0_CR0 + DMAx), DMABSY));
  47. ClrBit(*(&DMA0_CR0 + DMAx), DMAEN);
  48. }
  49. SetReg(*(&DMA0_CR0 + DMAx), DMACFG2 | DMACFG1 | DMACFG0, DMAPipe);
  50. if (bTmp)
  51. { SetBit(*(&DMA0_CR0 + DMAx), DMAEN); }
  52. }
  53. /**
  54. @function Set_DMA_Data_Package
  55. @brief 配置DMA传输数据
  56. @param[in] DMAx: [输入/出]
  57. ** ulAddr: [输入/出]
  58. ** cLen: [输入/出]
  59. @date 2025-11-05
  60. */
  61. void Set_DMA_Data_Package(uint8_t DMAx, uint16_t ulAddr, uint8_t cLen)
  62. {
  63. bool bTmp = false;
  64. if (ReadBit(*(&DMA0_CR0 + DMAx), DMAEN))
  65. {
  66. bTmp = true;
  67. while (ReadBit(*(&DMA0_CR0 + DMAx), DMABSY));
  68. ClrBit(*(&DMA0_CR0 + DMAx), DMAEN);
  69. }
  70. *(&DMA0_LEN + DMAx) = cLen - 1;
  71. *(&DMA0_BA + 2 * DMAx) = ulAddr;
  72. if (bTmp)
  73. { SetBit(*(&DMA0_CR0 + DMAx), DMAEN); }
  74. }
  75. /**
  76. @function Start_DMA
  77. @brief 启动DMA传输
  78. @param[in] DMAx: [输入/出]
  79. @date 2025-11-05
  80. */
  81. void Start_DMA(uint8_t DMAx)
  82. {
  83. SetBit(*(&DMA0_CR0 + DMAx), DMAEN | DMABSY);
  84. }
  85. /**
  86. @function Get_DMA_Status
  87. @brief 获取DMA状态
  88. @param[in] DMAx: [输入/出]
  89. ** DMAStatus: [输入/出]
  90. @return 状态
  91. @date 2025-11-05
  92. */
  93. bool Get_DMA_Status(uint8_t DMAx, uint8_t DMAStatus)
  94. {
  95. return ReadBit(*(&DMA0_CR0 + DMAx), DMAStatus);
  96. }
  97. /**
  98. @function Set_IRQ_DMA
  99. @brief 使能中断 配置中断优先级
  100. @param[in] DMA_IRQ: [输入/出]
  101. @date 2025-11-05
  102. */
  103. void Set_IRQ_DMA(uint8_t DMA_IRQ_Priority)
  104. {
  105. // 使能DMA中断
  106. SetBit(DMA0_CR0, DMAIE);
  107. if (!EA)
  108. {
  109. EA = 1;
  110. }
  111. // 配置中断优先级
  112. SetReg(IP1, PDMA1 | PDMA0, DMA_IRQ_Priority);
  113. }