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