1 #ifndef __SWM341_DMA_H__ 2 #define __SWM341_DMA_H__ 3 4 5 typedef struct { 6 uint8_t Mode; //DMA_MODE_SINGLE、DMA_MODE_CIRCLE 7 8 uint8_t Unit; //DMA_UNIT_BYTE、DMA_UNIT_HALFWORD、DMA_UNIT_WORD 9 10 uint32_t Count; //传输 Unit 个数,最大取值0x100000 11 12 uint32_t SrcAddr; 13 14 uint32_t DstAddr; 15 16 uint8_t SrcAddrInc; //0 地址固定 1 地址递增 17 18 uint8_t DstAddrInc; 19 20 uint8_t Handshake; //传输握手信号:DMA_HS_NO、DMA_CH0_UART0TX、DMA_CH0_SPI0TX、... ... 21 22 uint8_t Priority; //DMA_PRI_LOW、DMA_PRI_HIGH 23 24 uint32_t INTEn; //中断使能,有效值有 DMA_IT_DONE、DMA_IT_DSTSG_HALF、DMA_IT_DSTSG_DONE、DMA_IT_SRCSG_HALF、DMA_IT_SRCSG_DONE 及其“或” 25 } DMA_InitStructure; 26 27 28 #define DMA_CH0 0 29 #define DMA_CH1 1 30 #define DMA_CH2 2 31 #define DMA_CH3 3 32 33 #define DMA_MODE_SINGLE 0 // 单次模式,传输完成后停止 34 #define DMA_MODE_CIRCLE 1 // 环形模式,传输完成后从头执行下一轮传输 35 36 #define DMA_UNIT_BYTE 0 37 #define DMA_UNIT_HALFWORD 1 38 #define DMA_UNIT_WORD 2 39 40 #define DMA_PRI_LOW 0 41 #define DMA_PRI_HIGH 1 42 43 44 #define DMA_HS_NO (0 << 4) // 无握手(Handshake)信号,启动传输后全部传完 45 #define DMA_HS_SRC (1 << 4) // 源 侧握手信号,启动传输后源 侧生成一个数据,DMA搬运一个Unit 46 #define DMA_HS_DST (2 << 4) // 目标侧握手信号,启动传输后目标侧索取一个数据,DMA搬运一个Unit 47 #define DMA_HS_EXT (4 << 4) // 外部 握手信号,启动传输后外部握手来一个脉冲,DMA搬运一个Unit 48 #define DMA_HS_MSK (7 << 4) 49 50 #define DMA_DIR_RX (0 << 7) // SRC --> DST 51 #define DMA_DIR_TX (1 << 7) // DST --> SRC 52 #define DMA_DIR_MSK (1 << 7) 53 54 // 源侧外设 55 #define DMA_CH0_UART1RX (0 | DMA_HS_SRC | DMA_DIR_RX) 56 #define DMA_CH0_SPI1RX (1 | DMA_HS_SRC | DMA_DIR_RX) 57 #define DMA_CH0_UART2RX (2 | DMA_HS_SRC | DMA_DIR_RX) 58 #define DMA_CH0_ADC0 (3 | DMA_HS_SRC | DMA_DIR_RX) 59 60 #define DMA_CH1_UART0RX (0 | DMA_HS_SRC | DMA_DIR_RX) 61 #define DMA_CH1_SPI0RX (1 | DMA_HS_SRC | DMA_DIR_RX) 62 #define DMA_CH1_UART3RX (2 | DMA_HS_SRC | DMA_DIR_RX) 63 64 #define DMA_CH2_UART3RX (0 | DMA_HS_SRC | DMA_DIR_RX) 65 #define DMA_CH2_SPI0RX (1 | DMA_HS_SRC | DMA_DIR_RX) 66 #define DMA_CH2_UART0RX (2 | DMA_HS_SRC | DMA_DIR_RX) 67 68 #define DMA_CH3_UART2RX (0 | DMA_HS_SRC | DMA_DIR_RX) 69 #define DMA_CH3_SPI1RX (1 | DMA_HS_SRC | DMA_DIR_RX) 70 #define DMA_CH3_UART1RX (2 | DMA_HS_SRC | DMA_DIR_RX) 71 #define DMA_CH3_ADC1 (3 | DMA_HS_SRC | DMA_DIR_RX) 72 73 // 目标侧外设 74 #define DMA_CH0_UART0TX (0 | DMA_HS_DST | DMA_DIR_RX) 75 #define DMA_CH0_SPI0TX (1 | DMA_HS_DST | DMA_DIR_RX) 76 #define DMA_CH0_UART3TX (2 | DMA_HS_DST | DMA_DIR_RX) 77 78 #define DMA_CH1_UART1TX (0 | DMA_HS_DST | DMA_DIR_RX) 79 #define DMA_CH1_SPI1TX (1 | DMA_HS_DST | DMA_DIR_RX) 80 #define DMA_CH1_UART2TX (2 | DMA_HS_DST | DMA_DIR_RX) 81 82 #define DMA_CH2_UART2TX (0 | DMA_HS_DST | DMA_DIR_RX) 83 #define DMA_CH2_SPI1TX (1 | DMA_HS_DST | DMA_DIR_RX) 84 #define DMA_CH2_UART1TX (2 | DMA_HS_DST | DMA_DIR_RX) 85 86 #define DMA_CH3_UART3TX (0 | DMA_HS_DST | DMA_DIR_RX) 87 #define DMA_CH3_SPI0TX (1 | DMA_HS_DST | DMA_DIR_RX) 88 #define DMA_CH3_UART0TX (2 | DMA_HS_DST | DMA_DIR_RX) 89 90 // 外部握手信号 91 #define DMA_EXHS_TIMR0 (0 | DMA_HS_EXT | DMA_DIR_RX) 92 #define DMA_EXHS_TIMR1 (1 | DMA_HS_EXT | DMA_DIR_RX) 93 #define DMA_EXHS_TIMR2 (2 | DMA_HS_EXT | DMA_DIR_RX) 94 #define DMA_EXHS_TIMR3 (3 | DMA_HS_EXT | DMA_DIR_RX) 95 #define DMA_EXHS_TIMR4 (4 | DMA_HS_EXT | DMA_DIR_RX) 96 #define DMA_EXHS_TRIG0 (5 | DMA_HS_EXT | DMA_DIR_RX) // DMA_TRIG0引脚 97 #define DMA_EXHS_TRIG1 (6 | DMA_HS_EXT | DMA_DIR_RX) // DMA_TRIG1引脚 98 99 100 /* Interrupt Type */ 101 #define DMA_IT_DONE (1 << 0) //Transfer Done 102 #define DMA_IT_DSTSG_HALF (1 << 8) //Destination Scatter-Gather Transfer Half 103 #define DMA_IT_DSTSG_DONE (1 << 9) //Destination Scatter-Gather Transfer Done 104 #define DMA_IT_SRCSG_HALF (1 << 16) //Source Scatter-Gather Transfer Half 105 #define DMA_IT_SRCSG_DONE (1 << 17) //Source Scatter-Gather Transfer Done 106 107 108 109 void DMA_CH_Init(uint32_t chn, DMA_InitStructure * initStruct); //DMA通道配置 110 void DMA_CH_Open(uint32_t chn); 111 void DMA_CH_Close(uint32_t chn); 112 113 void DMA_CH_SetCount(uint32_t chn, uint32_t count); 114 void DMA_CH_SetSrcAddress(uint32_t chn, uint32_t address); 115 void DMA_CH_SetDstAddress(uint32_t chn, uint32_t address); 116 uint32_t DMA_CH_GetRemaining(uint32_t chn); 117 118 void DMA_CH_INTEn(uint32_t chn, uint32_t it); //DMA中断使能 119 void DMA_CH_INTDis(uint32_t chn, uint32_t it); //DMA中断禁止 120 void DMA_CH_INTClr(uint32_t chn, uint32_t it); //DMA中断标志清除 121 uint32_t DMA_CH_INTStat(uint32_t chn, uint32_t it); //DMA中断状态查询 122 123 124 #endif //__SWM341_DMA_H__ 125