1 /******************************************************************************************************************************************
2 * 文件名称: SWM341_gpio.c
3 * 功能说明: SWM341单片机的通用输入输出功能驱动库
4 * 技术支持: http://www.synwit.com.cn/e/tool/gbook/?bid=1
5 * 注意事项:
6 * 版本日期: V1.0.0 2016年1月30日
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 "SWM341.h"
22 #include "SWM341_gpio.h"
23
24
25 /******************************************************************************************************************************************
26 * 函数名称: GPIO_Init()
27 * 功能说明: 引脚初始化,包含引脚方向、上拉、下拉、开漏
28 * 输 入: GPIO_TypeDef * GPIOx 指定GPIO端口,有效值包括GPIOA、GPIOB、GPIOC、GPIOD、GPIOE、GPIOM、GPION
29 * uint32_t n 指定GPIO引脚,有效值包括PIN0、PIN1、PIN2、... ... PIN14、PIN15
30 * uint32_t dir 引脚方向,0 输入 1 输出
31 * uint32_t pull_up 上拉使能
32 * uint32_t pull_down 下拉使能
33 * uint32_t open_drain 开漏使能
34 * 输 出: 无
35 * 注意事项: 无
36 ******************************************************************************************************************************************/
GPIO_Init(GPIO_TypeDef * GPIOx,uint32_t n,uint32_t dir,uint32_t pull_up,uint32_t pull_down,uint32_t open_drain)37 void GPIO_Init(GPIO_TypeDef * GPIOx, uint32_t n, uint32_t dir, uint32_t pull_up, uint32_t pull_down, uint32_t open_drain)
38 {
39 PORT_TypeDef * PORTx = PORTA;
40
41 switch((uint32_t)GPIOx)
42 {
43 case ((uint32_t)GPIOA):
44 SYS->CLKEN0 |= (0x01 << SYS_CLKEN0_GPIOA_Pos);
45
46 PORTx = PORTA;
47 break;
48
49 case ((uint32_t)GPIOB):
50 SYS->CLKEN0 |= (0x01 << SYS_CLKEN0_GPIOB_Pos);
51
52 PORTx = PORTB;
53 break;
54
55 case ((uint32_t)GPIOC):
56 SYS->CLKEN0 |= (0x01 << SYS_CLKEN0_GPIOC_Pos);
57
58 PORTx = PORTC;
59 break;
60
61 case ((uint32_t)GPIOD):
62 SYS->CLKEN0 |= (0x01 << SYS_CLKEN0_GPIOD_Pos);
63
64 PORTx = PORTD;
65 break;
66
67 case ((uint32_t)GPIOE):
68 SYS->CLKEN1 |= (0x01 << SYS_CLKEN1_GPIOE_Pos);
69
70 PORTx = PORTE;
71 break;
72
73 case ((uint32_t)GPIOM):
74 SYS->CLKEN0 |= (0x01 << SYS_CLKEN0_GPIOM_Pos);
75
76 PORTx = PORTM;
77 break;
78
79 case ((uint32_t)GPION):
80 SYS->CLKEN0 |= (0x01 << SYS_CLKEN0_GPION_Pos);
81
82 PORTx = PORTN;
83 break;
84 }
85
86 PORT_Init(PORTx, n, 0, 1); //PORTx.PINn引脚配置为GPIO功能,数字输入开启
87 if(dir == 1)
88 {
89 GPIOx->DIR |= (0x01 << n);
90 }
91 else
92 {
93 GPIOx->DIR &= ~(0x01 << n);
94 }
95
96 if(pull_up == 1) PORTx->PULLU |= (1 << n);
97 else PORTx->PULLU &= ~(1 << n);
98 if(pull_down == 1) PORTx->PULLD |= (1 << n);
99 else PORTx->PULLD &= ~(1 << n);
100 if(open_drain == 1) PORTx->OPEND |= (1 << n);
101 else PORTx->OPEND &= ~(1 << n);
102 }
103
104 /******************************************************************************************************************************************
105 * 函数名称: GPIO_SetBit()
106 * 功能说明: 将参数指定的引脚电平置高
107 * 输 入: GPIO_TypeDef * GPIOx 指定GPIO端口,有效值包括GPIOA、GPIOB、GPIOC、GPIOD、GPIOE、GPIOM、GPION
108 * uint32_t n 指定GPIO引脚,有效值包括PIN0、PIN1、PIN2、... ... PIN14、PIN15
109 * 输 出: 无
110 * 注意事项: 无
111 ******************************************************************************************************************************************/
GPIO_SetBit(GPIO_TypeDef * GPIOx,uint32_t n)112 void GPIO_SetBit(GPIO_TypeDef * GPIOx, uint32_t n)
113 {
114 *(&GPIOx->DATAPIN0 + n) = 1;
115 }
116
117 /******************************************************************************************************************************************
118 * 函数名称: GPIO_ClrBit()
119 * 功能说明: 将参数指定的引脚电平置低
120 * 输 入: GPIO_TypeDef * GPIOx 指定GPIO端口,有效值包括GPIOA、GPIOB、GPIOC、GPIOD、GPIOE、GPIOM、GPION
121 * uint32_t n 指定GPIO引脚,有效值包括PIN0、PIN1、PIN2、... ... PIN14、PIN15
122 * 输 出: 无
123 * 注意事项: 无
124 ******************************************************************************************************************************************/
GPIO_ClrBit(GPIO_TypeDef * GPIOx,uint32_t n)125 void GPIO_ClrBit(GPIO_TypeDef * GPIOx, uint32_t n)
126 {
127 *(&GPIOx->DATAPIN0 + n) = 0;
128 }
129
130 /******************************************************************************************************************************************
131 * 函数名称: GPIO_InvBit()
132 * 功能说明: 将参数指定的引脚电平反转
133 * 输 入: GPIO_TypeDef * GPIOx 指定GPIO端口,有效值包括GPIOA、GPIOB、GPIOC、GPIOD、GPIOE、GPIOM、GPION
134 * uint32_t n 指定GPIO引脚,有效值包括PIN0、PIN1、PIN2、... ... PIN14、PIN15
135 * 输 出: 无
136 * 注意事项: 无
137 ******************************************************************************************************************************************/
GPIO_InvBit(GPIO_TypeDef * GPIOx,uint32_t n)138 void GPIO_InvBit(GPIO_TypeDef * GPIOx, uint32_t n)
139 {
140 *(&GPIOx->DATAPIN0 + n) = 1 - *(&GPIOx->DATAPIN0 + n);
141 }
142
143 /******************************************************************************************************************************************
144 * 函数名称: GPIO_GetBit()
145 * 功能说明: 读取参数指定的引脚的电平状态
146 * 输 入: GPIO_TypeDef * GPIOx 指定GPIO端口,有效值包括GPIOA、GPIOB、GPIOC、GPIOD、GPIOE、GPIOM、GPION
147 * uint32_t n 指定GPIO引脚,有效值包括PIN0、PIN1、PIN2、... ... PIN14、PIN15
148 * 输 出: 参数指定的引脚的电平状态 0 低电平 1 高电平
149 * 注意事项: 无
150 ******************************************************************************************************************************************/
GPIO_GetBit(GPIO_TypeDef * GPIOx,uint32_t n)151 uint32_t GPIO_GetBit(GPIO_TypeDef * GPIOx, uint32_t n)
152 {
153 return *(&GPIOx->DATAPIN0 + n);
154 }
155
156 /******************************************************************************************************************************************
157 * 函数名称: GPIO_SetBits()
158 * 功能说明: 将参数指定的从n开始的w位连续引脚的电平置高
159 * 输 入: GPIO_TypeDef * GPIOx 指定GPIO端口,有效值包括GPIOA、GPIOB、GPIOC、GPIOD、GPIOE、GPIOM、GPION
160 * uint32_t n 指定GPIO引脚,有效值包括PIN0、PIN1、PIN2、... ... PIN14、PIN15
161 * uint32_t w 指定要将引脚电平置高的引脚的个数
162 * 输 出: 无
163 * 注意事项: 无
164 ******************************************************************************************************************************************/
GPIO_SetBits(GPIO_TypeDef * GPIOx,uint32_t n,uint32_t w)165 void GPIO_SetBits(GPIO_TypeDef * GPIOx, uint32_t n, uint32_t w)
166 {
167 uint32_t bits;
168
169 bits = 0xFFFF >> (16 - w);
170
171 GPIOx->ODR |= (bits << n);
172 }
173
174 /******************************************************************************************************************************************
175 * 函数名称: GPIO_ClrBits()
176 * 功能说明: 将参数指定的从n开始的w位连续引脚的电平置低
177 * 输 入: GPIO_TypeDef * GPIOx 指定GPIO端口,有效值包括GPIOA、GPIOB、GPIOC、GPIOD、GPIOE、GPIOM、GPION
178 * uint32_t n 指定GPIO引脚,有效值包括PIN0、PIN1、PIN2、... ... PIN14、PIN15
179 * uint32_t w 指定要将引脚电平置低的引脚的个数
180 * 输 出: 无
181 * 注意事项: 无
182 ******************************************************************************************************************************************/
GPIO_ClrBits(GPIO_TypeDef * GPIOx,uint32_t n,uint32_t w)183 void GPIO_ClrBits(GPIO_TypeDef * GPIOx, uint32_t n, uint32_t w)
184 {
185 uint32_t bits;
186
187 bits = 0xFFFF >> (16 - w);
188
189 GPIOx->ODR &= ~(bits << n);
190 }
191
192 /******************************************************************************************************************************************
193 * 函数名称: GPIO_InvBits()
194 * 功能说明: 将参数指定的从n开始的w位连续引脚的电平反转
195 * 输 入: GPIO_TypeDef * GPIOx 指定GPIO端口,有效值包括GPIOA、GPIOB、GPIOC、GPIOD、GPIOE、GPIOM、GPION
196 * uint32_t n 指定GPIO引脚,有效值包括PIN0、PIN1、PIN2、... ... PIN14、PIN15
197 * uint32_t w 指定要将引脚电平反转的引脚的个数
198 * 输 出: 无
199 * 注意事项: 无
200 ******************************************************************************************************************************************/
GPIO_InvBits(GPIO_TypeDef * GPIOx,uint32_t n,uint32_t w)201 void GPIO_InvBits(GPIO_TypeDef * GPIOx, uint32_t n, uint32_t w)
202 {
203 uint32_t bits;
204
205 bits = 0xFFFF >> (16 - w);
206
207 GPIOx->ODR ^= (bits << n);
208 }
209
210 /******************************************************************************************************************************************
211 * 函数名称: GPIO_GetBits()
212 * 功能说明: 读取参数指定的从n开始的w位连续引脚的电平状态
213 * 输 入: GPIO_TypeDef * GPIOx 指定GPIO端口,有效值包括GPIOA、GPIOB、GPIOC、GPIOD、GPIOE、GPIOM、GPION
214 * uint32_t n 指定GPIO引脚,有效值包括PIN0、PIN1、PIN2、... ... PIN14、PIN15
215 * uint32_t w 指定要将引脚电平置高的引脚的个数
216 * 输 出: 参数指定的从n开始的w位连续引脚的电平状态 0 低电平 1 高电平
217 * 返回值的第0位表示引脚n的电平状态、返回值的第1位表示引脚n+1的电平状态... ...返回值的第w位表示引脚n+w的电平状态
218 * 注意事项: 无
219 ******************************************************************************************************************************************/
GPIO_GetBits(GPIO_TypeDef * GPIOx,uint32_t n,uint32_t w)220 uint32_t GPIO_GetBits(GPIO_TypeDef * GPIOx, uint32_t n, uint32_t w)
221 {
222 uint32_t bits;
223
224 bits = 0xFFFF >> (16 - w);
225
226 return ((GPIOx->IDR >> n) & bits);
227 }
228
229 /******************************************************************************************************************************************
230 * 函数名称: GPIO_AtomicSetBits()
231 * 功能说明: 将参数指定的从n开始的w位连续引脚的电平置高,确保引脚”读-改-写“操作的原子性(不被中断ISR打断)
232 * 输 入: GPIO_TypeDef * GPIOx 指定GPIO端口,有效值包括GPIOA、GPIOB、GPIOC、GPIOD、GPIOE、GPIOM、GPION
233 * uint32_t n 指定GPIO引脚,有效值包括PIN0、PIN1、PIN2、... ... PIN14、PIN15
234 * uint32_t w 指定要将引脚电平置高的引脚的个数
235 * 输 出: 无
236 * 注意事项: 当GPIOx的16个引脚中,有些在主循环中操作,有些在中断ISR中操作时,GPIOx的引脚必须都用GPIO_Atomic类型函数操作
237 ******************************************************************************************************************************************/
GPIO_AtomicSetBits(GPIO_TypeDef * GPIOx,uint32_t n,uint32_t w)238 void GPIO_AtomicSetBits(GPIO_TypeDef * GPIOx, uint32_t n, uint32_t w)
239 {
240 uint32_t bits;
241
242 bits = 0xFFFF >> (16 - w);
243
244 __disable_irq();
245 GPIOx->ODR |= (bits << n);
246 __enable_irq();
247 }
248
249 /******************************************************************************************************************************************
250 * 函数名称: GPIO_AtomicClrBits()
251 * 功能说明: 将参数指定的从n开始的w位连续引脚的电平置低,确保引脚”读-改-写“操作的原子性(不被中断ISR打断)
252 * 输 入: GPIO_TypeDef * GPIOx 指定GPIO端口,有效值包括GPIOA、GPIOB、GPIOC、GPIOD、GPIOE、GPIOM、GPION
253 * uint32_t n 指定GPIO引脚,有效值包括PIN0、PIN1、PIN2、... ... PIN14、PIN15
254 * uint32_t w 指定要将引脚电平置低的引脚的个数
255 * 输 出: 无
256 * 注意事项: 当GPIOx的16个引脚中,有些在主循环中操作,有些在中断ISR中操作时,GPIOx的引脚必须都用GPIO_Atomic类型函数操作
257 ******************************************************************************************************************************************/
GPIO_AtomicClrBits(GPIO_TypeDef * GPIOx,uint32_t n,uint32_t w)258 void GPIO_AtomicClrBits(GPIO_TypeDef * GPIOx, uint32_t n, uint32_t w)
259 {
260 uint32_t bits;
261
262 bits = 0xFFFF >> (16 - w);
263
264 __disable_irq();
265 GPIOx->ODR &= ~(bits << n);
266 __enable_irq();
267 }
268
269 /******************************************************************************************************************************************
270 * 函数名称: GPIO_AtomicInvBits()
271 * 功能说明: 将参数指定的从n开始的w位连续引脚的电平反转,确保引脚”读-改-写“操作的原子性(不被中断ISR打断)
272 * 输 入: GPIO_TypeDef * GPIOx 指定GPIO端口,有效值包括GPIOA、GPIOB、GPIOC、GPIOD、GPIOE、GPIOM、GPION
273 * uint32_t n 指定GPIO引脚,有效值包括PIN0、PIN1、PIN2、... ... PIN14、PIN15
274 * uint32_t w 指定要将引脚电平反转的引脚的个数
275 * 输 出: 无
276 * 注意事项: 当GPIOx的16个引脚中,有些在主循环中操作,有些在中断ISR中操作时,GPIOx的引脚必须都用GPIO_Atomic类型函数操作
277 ******************************************************************************************************************************************/
GPIO_AtomicInvBits(GPIO_TypeDef * GPIOx,uint32_t n,uint32_t w)278 void GPIO_AtomicInvBits(GPIO_TypeDef * GPIOx, uint32_t n, uint32_t w)
279 {
280 uint32_t bits;
281
282 bits = 0xFFFF >> (16 - w);
283
284 __disable_irq();
285 GPIOx->ODR ^= (bits << n);
286 __enable_irq();
287 }
288