1 /**
2 *****************************************************************************
3 * @file cmem7_gpio.c
4 *
5 * @brief CMEM7 GPIO source file
6 *
7 *
8 * @version V1.0
9 * @date 3. September 2013
10 *
11 * @note
12 *
13 *****************************************************************************
14 * @attention
15 *
16 * THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS
17 * WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE
18 * TIME. AS A RESULT, CAPITAL-MICRO SHALL NOT BE HELD LIABLE FOR ANY DIRECT,
19 * INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING
20 * FROM THE CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE
21 * CODING INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS.
22 *
23 * <h2><center>© COPYRIGHT 2013 Capital-micro </center></h2>
24 *****************************************************************************
25 */
26
27 #include "cmem7_gpio.h"
28
29 #define GPIO_GROUP_GPIO_H (GPIO_GROUP_GPIO + 1)
30 #define GPIO_GROUP_GPIO_N (GPIO_GROUP_GPIO + 2)
31
32 #define IS_INNER_GPIO_GROUP(GROUP) (((GROUP) == GPIO_GROUP_GPIO) || \
33 ((GROUP) == GPIO_GROUP_GPIO_H) || \
34 ((GROUP) == GPIO_GROUP_GPIO_N))
35
36 #define GPIO_PWM_CHANNEL_GPIO_H_9 (GPIO_PWM_CHANNEL_GPIO_31 + 1)
37 #define GPIO_PWM_CHANNEL_GPIO_H_19 (GPIO_PWM_CHANNEL_GPIO_31 + 2)
38 #define GPIO_PWM_CHANNEL_GPIO_H_20 (GPIO_PWM_CHANNEL_GPIO_31 + 3)
39
40 #define IS_INNER_GPIO_PWM_CHANNEL(CHANNEL) (((CHANNEL) == GPIO_PWM_CHANNEL_GPIO_31) || \
41 ((CHANNEL) == GPIO_PWM_CHANNEL_GPIO_H_9) || \
42 ((CHANNEL) == GPIO_PWM_CHANNEL_GPIO_H_19) || \
43 ((CHANNEL) == GPIO_PWM_CHANNEL_GPIO_H_20))
gpio_GetClock()44 static uint32_t gpio_GetClock() {
45 return SYSTEM_CLOCK_FREQ / (1 << (GLOBAL_CTRL->CLK_SEL_0_b.GPIO_CLK + 1));
46 }
47
GPIO_Init(uint8_t Group,uint32_t PositiveTrigger)48 void GPIO_Init(uint8_t Group, uint32_t PositiveTrigger) {
49 assert_param(IS_GPIO_GROUP(Group));
50
51 if (Group == GPIO_GROUP_GPIO) {
52 GPIO->GPIO_POSITIVE_EDGE_INT_TRIGGER = PositiveTrigger;
53 } else if (Group == GPIO_GROUP_GPIO_H) {
54 GPIO->GPIO_H_POSITIVE_EDGE_INT_TRIGGER = PositiveTrigger;
55 } else {
56 GPIO->GPIO_N_POSITIVE_EDGE_INT_TRIGGER = PositiveTrigger;
57 }
58 }
59
GPIO_EnableOutput(uint8_t Group,uint32_t Enable)60 void GPIO_EnableOutput(uint8_t Group, uint32_t Enable) {
61 assert_param(IS_GPIO_GROUP(Group));
62
63 if (Group == GPIO_GROUP_GPIO) {
64 GPIO->GPIO_OE = Enable;
65 } else if (Group == GPIO_GROUP_GPIO_H) {
66 GPIO->GPIO_H_OE = Enable;
67 } else {
68 GPIO->GPIO_N_OE = Enable;
69 }
70 }
71
GPIO_EnableInt(uint8_t Group,uint32_t Enable)72 void GPIO_EnableInt(uint8_t Group, uint32_t Enable) {
73 assert_param(IS_GPIO_GROUP(Group));
74
75 if (Group == GPIO_GROUP_GPIO) {
76 GPIO->GPIO_INT_MASK = ~Enable;
77 } else if (Group == GPIO_GROUP_GPIO_H) {
78 GPIO->GPIO_H_INT_MASK = ~Enable;
79 } else {
80 GPIO->GPIO_N_INT_MASK = ~Enable;
81 }
82 }
83
GPIO_GetIntStatus(uint8_t Group)84 uint32_t GPIO_GetIntStatus(uint8_t Group) {
85 assert_param(IS_GPIO_GROUP(Group));
86
87 if (Group == GPIO_GROUP_GPIO) {
88 return GPIO->GPIO_INT_STATUS;
89 } else if (Group == GPIO_GROUP_GPIO_H) {
90 return GPIO->GPIO_H_INT_STATUS;
91 }
92
93 return GPIO->GPIO_N_INT_STATUS;
94 }
95
GPIO_ClearInt(uint8_t Group,uint32_t Clear)96 void GPIO_ClearInt(uint8_t Group, uint32_t Clear) {
97 assert_param(IS_GPIO_GROUP(Group));
98
99 if (Group == GPIO_GROUP_GPIO) {
100 GPIO->GPIO_INT_STATUS = Clear;
101 } else if (Group == GPIO_GROUP_GPIO_H) {
102 GPIO->GPIO_H_INT_STATUS = Clear;
103 } else {
104 GPIO->GPIO_N_INT_STATUS = Clear;
105 }
106 }
107
GPIO_Read(uint8_t Group)108 uint32_t GPIO_Read(uint8_t Group) {
109 uint32_t data;
110
111 assert_param(IS_GPIO_GROUP(Group));
112
113 if (Group == GPIO_GROUP_GPIO) {
114 data = GPIO->GPIO_IN;
115 } else if (Group == GPIO_GROUP_GPIO_H) {
116 data = GPIO->GPIO_H_IN;
117 } else {
118 data = GPIO->GPIO_N_IN;
119 }
120
121 return data;
122 }
123
GPIO_Write(uint8_t Group,uint32_t Unmask,uint32_t data)124 void GPIO_Write(uint8_t Group, uint32_t Unmask, uint32_t data) {
125 assert_param(IS_GPIO_GROUP(Group));
126
127 if (Group == GPIO_GROUP_GPIO) {
128 GPIO->GPIO_OUT_UNMASK = Unmask;
129 GPIO->GPIO_OUT_DATA = data;
130 } else if (Group == GPIO_GROUP_GPIO_H) {
131 GPIO->GPIO_H_OUT_UNMASK = Unmask;
132 GPIO->GPIO_H_OUT_DATA = data;
133 } else {
134 GPIO->GPIO_N_OUT_UNMASK = Unmask;
135 GPIO->GPIO_N_OUT_DATA = data;
136 }
137 }
138
GPIO_InitPwm(uint8_t Channel,uint32_t HighLevelNanoSecond,uint32_t LowLevelNanoSecond)139 void GPIO_InitPwm(uint8_t Channel, uint32_t HighLevelNanoSecond, uint32_t LowLevelNanoSecond) {
140 uint16_t lowTick, highTick;
141
142 assert_param(IS_GPIO_PWM_CHANNEL(Channel));
143
144 lowTick = LowLevelNanoSecond * (gpio_GetClock() / 1000000) / 1000;
145 highTick = HighLevelNanoSecond * (gpio_GetClock() / 1000000) / 1000;
146 lowTick = (lowTick < 1) ? lowTick : lowTick - 1;
147 highTick = (highTick < 1) ? highTick : highTick - 1;
148
149 if (Channel == GPIO_PWM_CHANNEL_GPIO_31) {
150 GPIO->PWM_OUT0_LEN_b.LOW_LEVEL_TICK = lowTick;
151 GPIO->PWM_OUT0_LEN_b.HIGH_LEVEL_TICK = highTick;
152 } else if (Channel == GPIO_PWM_CHANNEL_GPIO_H_9) {
153 GPIO->PWM_OUT1_LEN_b.LOW_LEVEL_TICK = lowTick;
154 GPIO->PWM_OUT1_LEN_b.HIGH_LEVEL_TICK = highTick;
155 } else if (Channel == GPIO_PWM_CHANNEL_GPIO_H_19) {
156 GPIO->PWM_OUT2_LEN_b.LOW_LEVEL_TICK = lowTick;
157 GPIO->PWM_OUT2_LEN_b.HIGH_LEVEL_TICK = highTick;
158 } else {
159 GPIO->PWM_OUT3_LEN_b.LOW_LEVEL_TICK = lowTick;
160 GPIO->PWM_OUT3_LEN_b.HIGH_LEVEL_TICK = highTick;
161 }
162 }
163
GPIO_EnablePwm(uint8_t Channel,BOOL Enable)164 void GPIO_EnablePwm(uint8_t Channel, BOOL Enable) {
165 assert_param(IS_GPIO_PWM_CHANNEL(Channel));
166
167 if (Channel == GPIO_PWM_CHANNEL_GPIO_31) {
168 GPIO->PWM_OUT_EN_b.GPIO_31 = Enable;
169 GPIO->PWM_OUT_SEL_b.GPIO_31 = Enable;
170 } else if (Channel == GPIO_PWM_CHANNEL_GPIO_H_9) {
171 GPIO->PWM_OUT_EN_b.GPIO_H_9 = Enable;
172 GPIO->PWM_OUT_SEL_b.GPIO_H_9 = Enable;
173 } else if (Channel == GPIO_PWM_CHANNEL_GPIO_H_19) {
174 GPIO->PWM_OUT_EN_b.GPIO_H_19 = Enable;
175 GPIO->PWM_OUT_SEL_b.GPIO_H_19 = Enable;
176 } else {
177 GPIO->PWM_OUT_EN_b.GPIO_H_20 = Enable;
178 GPIO->PWM_OUT_SEL_b.GPIO_H_20 = Enable;
179 }
180 }
181
182 /**
183 xjf 20150324
184
185 **/
GPIO_SetBits(uint32_t mask)186 void GPIO_SetBits(uint32_t mask)
187 {
188 static uint32_t g_GPIO_OUT_UNMASK;
189 static uint32_t g_GPIO_OUT_DATA;
190 static uint32_t g_GPIO_OE;
191
192 g_GPIO_OUT_UNMASK = GPIO->GPIO_OUT_UNMASK ;
193 g_GPIO_OUT_DATA = GPIO->GPIO_OUT_DATA ;
194 g_GPIO_OE = GPIO->GPIO_OE ;
195 g_GPIO_OUT_UNMASK |=mask;
196 g_GPIO_OE |=mask;
197 g_GPIO_OUT_DATA |=mask;
198
199 GPIO->GPIO_OUT_UNMASK =g_GPIO_OUT_UNMASK ;
200 GPIO->GPIO_OUT_DATA =g_GPIO_OUT_DATA ;
201 GPIO->GPIO_OE =g_GPIO_OE ;
202 }
203
GPIO_clrBits(uint32_t mask)204 void GPIO_clrBits(uint32_t mask)
205 {
206 static uint32_t g_GPIO_OUT_UNMASK;
207 static uint32_t g_GPIO_OUT_DATA;
208 static uint32_t g_GPIO_OE;
209
210 g_GPIO_OUT_UNMASK = GPIO->GPIO_OUT_UNMASK ;
211 g_GPIO_OUT_DATA = GPIO->GPIO_OUT_DATA ;
212 g_GPIO_OE = GPIO->GPIO_OE ;
213 g_GPIO_OUT_UNMASK |=mask;
214 g_GPIO_OE |=mask;
215 g_GPIO_OUT_DATA &=(~ mask);
216
217 GPIO->GPIO_OUT_UNMASK =g_GPIO_OUT_UNMASK ;
218 GPIO->GPIO_OUT_DATA =g_GPIO_OUT_DATA ;
219 GPIO->GPIO_OE =g_GPIO_OE ;
220 }
221
GPIO_getBits(uint32_t mask)222 uint32_t GPIO_getBits(uint32_t mask)
223 {
224 static uint32_t g_GPIO_OUT_UNMASK;
225 //static uint32_t g_GPIO_OUT_DATA;
226 static uint32_t g_GPIO_OE;
227
228 uint32_t get_delay = 0;
229 uint32_t saved_mask;
230
231 saved_mask=mask;
232
233 g_GPIO_OUT_UNMASK = GPIO->GPIO_OUT_UNMASK ;
234 g_GPIO_OE = GPIO->GPIO_OE ;
235 g_GPIO_OUT_UNMASK &=(~mask);
236 g_GPIO_OE &=(~mask);
237 GPIO->GPIO_OUT_UNMASK =g_GPIO_OUT_UNMASK ;
238 GPIO->GPIO_OE =g_GPIO_OE ;
239 for(get_delay=0;get_delay<100;get_delay++)
240 {
241 }
242 //get_delay=(GPIO->GPIO_IN)&saved_mask;
243 if(((GPIO->GPIO_IN)&saved_mask)==saved_mask)
244 {
245 return(1);
246 }
247 else
248 {
249 return(0);
250 }
251
252 }
253 /**
254 xjf 20150324
255
256 **/
257