1 /**
2   ******************************************************************************
3   * @file    lib_gpio.c
4   * @author  Application Team
5   * @version V4.4.0
6   * @date    2018-09-27
7   * @brief   GPIO library.
8   ******************************************************************************
9   * @attention
10   *
11   ******************************************************************************
12   */
13 #include "lib_gpio.h"
14 
15 
16 /**
17   * @brief  GPIO initialization.
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_TypeDef * GPIOx,GPIO_InitType * InitStruct)31 void GPIOBToF_Init(GPIO_TypeDef *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   if (GPIOF == GPIOx)
41     InitStruct->GPIO_Pin &= ~(GPIO_Pin_2);
42 
43   /* Configure ATT */
44   if (InitStruct->GPIO_Mode & 0x2U)
45   {
46     tmp_reg1 = GPIOx->ATT;
47     tmp_reg1 &= ~InitStruct->GPIO_Pin;
48     if (InitStruct->GPIO_Mode & 0x1U)
49     {
50       tmp_reg1 |= InitStruct->GPIO_Pin;
51     }
52     GPIOx->ATT = tmp_reg1;
53   }
54 
55   /* Configure output/input mode */
56   tmp_reg1 = GPIOx->OEN;
57   tmp_reg1 &= ~InitStruct->GPIO_Pin;
58   tmp_reg2 = GPIOx->IE;
59   tmp_reg2 &= ~InitStruct->GPIO_Pin;
60   if (InitStruct->GPIO_Mode & 0x8U)
61   {
62     tmp_reg2 |= InitStruct->GPIO_Pin;
63   }
64   if (InitStruct->GPIO_Mode & 0x4U)
65   {
66     tmp_reg1 |= InitStruct->GPIO_Pin;
67   }
68   GPIOx->OEN = tmp_reg1;
69   GPIOx->IE = tmp_reg2;
70 }
71 
72 /**
73   * @brief  GPIOA initialization.
74   * @param  GPIOx: GPIOA
75             InitStruct:GPIO configuration.
76                 GPIO_Pin: can use the ��|�� operator
77                     GPIO_Pin_0 ~ GPIO_Pin_15 or GPIO_Pin_All
78                 GPIO_Mode:
79                     GPIO_Mode_INPUT
80                     GPIO_Mode_OUTPUT_CMOS
81                     GPIO_Mode_OUTPUT_OD
82                     GPIO_Mode_INOUT_OD
83                     GPIO_Mode_FORBIDDEN
84   * @retval None
85   */
GPIOA_Init(GPIOA_TypeDef * GPIOx,GPIO_InitType * InitStruct)86 void GPIOA_Init(GPIOA_TypeDef *GPIOx, GPIO_InitType *InitStruct)
87 {
88   uint32_t tmp_reg1, tmp_reg2;
89 
90   /* Check parameters */
91   assert_parameters(IS_PMUIO_ALL_INSTANCE(GPIOx));
92   assert_parameters(IS_GPIO_PIN(InitStruct->GPIO_Pin));
93   assert_parameters(IS_GPIO_MODE(InitStruct->GPIO_Mode));
94 
95   /* Configure ATT */
96   if (InitStruct->GPIO_Mode & 0x2U)
97   {
98     tmp_reg1 = GPIOx->ATT;
99     tmp_reg1 &= ~InitStruct->GPIO_Pin;
100     if (InitStruct->GPIO_Mode & 0x1U)
101     {
102       tmp_reg1 |= InitStruct->GPIO_Pin;
103     }
104     GPIOx->ATT = tmp_reg1;
105   }
106 
107   /* Configure output/input mode */
108   tmp_reg1 = GPIOx->OEN;
109   tmp_reg1 &= ~InitStruct->GPIO_Pin;
110   tmp_reg2 = GPIOx->IE;
111   tmp_reg2 &= ~InitStruct->GPIO_Pin;
112   if (InitStruct->GPIO_Mode & 0x8U)
113   {
114     tmp_reg2 |= InitStruct->GPIO_Pin;
115   }
116   if (InitStruct->GPIO_Mode & 0x4U)
117   {
118     tmp_reg1 |= InitStruct->GPIO_Pin;
119   }
120   GPIOx->OEN = tmp_reg1;
121   GPIOx->IE = tmp_reg2;
122 }
123 
124 /**
125   * @brief  Read input data register bit.
126   * @param  GPIOx: GPIOB~GPIOF
127             GPIO_Pin:GPIO_Pin_0~GPIO_Pin_15.
128   * @retval input pin value.
129   */
GPIOBToF_ReadInputDataBit(GPIO_TypeDef * GPIOx,uint16_t GPIO_Pin)130 uint8_t GPIOBToF_ReadInputDataBit(GPIO_TypeDef *GPIOx, uint16_t GPIO_Pin)
131 {
132   uint32_t tmp;
133 
134   /* Check parameters */
135   assert_parameters(IS_GPIO_ALL_INSTANCE(GPIOx));
136   assert_parameters(IS_GPIO_PINR(GPIO_Pin));
137 
138   tmp = GPIOx->STS;
139 
140   tmp &= GPIO_Pin;
141   if (tmp)
142     return 1;
143   else
144     return 0;
145 }
146 
147 /**
148   * @brief  Read input data register bit.
149   * @param  GPIOx: GPIOA
150             GPIO_Pin:GPIO_Pin_0~GPIO_Pin_15.
151   * @retval input pin value.
152   */
GPIOA_ReadInputDataBit(GPIOA_TypeDef * GPIOx,uint16_t GPIO_Pin)153 uint8_t GPIOA_ReadInputDataBit(GPIOA_TypeDef *GPIOx, uint16_t GPIO_Pin)
154 {
155   uint32_t tmp;
156 
157   /* Check parameters */
158   assert_parameters(IS_PMUIO_ALL_INSTANCE(GPIOx));
159   assert_parameters(IS_GPIO_PINR(GPIO_Pin));
160 
161   tmp = GPIOx->STS;
162 
163   tmp &= GPIO_Pin;
164   if (tmp)
165     return 1;
166   else
167     return 0;
168 }
169 
170 /**
171   * @brief  Read input data register.
172   * @param  GPIOx: GPIOB~GPIOF
173   * @retval input port value.
174   */
GPIOBToF_ReadInputData(GPIO_TypeDef * GPIOx)175 uint16_t GPIOBToF_ReadInputData(GPIO_TypeDef* GPIOx)
176 {
177   /* Check parameters */
178   assert_parameters(IS_GPIO_ALL_INSTANCE(GPIOx));
179 
180   return GPIOx->STS;
181 }
182 
183 /**
184   * @brief  Read input data register.
185   * @param  GPIOx: GPIOA
186   * @retval input port value.
187   */
GPIOA_ReadInputData(GPIOA_TypeDef * GPIOx)188 uint16_t GPIOA_ReadInputData(GPIOA_TypeDef* GPIOx)
189 {
190   /* Check parameters */
191   assert_parameters(IS_PMUIO_ALL_INSTANCE(GPIOx));
192 
193   return GPIOx->STS;
194 }
195 
196 /**
197   * @brief  Read output data register bit.
198   * @param  GPIOx: GPIOB~GPIOF
199             GPIO_Pin:GPIO_Pin_0~GPIO_Pin_15
200   * @retval output pin value.
201   */
GPIOBToF_ReadOutputDataBit(GPIO_TypeDef * GPIOx,uint16_t GPIO_Pin)202 uint8_t GPIOBToF_ReadOutputDataBit(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin)
203 {
204   uint32_t tmp;
205 
206   /* Check parameters */
207   assert_parameters(IS_GPIO_ALL_INSTANCE(GPIOx));
208   assert_parameters(IS_GPIO_PINR(GPIO_Pin));
209 
210   tmp = GPIOx->DAT;
211   tmp &= GPIO_Pin;
212   if (tmp)
213     return 1;
214   else
215     return 0;
216 }
217 
218 /**
219   * @brief  Read output data register bit.
220   * @param  GPIOx: GPIOA
221             GPIO_Pin:GPIO_Pin_0~GPIO_Pin_15
222   * @retval output pin value.
223   */
GPIOA_ReadOutputDataBit(GPIOA_TypeDef * GPIOx,uint16_t GPIO_Pin)224 uint8_t GPIOA_ReadOutputDataBit(GPIOA_TypeDef* GPIOx, uint16_t GPIO_Pin)
225 {
226   uint32_t tmp;
227 
228   /* Check parameters */
229   assert_parameters(IS_PMUIO_ALL_INSTANCE(GPIOx));
230   assert_parameters(IS_GPIO_PINR(GPIO_Pin));
231 
232   tmp = GPIOx->DAT;
233   tmp &= GPIO_Pin;
234   if (tmp)
235     return 1;
236   else
237     return 0;
238 }
239 
240 /**
241   * @brief  Read output data register.
242   * @param  GPIOx: GPIOB~GPIOF
243   * @retval Output port value.
244   */
GPIOBToF_ReadOutputData(GPIO_TypeDef * GPIOx)245 uint16_t GPIOBToF_ReadOutputData(GPIO_TypeDef* GPIOx)
246 {
247   /* Check parameters */
248   assert_parameters(IS_GPIO_ALL_INSTANCE(GPIOx));
249 
250   return GPIOx->DAT;
251 }
252 
253 /**
254   * @brief  Read output data register.
255   * @param  GPIOx: GPIOA
256   * @retval Output port value.
257   */
GPIOA_ReadOutputData(GPIOA_TypeDef * GPIOx)258 uint16_t GPIOA_ReadOutputData(GPIOA_TypeDef* GPIOx)
259 {
260   /* Check parameters */
261   assert_parameters(IS_PMUIO_ALL_INSTANCE(GPIOx));
262 
263   return GPIOx->DAT;
264 }
265 
266 /**
267   * @brief  Set output data register bit.
268   * @param  GPIOx: GPIOB~GPIOF
269             GPIO_Pin: can use the ��|�� operator
270                 GPIO_Pin_0 ~ GPIO_Pin_15 or GPIO_Pin_All
271   * @retval None.
272   */
GPIOBToF_SetBits(GPIO_TypeDef * GPIOx,uint16_t GPIO_Pin)273 void GPIOBToF_SetBits(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin)
274 {
275   /* Check parameters */
276   assert_parameters(IS_GPIO_ALL_INSTANCE(GPIOx));
277   assert_parameters(IS_GPIO_PIN(GPIO_Pin));
278 
279   GPIOx->DAT |= GPIO_Pin;
280 }
281 
282 /**
283   * @brief  Set output data register bit.
284   * @param  GPIOx: GPIOA
285             GPIO_Pin: can use the ��|�� operator
286                 GPIO_Pin_0~GPIO_Pin_15 or GPIO_Pin_All
287   * @retval None.
288   */
GPIOA_SetBits(GPIOA_TypeDef * GPIOx,uint16_t GPIO_Pin)289 void GPIOA_SetBits(GPIOA_TypeDef* GPIOx, uint16_t GPIO_Pin)
290 {
291   /* Check parameters */
292   assert_parameters(IS_PMUIO_ALL_INSTANCE(GPIOx));
293   assert_parameters(IS_GPIO_PIN(GPIO_Pin));
294 
295   GPIOx->DAT |= GPIO_Pin;
296 }
297 
298 /**
299   * @brief  Reset output data register bit.
300   * @param  GPIOx: GPIOB~GPIOF
301             GPIO_Pin: can use the ��|�� operator
302                 GPIO_Pin_0~GPIO_Pin_15 or GPIO_Pin_All
303   * @retval None.
304   */
GPIOBToF_ResetBits(GPIO_TypeDef * GPIOx,uint16_t GPIO_Pin)305 void GPIOBToF_ResetBits(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin)
306 {
307   /* Check parameters */
308   assert_parameters(IS_GPIO_ALL_INSTANCE(GPIOx));
309   assert_parameters(IS_GPIO_PIN(GPIO_Pin));
310 
311   GPIOx->DAT &= ~GPIO_Pin;
312 }
313 
314 /**
315   * @brief  Reset output data register bit.
316   * @param  GPIOx: GPIOA
317             GPIO_Pin: can use the ��|�� operator
318                 GPIO_Pin_0~GPIO_Pin_15 or GPIO_Pin_All
319   * @retval None.
320   */
GPIOA_ResetBits(GPIOA_TypeDef * GPIOx,uint16_t GPIO_Pin)321 void GPIOA_ResetBits(GPIOA_TypeDef* GPIOx, uint16_t GPIO_Pin)
322 {
323   /* Check parameters */
324   assert_parameters(IS_PMUIO_ALL_INSTANCE(GPIOx));
325   assert_parameters(IS_GPIO_PIN(GPIO_Pin));
326 
327   GPIOx->DAT &= ~GPIO_Pin;
328 }
329 
330 /**
331   * @brief  Write output data register bit.
332   * @param  GPIOx: GPIOB~GPIOF
333             GPIO_Pin: can use the ��|�� operator
334                 GPIO_Pin_0~GPIO_Pin_15 or GPIO_Pin_All
335             val:value write to register bit.
336   * @retval None.
337   */
GPIOBToF_WriteBit(GPIO_TypeDef * GPIOx,uint16_t GPIO_Pin,uint8_t val)338 void GPIOBToF_WriteBit(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin, uint8_t val)
339 {
340   /* Check parameters */
341   assert_parameters(IS_GPIO_ALL_INSTANCE(GPIOx));
342   assert_parameters(IS_GPIO_PIN(GPIO_Pin));
343   assert_parameters(IS_GPIO_BITVAL(val));
344 
345   if (val == 1)
346   {
347     GPIOx->DAT |= GPIO_Pin;
348   }
349   else
350   {
351     GPIOx->DAT &= ~GPIO_Pin;
352   }
353 }
354 
355 /**
356   * @brief  Write output data register bit.
357   * @param  GPIOx: GPIOA
358             GPIO_Pin: can use the ��|�� operator
359                  GPIO_Pin_0~GPIO_Pin_15 or GPIO_Pin_All
360             val:value write to register bit.
361   * @retval None.
362   */
GPIOA_WriteBit(GPIOA_TypeDef * GPIOx,uint16_t GPIO_Pin,uint8_t val)363 void GPIOA_WriteBit(GPIOA_TypeDef* GPIOx, uint16_t GPIO_Pin, uint8_t val)
364 {
365   /* Check parameters */
366   assert_parameters(IS_PMUIO_ALL_INSTANCE(GPIOx));
367   assert_parameters(IS_GPIO_PIN(GPIO_Pin));
368   assert_parameters(IS_GPIO_BITVAL(val));
369 
370   if (val == 1)
371   {
372     GPIOx->DAT |= GPIO_Pin;
373   }
374   else
375   {
376     GPIOx->DAT &= ~GPIO_Pin;
377   }
378 }
379 
380 /**
381   * @brief  Write output data register.
382   * @param  GPIOx: GPIOB~GPIOF
383             val:value write to register.
384   * @retval None.
385   */
GPIOBToF_Write(GPIO_TypeDef * GPIOx,uint16_t val)386 void GPIOBToF_Write(GPIO_TypeDef* GPIOx, uint16_t val)
387 {
388   /* Check parameters */
389   assert_parameters(IS_GPIO_ALL_INSTANCE(GPIOx));
390 
391   GPIOx->DAT = val;
392 }
393 
394 /**
395   * @brief  Write output data register.
396   * @param  GPIOx: GPIOA
397             val:value write to register.
398   * @retval None.
399   */
GPIOA_Write(GPIOA_TypeDef * GPIOx,uint16_t val)400 void GPIOA_Write(GPIOA_TypeDef* GPIOx, uint16_t val)
401 {
402   /* Check parameters */
403   assert_parameters(IS_PMUIO_ALL_INSTANCE(GPIOx));
404 
405   GPIOx->DAT = val;
406 }
407 
408 /**
409   * @brief  GPIO AF configure.
410   * @param  GPIOx:GPIOB GPIOE
411             GPIO_AFx:
412                 GPIOB_AF_PLLHDIV
413                 GPIOB_AF_OSC
414                 GPIOB_AF_PLLLOUT
415                 GPIOE_AF_CMP1O
416             NewState:
417                 ENABLE
418                 DISABLE
419   * @retval None.
420   */
GPIOBToF_AFConfig(GPIO_TypeDef * GPIOx,uint32_t GPIO_AFx,uint8_t NewState)421 void GPIOBToF_AFConfig(GPIO_TypeDef* GPIOx, uint32_t GPIO_AFx, uint8_t NewState)
422 {
423   uint32_t tmp;
424 
425   /* Check parameters */
426   assert_parameters(IS_GPIOAF_ALL_INSTANCE(GPIOx));
427   assert_parameters(IS_GPIO_GPIOAF(GPIO_AFx));
428   assert_parameters(IS_FUNCTIONAL_STATE(NewState));
429 
430   if (GPIOx == GPIOB)
431   {
432     tmp = GPIOAF->SELB;
433     if (NewState != DISABLE)
434     {
435       tmp |= GPIO_AFx;
436     }
437     else
438     {
439       tmp &= ~GPIO_AFx;
440     }
441     GPIOAF->SELB = tmp;
442   }
443   if (GPIOx == GPIOE)
444   {
445     tmp = GPIOAF->SELE;
446     if (NewState != DISABLE)
447     {
448       tmp |= GPIO_AFx;
449     }
450     else
451     {
452      tmp &= ~GPIO_AFx;
453     }
454     GPIOAF->SELE = tmp;
455   }
456 }
457 
458 /**
459   * @brief  GPIO AF configure.
460   * @param  PMUIO_AFx:
461                 PMUIO7_AF_PLLDIV
462                 PMUIO_AF_CMP2O
463                 PMUIO3_AF_PLLDIV
464             NewState:
465                 ENABLE
466                 DISABLE
467   * @retval None.
468   */
GPIOA_AFConfig(uint32_t PMUIO_AFx,uint8_t NewState)469 void GPIOA_AFConfig(uint32_t PMUIO_AFx, uint8_t NewState)
470 {
471   /* Check parameters */
472   assert_parameters(IS_GPIO_PMUIOAF(PMUIO_AFx));
473   assert_parameters(IS_FUNCTIONAL_STATE(NewState));
474 
475   if (NewState != DISABLE)
476   {
477     GPIOA->SEL |= PMUIO_AFx;
478   }
479   else
480   {
481     GPIOA->SEL &= ~PMUIO_AFx;
482   }
483 }
484 
485 /**
486   * @brief  GPIO pin remap.
487   * @param  GPIO_Remap:
488                 GPIO_REMAP_I2C
489             NewState:
490                ENABLE
491                DISABLE
492   * @retval None.
493   */
GPIO_PinRemapConfig(uint32_t GPIO_Remap,uint8_t NewState)494 void GPIO_PinRemapConfig(uint32_t GPIO_Remap, uint8_t NewState)
495 {
496   uint32_t tmp;
497 
498   /* Check parameters */
499   assert_parameters(IS_GPIO_REMAP(GPIO_Remap));
500   assert_parameters(IS_FUNCTIONAL_STATE(NewState));
501 
502   tmp = GPIOAF->_MISC;
503   tmp &= ~GPIO_Remap;
504   if (NewState == ENABLE)
505     tmp |= GPIO_Remap;
506   GPIOAF->_MISC = tmp;
507 }
508 
509 /**
510   * @brief  GPIO PLLDIV configure.
511   * @param  Divider:
512                 GPIO_PLLDIV_1
513                 GPIO_PLLDIV_2
514                 GPIO_PLLDIV_4
515                 GPIO_PLLDIV_8
516                 GPIO_PLLDIV_16
517   * @retval None.
518   */
GPIO_PLLDIV_Config(uint32_t Divider)519 void GPIO_PLLDIV_Config(uint32_t Divider)
520 {
521   uint32_t tmp;
522 
523   /* Check parameters */
524   assert_parameters(IS_GPIO_PLLDIV(Divider));
525 
526   tmp = GPIOAF->_MISC;
527   tmp &= ~IO_MISC_PLLHDIV;
528   tmp |= Divider;
529   GPIOAF->_MISC = tmp;
530 }
531 
532 /**
533   * @brief  GPIOA de-glitch circuit control.
534   * @param  GPIO_Pin: can use the ��|�� operator
535                  GPIO_Pin_0~GPIO_Pin_15 or GPIO_Pin_All
536             NewState:
537                ENABLE
538                DISABLE
539   * @retval None.
540   */
GPIOA_NoDeg_Cmd(uint16_t GPIO_Pin,uint8_t NewState)541 void GPIOA_NoDeg_Cmd( uint16_t GPIO_Pin, uint8_t NewState)
542 {
543   uint16_t tmp;
544 
545   /* Check parameters */
546   assert_parameters(IS_GPIO_PIN(GPIO_Pin));
547   assert_parameters(IS_FUNCTIONAL_STATE(NewState));
548 
549   tmp = GPIOA->IOANODEG;
550   /*IOA wake-up signal will not go through de-glitch circuit.*/
551   if (NewState != DISABLE)
552   {
553     tmp |= GPIO_Pin;
554   }
555   /*IOA wake-up signal will go through de-glitch circuit.*/
556   else
557   {
558     tmp &= ~GPIO_Pin;
559   }
560   GPIOA->IOANODEG = tmp;
561 }
562 
563 /*********************************** END OF FILE ******************************/
564