1 /*
2 * Copyright 2021 MindMotion Microelectronics Co., Ltd.
3 * All rights reserved.
4 *
5 * SPDX-License-Identifier: BSD-3-Clause
6 */
7
8 #include "hal_gpio.h"
9
GPIO_Init(GPIO_Type * GPIOx,GPIO_Init_Type * init)10 void GPIO_Init(GPIO_Type * GPIOx, GPIO_Init_Type * init)
11 {
12 uint8_t idx;
13 uint8_t i;
14 uint32_t pin;
15 __IO uint32_t * addr;
16
17 /* 1x. */
18 uint32_t dat = init->PinMode & 0xFu;
19 if (init->PinMode & 0x10u)
20 {
21 dat |= init->Speed;
22 }
23
24 /* 0x. */
25 addr = &(GPIOx->CRL);
26 for (i = 0u; i < 8u; i++)
27 {
28 idx = i * 4u;
29 if ( (init->Pins) & (1u << i) )
30 {
31 *addr = ( *addr & ~(0xFu << idx) ) | (dat << idx);
32 }
33 }
34
35 addr = &(GPIOx->CRH);
36 pin = init->Pins >> 8u;
37 for (i = 0u; i < 8u; i++)
38 {
39 idx = i * 4u;
40 if ( pin & (1u << i) )
41 {
42 *addr = ( *addr & ~(0xFu << idx) ) | (dat << idx);
43 }
44 }
45
46 /* 2x,4x. */
47 if (init->PinMode == GPIO_PinMode_In_PullDown)
48 {
49 GPIOx->BRR |= init->Pins;
50 }
51 else if (init->PinMode == GPIO_PinMode_In_PullUp)
52 {
53 GPIOx->BSRR |= init->Pins;
54 }
55 }
56
GPIO_ReadInDataBit(GPIO_Type * GPIOx,uint16_t pin)57 bool GPIO_ReadInDataBit(GPIO_Type * GPIOx, uint16_t pin)
58 {
59 return (GPIOx->IDR & pin);
60 }
61
GPIO_ReadInData(GPIO_Type * GPIOx)62 uint16_t GPIO_ReadInData(GPIO_Type * GPIOx)
63 {
64 return (uint16_t)(GPIOx->IDR);
65 }
66
GPIO_ReadOutDataBit(GPIO_Type * GPIOx,uint16_t pins)67 bool GPIO_ReadOutDataBit(GPIO_Type * GPIOx, uint16_t pins)
68 {
69 return (GPIOx->ODR & pins);
70 }
71
GPIO_ReadOutData(GPIO_Type * GPIOx)72 uint16_t GPIO_ReadOutData(GPIO_Type * GPIOx)
73 {
74 return (uint16_t)GPIOx->ODR;
75 }
76
GPIO_SetBits(GPIO_Type * GPIOx,uint16_t pins)77 void GPIO_SetBits(GPIO_Type * GPIOx, uint16_t pins)
78 {
79 GPIOx->BSRR = pins;
80 }
81
GPIO_ClearBits(GPIO_Type * GPIOx,uint16_t pins)82 void GPIO_ClearBits(GPIO_Type * GPIOx, uint16_t pins)
83 {
84 GPIOx->BRR = pins;
85 }
86
GPIO_WriteBit(GPIO_Type * GPIOx,uint16_t pins,uint16_t val)87 void GPIO_WriteBit(GPIO_Type * GPIOx, uint16_t pins, uint16_t val)
88 {
89 (val != 0u) ? (GPIOx->BSRR = pins) : (GPIOx->BRR = pins);
90 }
91
GPIO_WriteBits(GPIO_Type * GPIOx,uint16_t val)92 void GPIO_WriteBits(GPIO_Type * GPIOx, uint16_t val)
93 {
94 GPIOx->ODR = val;
95 }
96
GPIO_PinLock(GPIO_Type * GPIOx,uint16_t pins,bool enable_lock)97 void GPIO_PinLock(GPIO_Type * GPIOx, uint16_t pins, bool enable_lock)
98 {
99 (enable_lock) ? (GPIOx->LCKR |= pins) : (GPIOx->LCKR &= ~pins);
100 }
101
GPIO_PinLockConf(GPIO_Type * GPIOx,uint16_t pins)102 void GPIO_PinLockConf(GPIO_Type * GPIOx, uint16_t pins)
103 {
104 GPIOx->LCKR = GPIO_LCKR_LCKK_MASK | GPIO_LCKR_LCK(pins);
105 GPIOx->LCKR = pins;
106 GPIOx->LCKR = GPIO_LCKR_LCKK_MASK | GPIO_LCKR_LCK(pins);
107 GPIOx->LCKR;
108 GPIOx->LCKR;
109 }
110
GPIO_PinAFConf(GPIO_Type * GPIOx,uint16_t pins,uint8_t af)111 void GPIO_PinAFConf(GPIO_Type * GPIOx, uint16_t pins, uint8_t af)
112 {
113 uint32_t shift = 0u;
114 uint32_t idx = 0u;
115 uint32_t val = GPIOx->AFRL;
116 while (idx < 8u)
117 {
118 if ( ( (1u << idx) & pins) != 0u )
119 {
120 shift = idx * 4u;
121 val &= ~(0xFu << shift);
122 val |= (uint32_t)af << shift;
123 }
124 idx++;
125 }
126 GPIOx->AFRL = val;
127
128 val = GPIOx->AFRH;
129 while (idx < 16u)
130 {
131 if ( ( (1u << idx) & pins) != 0u )
132 {
133 shift = (idx - 8u) * 4u;
134 val &= ~(0xFu << shift);
135 val |= (uint32_t)af << shift;
136 }
137 idx++;
138 }
139 GPIOx->AFRH = val;
140 }
141
GPIO_PortAFConfig(GPIO_Type * GPIOx,uint32_t af_high,uint32_t af_low)142 void GPIO_PortAFConfig(GPIO_Type * GPIOx, uint32_t af_high, uint32_t af_low)
143 {
144 GPIOx->AFRL = af_low;
145 GPIOx->AFRH = af_high;
146 }
147
148 /* EOF. */
149
150