1 /******************************************************************************************************************************************
2 * 文件名称: SWM320_dma.c
3 * 功能说明: SWM320单片机的DMA功能驱动库
4 * 技术支持: http://www.synwit.com.cn/e/tool/gbook/?bid=1
5 * 注意事项:
6 * 版本日期: V1.1.0 2017年10月25日
7 * 升级记录:
8 *
9 *
10 *******************************************************************************************************************************************
11 * @attention
12 *
13 * THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS WITH CODING INFORMATION
14 * REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE TIME. AS A RESULT, SYNWIT SHALL NOT BE HELD LIABLE
15 * FOR ANY DIRECT, INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING FROM THE CONTENT
16 * OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE CODING INFORMATION CONTAINED HEREIN IN CONN-
17 * -ECTION WITH THEIR PRODUCTS.
18 *
19 * COPYRIGHT 2012 Synwit Technology
20 *******************************************************************************************************************************************/
21 #include "SWM320.h"
22 #include "SWM320_dma.h"
23
24 /******************************************************************************************************************************************
25 * 函数名称: DMA_CHM_Config()
26 * 功能说明: DMA通道配置,用于存储器间(如Flash和RAM间)搬运数据
27 * 输 入: uint32_t chn 指定要配置的通道,有效值有DMA_CH0、DMA_CH1、DMA_CH2
28 * uint32_t src_addr 源地址,必须字对齐,即地址的最低2位必须是00
29 * uint32_t src_addr_incr 0 固定地址 1 地址递增
30 * uint32_t dst_addr 目的地址,必须字对齐,即地址的最低2位必须是00
31 * uint32_t dst_addr_incr 0 固定地址 1 地址递增
32 * uint32_t num_word 要搬运的数据字数,最大1024
33 * uint32_t int_en 中断使能,1 数据搬运完成后产生中断 0 数据搬运完成后不产生中断
34 * 输 出: 无
35 * 注意事项: 搬运数据量以字为单元,不是字节
36 ******************************************************************************************************************************************/
DMA_CHM_Config(uint32_t chn,uint32_t src_addr,uint32_t src_addr_incr,uint32_t dst_addr,uint32_t dst_addr_incr,uint32_t num_word,uint32_t int_en)37 void DMA_CHM_Config(uint32_t chn, uint32_t src_addr, uint32_t src_addr_incr, uint32_t dst_addr, uint32_t dst_addr_incr, uint32_t num_word, uint32_t int_en)
38 {
39 DMA->EN = 1; //每个通道都有自己独立的开关控制,所以总开关可以是一直开启的
40
41 DMA_CH_Close(chn); //配置前先关闭该通道
42
43 DMA->CH[chn].SRC = src_addr;
44 DMA->CH[chn].DST = dst_addr;
45
46 DMA->CH[chn].CR = ((num_word*4-1) << DMA_CR_LEN_Pos) |
47 (0 << DMA_CR_AUTORE_Pos);
48
49 DMA->CH[chn].AM = (src_addr_incr << DMA_AM_SRCAM_Pos) |
50 (dst_addr_incr << DMA_AM_DSTAM_Pos) |
51 (0 << DMA_AM_BURST_Pos);
52
53 DMA->IF = (1 << chn); //清除中断标志
54 DMA->IE |= (1 << chn);
55 if(int_en) DMA->IM &= ~(1 << chn);
56 else DMA->IM |= (1 << chn);
57
58 if(int_en)
59 {
60 NVIC_EnableIRQ(DMA_IRQn);
61 }
62 else
63 {
64 //不能调用NVIC_DisalbeIRQ(DMA_IRQn),因为其他通道可能使用DMA中断
65 }
66 }
67
68 /******************************************************************************************************************************************
69 * 函数名称: DMA_CH_Open()
70 * 功能说明: DMA通道打开
71 * 输 入: uint32_t chn 指定要配置的通道,有效值有DMA_CH0、DMA_CH1、DMA_CH2
72 * 输 出: 无
73 * 注意事项: 无
74 ******************************************************************************************************************************************/
DMA_CH_Open(uint32_t chn)75 void DMA_CH_Open(uint32_t chn)
76 {
77 DMA->CH[chn].CR |= (1 << DMA_CR_TXEN_Pos);
78 }
79
80 /******************************************************************************************************************************************
81 * 函数名称: DMA_CH_Close()
82 * 功能说明: DMA通道关闭
83 * 输 入: uint32_t chn 指定要配置的通道,有效值有DMA_CH0、DMA_CH1、DMA_CH2
84 * 输 出: 无
85 * 注意事项: 无
86 ******************************************************************************************************************************************/
DMA_CH_Close(uint32_t chn)87 void DMA_CH_Close(uint32_t chn)
88 {
89 DMA->CH[chn].CR &= ~(1 << DMA_CR_TXEN_Pos);
90 }
91
92 /******************************************************************************************************************************************
93 * 函数名称: DMA_CH_INTEn()
94 * 功能说明: DMA中断使能,数据搬运完成后触发中断
95 * 输 入: uint32_t chn 指定要配置的通道,有效值有DMA_CH0、DMA_CH1、DMA_CH2
96 * 输 出: 无
97 * 注意事项: 无
98 ******************************************************************************************************************************************/
DMA_CH_INTEn(uint32_t chn)99 void DMA_CH_INTEn(uint32_t chn)
100 {
101 DMA->IM &= ~(1 << chn);
102 }
103
104 /******************************************************************************************************************************************
105 * 函数名称: DMA_CH_INTDis()
106 * 功能说明: DMA中断禁止,数据搬运完成后不触发中断
107 * 输 入: uint32_t chn 指定要配置的通道,有效值有DMA_CH0、DMA_CH1、DMA_CH2
108 * 输 出: 无
109 * 注意事项: 无
110 ******************************************************************************************************************************************/
DMA_CH_INTDis(uint32_t chn)111 void DMA_CH_INTDis(uint32_t chn)
112 {
113 DMA->IM |= (1 << chn);
114 }
115
116 /******************************************************************************************************************************************
117 * 函数名称: DMA_CH_INTClr()
118 * 功能说明: DMA中断标志清除
119 * 输 入: uint32_t chn 指定要配置的通道,有效值有DMA_CH0、DMA_CH1、DMA_CH2
120 * 输 出: 无
121 * 注意事项: 无
122 ******************************************************************************************************************************************/
DMA_CH_INTClr(uint32_t chn)123 void DMA_CH_INTClr(uint32_t chn)
124 {
125 DMA->IF = (1 << chn);
126 }
127
128 /******************************************************************************************************************************************
129 * 函数名称: DMA_CH_INTStat()
130 * 功能说明: DMA中断状态查询
131 * 输 入: uint32_t chn 指定要配置的通道,有效值有DMA_CH0、DMA_CH1、DMA_CH2
132 * 输 出: uint32_t 1 数据搬运完成 0 数据搬运未完成
133 * 注意事项: 无
134 ******************************************************************************************************************************************/
DMA_CH_INTStat(uint32_t chn)135 uint32_t DMA_CH_INTStat(uint32_t chn)
136 {
137 return (DMA->IF & (1 << chn)) ? 1 : 0;
138 }
139