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