1 /**
2 ******************************************************************************
3 * @file lib_gpio.c
4 * @author Application Team
5 * @version V1.1.0
6 * @date 2019-10-28
7 * @brief GPIO library.
8 ******************************************************************************
9 * @attention
10 *
11 ******************************************************************************
12 */
13 #include "lib_gpio.h"
14
15
16 /**
17 * @brief Initializes GPIO.
18 * @param GPIOx: GPIOB~GPIOF
19 InitStruct:GPIO configuration.
20 GPIO_Pin: can use the '|' operator
21 GPIO_Pin_0 ~ GPIO_Pin_15 or GPIO_Pin_All
22 GPIO_Mode:
23 GPIO_MODE_INPUT
24 GPIO_MODE_OUTPUT_CMOS
25 GPIO_MODE_OUTPUT_OD
26 GPIO_MODE_INOUT_OD
27 GPIO_MODE_INOUT_CMOS
28 GPIO_MODE_FORBIDDEN
29 * @retval None
30 */
GPIOBToF_Init(GPIO_Type * GPIOx,GPIO_InitType * InitStruct)31 void GPIOBToF_Init(GPIO_Type *GPIOx, GPIO_InitType *InitStruct)
32 {
33 uint32_t tmp_reg1, tmp_reg2;
34
35 /* Check parameters */
36 assert_parameters(IS_GPIO_ALL_INSTANCE(GPIOx));
37 assert_parameters(IS_GPIO_PIN(InitStruct->GPIO_Pin));
38 assert_parameters(IS_GPIO_MODE(InitStruct->GPIO_Mode));
39
40 /* Configure ATT */
41 if (InitStruct->GPIO_Mode & 0x2U)
42 {
43 tmp_reg1 = GPIOx->ATT;
44 tmp_reg1 &= ~InitStruct->GPIO_Pin;
45 if (InitStruct->GPIO_Mode & 0x1U)
46 {
47 tmp_reg1 |= InitStruct->GPIO_Pin;
48 }
49 GPIOx->ATT = tmp_reg1;
50 }
51
52 /* Configure output/input mode */
53 tmp_reg1 = GPIOx->OEN;
54 tmp_reg1 &= ~InitStruct->GPIO_Pin;
55 tmp_reg2 = GPIOx->IE;
56 tmp_reg2 &= ~InitStruct->GPIO_Pin;
57 if (InitStruct->GPIO_Mode & 0x8U)
58 {
59 tmp_reg2 |= InitStruct->GPIO_Pin;
60 }
61 if (InitStruct->GPIO_Mode & 0x4U)
62 {
63 tmp_reg1 |= InitStruct->GPIO_Pin;
64 }
65 GPIOx->OEN = tmp_reg1;
66 GPIOx->IE = tmp_reg2;
67 }
68
69 /**
70 * @brief Initializes GPIOA.
71 * @param GPIOx: GPIOA
72 InitStruct:GPIO configuration.
73 GPIO_Pin: can use the '|' operator
74 GPIO_Pin_0 ~ GPIO_Pin_15 or GPIO_Pin_All
75 GPIO_Mode:
76 GPIO_MODE_INPUT
77 GPIO_MODE_OUTPUT_CMOS
78 GPIO_MODE_OUTPUT_OD
79 GPIO_MODE_INOUT_OD
80 GPIO_MODE_INOUT_CMOS
81 GPIO_MODE_FORBIDDEN
82 * @retval None
83 */
GPIOA_Init(GPIOA_Type * GPIOx,GPIO_InitType * InitStruct)84 void GPIOA_Init(GPIOA_Type *GPIOx, GPIO_InitType *InitStruct)
85 {
86 uint32_t tmp_reg1, tmp_reg2;
87
88 /* Check parameters */
89 assert_parameters(IS_PMUIO_ALL_INSTANCE(GPIOx));
90 assert_parameters(IS_GPIO_PIN(InitStruct->GPIO_Pin));
91 assert_parameters(IS_GPIO_MODE(InitStruct->GPIO_Mode));
92
93 /* Configure ATT */
94 if (InitStruct->GPIO_Mode & 0x2U)
95 {
96 tmp_reg1 = GPIOx->ATT;
97 tmp_reg1 &= ~InitStruct->GPIO_Pin;
98 if (InitStruct->GPIO_Mode & 0x1U)
99 {
100 tmp_reg1 |= InitStruct->GPIO_Pin;
101 }
102 GPIOx->ATT = tmp_reg1;
103 }
104
105 /* Configure output/input mode */
106 tmp_reg1 = GPIOx->OEN;
107 tmp_reg1 &= ~InitStruct->GPIO_Pin;
108 tmp_reg2 = GPIOx->IE;
109 tmp_reg2 &= ~InitStruct->GPIO_Pin;
110 if (InitStruct->GPIO_Mode & 0x8U)
111 {
112 tmp_reg2 |= InitStruct->GPIO_Pin;
113 }
114 if (InitStruct->GPIO_Mode & 0x4U)
115 {
116 tmp_reg1 |= InitStruct->GPIO_Pin;
117 }
118 GPIOx->OEN = tmp_reg1;
119 GPIOx->IE = tmp_reg2;
120 }
121
122 /**
123 * @brief Reads input data register bit.
124 * @param GPIOx: GPIOB~GPIOF
125 GPIO_Pin:GPIO_Pin_0~GPIO_Pin_15.
126 * @retval input pin value.
127 */
GPIOBToF_ReadInputDataBit(GPIO_Type * GPIOx,uint16_t GPIO_Pin)128 uint8_t GPIOBToF_ReadInputDataBit(GPIO_Type *GPIOx, uint16_t GPIO_Pin)
129 {
130 /* Check parameters */
131 assert_parameters(IS_GPIO_ALL_INSTANCE(GPIOx));
132 assert_parameters(IS_GPIO_PINR(GPIO_Pin));
133
134 if (GPIOx->STS & GPIO_Pin)
135 return 1;
136 else
137 return 0;
138 }
139
140 /**
141 * @brief Reads input data register bit.
142 * @param GPIOx: GPIOA
143 GPIO_Pin:GPIO_Pin_0~GPIO_Pin_15.
144 * @retval input pin value.
145 */
GPIOA_ReadInputDataBit(GPIOA_Type * GPIOx,uint16_t GPIO_Pin)146 uint8_t GPIOA_ReadInputDataBit(GPIOA_Type *GPIOx, uint16_t GPIO_Pin)
147 {
148 /* Check parameters */
149 assert_parameters(IS_PMUIO_ALL_INSTANCE(GPIOx));
150 assert_parameters(IS_GPIO_PINR(GPIO_Pin));
151
152 if (GPIOx->STS & GPIO_Pin)
153 return 1;
154 else
155 return 0;
156 }
157
158 /**
159 * @brief Reads input data register.
160 * @param GPIOx: GPIOB~GPIOF
161 * @retval input port value.
162 */
GPIOBToF_ReadInputData(GPIO_Type * GPIOx)163 uint16_t GPIOBToF_ReadInputData(GPIO_Type* GPIOx)
164 {
165 /* Check parameters */
166 assert_parameters(IS_GPIO_ALL_INSTANCE(GPIOx));
167
168 return GPIOx->STS;
169 }
170
171 /**
172 * @brief Reads input data register.
173 * @param GPIOx: GPIOA
174 * @retval input port value.
175 */
GPIOA_ReadInputData(GPIOA_Type * GPIOx)176 uint16_t GPIOA_ReadInputData(GPIOA_Type* GPIOx)
177 {
178 /* Check parameters */
179 assert_parameters(IS_PMUIO_ALL_INSTANCE(GPIOx));
180
181 return GPIOx->STS;
182 }
183
184 /**
185 * @brief Reads output data register bit.
186 * @param GPIOx: GPIOB~GPIOF
187 GPIO_Pin:GPIO_Pin_0~GPIO_Pin_15
188 * @retval output pin value.
189 */
GPIOBToF_ReadOutputDataBit(GPIO_Type * GPIOx,uint16_t GPIO_Pin)190 uint8_t GPIOBToF_ReadOutputDataBit(GPIO_Type* GPIOx, uint16_t GPIO_Pin)
191 {
192 /* Check parameters */
193 assert_parameters(IS_GPIO_ALL_INSTANCE(GPIOx));
194 assert_parameters(IS_GPIO_PINR(GPIO_Pin));
195
196 if (GPIOx->DAT & GPIO_Pin)
197 return 1;
198 else
199 return 0;
200 }
201
202 /**
203 * @brief Reads output data register bit.
204 * @param GPIOx: GPIOA
205 GPIO_Pin:GPIO_Pin_0~GPIO_Pin_15
206 * @retval output pin value.
207 */
GPIOA_ReadOutputDataBit(GPIOA_Type * GPIOx,uint16_t GPIO_Pin)208 uint8_t GPIOA_ReadOutputDataBit(GPIOA_Type* GPIOx, uint16_t GPIO_Pin)
209 {
210 /* Check parameters */
211 assert_parameters(IS_PMUIO_ALL_INSTANCE(GPIOx));
212 assert_parameters(IS_GPIO_PINR(GPIO_Pin));
213
214 if (GPIOx->DAT & GPIO_Pin)
215 return 1;
216 else
217 return 0;
218 }
219
220 /**
221 * @brief Reads output data register.
222 * @param GPIOx: GPIOB~GPIOF
223 * @retval Output port value.
224 */
GPIOBToF_ReadOutputData(GPIO_Type * GPIOx)225 uint16_t GPIOBToF_ReadOutputData(GPIO_Type* GPIOx)
226 {
227 /* Check parameters */
228 assert_parameters(IS_GPIO_ALL_INSTANCE(GPIOx));
229
230 return GPIOx->DAT;
231 }
232
233 /**
234 * @brief Reads output data register.
235 * @param GPIOx: GPIOA
236 * @retval Output port value.
237 */
GPIOA_ReadOutputData(GPIOA_Type * GPIOx)238 uint16_t GPIOA_ReadOutputData(GPIOA_Type* GPIOx)
239 {
240 /* Check parameters */
241 assert_parameters(IS_PMUIO_ALL_INSTANCE(GPIOx));
242
243 return GPIOx->DAT;
244 }
245
246 /**
247 * @brief Writes output data register bit.
248 * @param DATx: GPIO_A~GPIO_F
249 PinNum: 0~15
250 val:value write to register bit.
251 * @retval None.
252 */
GPIO_WriteBit(GPIO_DATInitType * DATx,uint8_t PinNum,uint8_t val)253 void GPIO_WriteBit(GPIO_DATInitType* DATx, uint8_t PinNum, uint8_t val)
254 {
255 /* Check parameters */
256 assert_parameters(IS_GPIO_DAT(DATx));
257 assert_parameters(IS_GPIO_PINNUM(PinNum));
258 assert_parameters(IS_GPIO_BITVAL(val));
259
260 DATx->DATBitBand[PinNum] = val;
261 }
262 /**
263 * @brief Write output data register bit.
264 * @param GPIOx: GPIOB~GPIOF
265 GPIO_Pin: can use the ‘|’ operator
266 GPIO_Pin_0~GPIO_Pin_15 or GPIO_Pin_All
267 val:value write to register bit.
268 * @retval None.
269 */
GPIOBToF_WriteBit(GPIO_Type * GPIOx,uint16_t GPIO_Pin,uint8_t val)270 void GPIOBToF_WriteBit(GPIO_Type* GPIOx, uint16_t GPIO_Pin, uint8_t val)
271 {
272 /* Check parameters */
273 assert_parameters(IS_GPIO_ALL_INSTANCE(GPIOx));
274 assert_parameters(IS_GPIO_PIN(GPIO_Pin));
275 assert_parameters(IS_GPIO_BITVAL(val));
276
277 if (val == 1)
278 {
279 GPIOx->DAT |= GPIO_Pin;
280 }
281 else
282 {
283 GPIOx->DAT &= ~GPIO_Pin;
284 }
285 }
286
287 /**
288 * @brief Write output data register bit.
289 * @param GPIOx: GPIOA
290 GPIO_Pin: can use the ‘|’ operator
291 GPIO_Pin_0~GPIO_Pin_15 or GPIO_Pin_All
292 val:value write to register bit.
293 * @retval None.
294 */
GPIOA_WriteBit(GPIOA_Type * GPIOx,uint16_t GPIO_Pin,uint8_t val)295 void GPIOA_WriteBit(GPIOA_Type* GPIOx, uint16_t GPIO_Pin, uint8_t val)
296 {
297 /* Check parameters */
298 assert_parameters(IS_PMUIO_ALL_INSTANCE(GPIOx));
299 assert_parameters(IS_GPIO_PIN(GPIO_Pin));
300 assert_parameters(IS_GPIO_BITVAL(val));
301
302 if (val == 1)
303 {
304 GPIOx->DAT |= GPIO_Pin;
305 }
306 else
307 {
308 GPIOx->DAT &= ~GPIO_Pin;
309 }
310 }
311
312 /**
313 * @brief Writes output data register.
314 * @param GPIOx: GPIOB~GPIOF
315 val:value write to register.
316 * @retval None.
317 */
GPIOBToF_Write(GPIO_Type * GPIOx,uint16_t val)318 void GPIOBToF_Write(GPIO_Type* GPIOx, uint16_t val)
319 {
320 /* Check parameters */
321 assert_parameters(IS_GPIO_ALL_INSTANCE(GPIOx));
322
323 GPIOx->DAT = val;
324 }
325
326 /**
327 * @brief Writes output data register.
328 * @param GPIOx: GPIOA
329 val:value write to register.
330 * @retval None.
331 */
GPIOA_Write(GPIOA_Type * GPIOx,uint16_t val)332 void GPIOA_Write(GPIOA_Type* GPIOx, uint16_t val)
333 {
334 /* Check parameters */
335 assert_parameters(IS_PMUIO_ALL_INSTANCE(GPIOx));
336
337 GPIOx->DAT = val;
338 }
339
340 /**
341 * @brief Enables or disables GPIO AF functiuon.
342 * @param GPIOx:GPIOB GPIOE
343 GPIO_AFx:
344 GPIOB_AF_PLLHDIV
345 GPIOB_AF_PLLLOUT
346 GPIOB_AF_OSC
347 GPIOE_AF_CMP1O
348 NewState:
349 ENABLE
350 DISABLE
351 * @retval None.
352 */
GPIOBToF_AFConfig(GPIO_Type * GPIOx,uint32_t GPIO_AFx,uint8_t NewState)353 void GPIOBToF_AFConfig(GPIO_Type* GPIOx, uint32_t GPIO_AFx, uint8_t NewState)
354 {
355 /* Check parameters */
356 assert_parameters(IS_GPIOAF_ALL_INSTANCE(GPIOx));
357 assert_parameters(IS_GPIO_GPIOAF(GPIO_AFx));
358 assert_parameters(IS_FUNCTIONAL_STATE(NewState));
359
360 if (GPIOx == GPIOB)
361 {
362 if (NewState == ENABLE)
363 {
364 GPIOAF->IOB_SEL |= GPIO_AFx;
365 }
366 else
367 {
368 GPIOAF->IOB_SEL &= ~GPIO_AFx;
369 }
370 }
371 if (GPIOx == GPIOE)
372 {
373 if (NewState == ENABLE)
374 {
375 GPIOAF->IOE_SEL |= GPIO_AFx;
376 }
377 else
378 {
379 GPIOAF->IOE_SEL &= ~GPIO_AFx;
380 }
381 }
382 }
383
384 /**
385 * @brief Enables or disables GPIOA AF function.
386 * @param PMUIO_AFx:can use the '|' operator
387 PMUIO7_AF_PLLDIV
388 PMUIO6_AF_CMP2O
389 PMUIO3_AF_PLLDIV
390 NewState:
391 ENABLE
392 DISABLE
393 * @retval None.
394 */
GPIOA_AFConfig(uint32_t PMUIO_AFx,uint8_t NewState)395 void GPIOA_AFConfig(uint32_t PMUIO_AFx, uint8_t NewState)
396 {
397 /* Check parameters */
398 assert_parameters(IS_GPIO_PMUIOAF(PMUIO_AFx));
399 assert_parameters(IS_FUNCTIONAL_STATE(NewState));
400
401 if (NewState == ENABLE)
402 {
403 GPIOA->SEL |= PMUIO_AFx;
404 }
405 else
406 {
407 GPIOA->SEL &= ~PMUIO_AFx;
408 }
409 }
410
411 /**
412 * @brief Enables or disables GPIO pin remap function.
413 * @param GPIO_Remap:
414 GPIO_REMAP_I2C
415 NewState:
416 ENABLE
417 DISABLE
418 * @retval None.
419 */
GPIO_PinRemapConfig(uint32_t GPIO_Remap,uint8_t NewState)420 void GPIO_PinRemapConfig(uint32_t GPIO_Remap, uint8_t NewState)
421 {
422 /* Check parameters */
423 assert_parameters(IS_GPIO_REMAP(GPIO_Remap));
424 assert_parameters(IS_FUNCTIONAL_STATE(NewState));
425
426 if (NewState == ENABLE)
427 {
428 GPIOAF->IO_MISC |= GPIO_Remap;
429 }
430 else
431 {
432 GPIOAF->IO_MISC &= ~GPIO_Remap;
433 }
434 }
435
436 /**
437 * @brief Configures GPIO PLLDIV function.
438 * @param Divider:
439 GPIO_PLLDIV_1
440 GPIO_PLLDIV_2
441 GPIO_PLLDIV_4
442 GPIO_PLLDIV_8
443 GPIO_PLLDIV_16
444 * @retval None.
445 */
GPIO_PLLDIVConfig(uint32_t Divider)446 void GPIO_PLLDIVConfig(uint32_t Divider)
447 {
448 uint32_t tmp;
449
450 /* Check parameters */
451 assert_parameters(IS_GPIO_PLLDIV(Divider));
452
453 tmp = GPIOAF->IO_MISC;
454 tmp &= ~GPIOAF_IO_MISC_PLLHDIV;
455 tmp |= Divider;
456 GPIOAF->IO_MISC = tmp;
457 }
458
459 /**
460 * @brief Enables or disables GPIOA de-glitch circuit.
461 * @param GPIO_Pin: can use the '|' operator
462 GPIO_Pin_0~GPIO_Pin_15 or GPIO_Pin_All
463 NewState:
464 ENABLE
465 DISABLE
466 * @retval None.
467 */
GPIOA_DeGlitchCmd(uint16_t GPIO_Pin,uint8_t NewState)468 void GPIOA_DeGlitchCmd(uint16_t GPIO_Pin, uint8_t NewState)
469 {
470 /* Check parameters */
471 assert_parameters(IS_GPIO_PIN(GPIO_Pin));
472 assert_parameters(IS_FUNCTIONAL_STATE(NewState));
473
474 /*IOA wake-up signal will go through de-glitch circuit.*/
475 if (NewState == ENABLE)
476 {
477 GPIOA->IOANODEG &= ~GPIO_Pin;
478 }
479 /*IOA wake-up signal will not go through de-glitch circuit.*/
480 else
481 {
482 GPIOA->IOANODEG |= GPIO_Pin;
483 }
484 }
485
486 /*********************************** END OF FILE ******************************/
487