SWM341_dma.h 4.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111
  1. #ifndef __SWM341_DMA_H__
  2. #define __SWM341_DMA_H__
  3. typedef struct {
  4. uint8_t Mode; //DMA_MODE_SINGLE、DMA_MODE_CIRCLE
  5. uint8_t Unit; //DMA_UNIT_BYTE、DMA_UNIT_HALFWORD、DMA_UNIT_WORD
  6. uint32_t Count; //传输 Unit 个数,最大取值0x100000
  7. uint32_t SrcAddr;
  8. uint32_t DstAddr;
  9. uint8_t SrcAddrInc; //0 地址固定 1 地址递增
  10. uint8_t DstAddrInc;
  11. uint8_t Handshake; //传输握手信号:DMA_HS_NO、DMA_CH0_UART0TX、DMA_CH0_SPI0TX、... ...
  12. uint8_t Priority; //DMA_PRI_LOW、DMA_PRI_HIGH
  13. uint8_t DoneIE; //传输完成中断使能
  14. } DMA_InitStructure;
  15. #define DMA_CH0 0
  16. #define DMA_CH1 1
  17. #define DMA_CH2 2
  18. #define DMA_CH3 3
  19. #define DMA_MODE_SINGLE 0 // 单次模式,传输完成后停止
  20. #define DMA_MODE_CIRCLE 1 // 环形模式,传输完成后从头执行下一轮传输
  21. #define DMA_UNIT_BYTE 0
  22. #define DMA_UNIT_HALFWORD 1
  23. #define DMA_UNIT_WORD 2
  24. #define DMA_PRI_LOW 0
  25. #define DMA_PRI_HIGH 1
  26. #define DMA_HS_NO (0 << 4) // 无握手(Handshake)信号,启动传输后全部传完
  27. #define DMA_HS_SRC (1 << 4) // 源 侧握手信号,启动传输后源 侧生成一个数据,DMA搬运一个Unit
  28. #define DMA_HS_DST (2 << 4) // 目标侧握手信号,启动传输后目标侧索取一个数据,DMA搬运一个Unit
  29. #define DMA_HS_EXT (4 << 4) // 外部 握手信号,启动传输后外部握手来一个脉冲,DMA搬运一个Unit
  30. #define DMA_HS_MSK (7 << 4)
  31. #define DMA_DIR_RX (0 << 7) // SRC --> DST
  32. #define DMA_DIR_TX (1 << 7) // DST --> SRC
  33. #define DMA_DIR_MSK (1 << 7)
  34. // 源侧外设
  35. #define DMA_CH0_UART1RX (0 | DMA_HS_SRC | DMA_DIR_RX)
  36. #define DMA_CH0_SPI1RX (1 | DMA_HS_SRC | DMA_DIR_RX)
  37. #define DMA_CH0_UART2RX (2 | DMA_HS_SRC | DMA_DIR_RX)
  38. #define DMA_CH0_ADC0 (3 | DMA_HS_SRC | DMA_DIR_RX)
  39. #define DMA_CH1_UART0RX (0 | DMA_HS_SRC | DMA_DIR_RX)
  40. #define DMA_CH1_SPI0RX (1 | DMA_HS_SRC | DMA_DIR_RX)
  41. #define DMA_CH1_UART3RX (2 | DMA_HS_SRC | DMA_DIR_RX)
  42. #define DMA_CH2_UART3RX (0 | DMA_HS_SRC | DMA_DIR_RX)
  43. #define DMA_CH2_SPI0RX (1 | DMA_HS_SRC | DMA_DIR_RX)
  44. #define DMA_CH2_UART0RX (2 | DMA_HS_SRC | DMA_DIR_RX)
  45. #define DMA_CH3_UART2RX (0 | DMA_HS_SRC | DMA_DIR_RX)
  46. #define DMA_CH3_SPI1RX (1 | DMA_HS_SRC | DMA_DIR_RX)
  47. #define DMA_CH3_UART1RX (2 | DMA_HS_SRC | DMA_DIR_RX)
  48. #define DMA_CH3_ADC1 (3 | DMA_HS_SRC | DMA_DIR_RX)
  49. // 目标侧外设
  50. #define DMA_CH0_UART0TX (0 | DMA_HS_DST | DMA_DIR_RX)
  51. #define DMA_CH0_SPI0TX (1 | DMA_HS_DST | DMA_DIR_RX)
  52. #define DMA_CH0_UART3TX (2 | DMA_HS_DST | DMA_DIR_RX)
  53. #define DMA_CH1_UART1TX (0 | DMA_HS_DST | DMA_DIR_RX)
  54. #define DMA_CH1_SPI1TX (1 | DMA_HS_DST | DMA_DIR_RX)
  55. #define DMA_CH1_UART2TX (2 | DMA_HS_DST | DMA_DIR_RX)
  56. #define DMA_CH2_UART2TX (0 | DMA_HS_DST | DMA_DIR_RX)
  57. #define DMA_CH2_SPI1TX (1 | DMA_HS_DST | DMA_DIR_RX)
  58. #define DMA_CH2_UART1TX (2 | DMA_HS_DST | DMA_DIR_RX)
  59. #define DMA_CH3_UART3TX (0 | DMA_HS_DST | DMA_DIR_RX)
  60. #define DMA_CH3_SPI0TX (1 | DMA_HS_DST | DMA_DIR_RX)
  61. #define DMA_CH3_UART0TX (2 | DMA_HS_DST | DMA_DIR_RX)
  62. // 外部握手信号
  63. #define DMA_EXHS_TIMR0 (0 | DMA_HS_EXT | DMA_DIR_RX)
  64. #define DMA_EXHS_TIMR1 (1 | DMA_HS_EXT | DMA_DIR_RX)
  65. #define DMA_EXHS_TIMR2 (2 | DMA_HS_EXT | DMA_DIR_RX)
  66. #define DMA_EXHS_TIMR3 (3 | DMA_HS_EXT | DMA_DIR_RX)
  67. #define DMA_EXHS_TIMR4 (4 | DMA_HS_EXT | DMA_DIR_RX)
  68. #define DMA_EXHS_TRIG0 (5 | DMA_HS_EXT | DMA_DIR_RX) // DMA_TRIG0引脚
  69. #define DMA_EXHS_TRIG1 (6 | DMA_HS_EXT | DMA_DIR_RX) // DMA_TRIG1引脚
  70. void DMA_CH_Init(uint32_t chn, DMA_InitStructure * initStruct); //DMA通道配置
  71. void DMA_CH_Open(uint32_t chn);
  72. void DMA_CH_Close(uint32_t chn);
  73. void DMA_CH_INTEn(uint32_t chn); //DMA中断使能,数据搬运完成后触发中断
  74. void DMA_CH_INTDis(uint32_t chn); //DMA中断禁止,数据搬运完成后不触发中断
  75. void DMA_CH_INTClr(uint32_t chn); //DMA中断标志清除
  76. uint32_t DMA_CH_INTStat(uint32_t chn); //DMA中断状态查询,1 数据搬运完成 0 数据搬运未完成
  77. #endif //__SWM341_DMA_H__