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