BLE5.2 1.0
开发文档说明
xc_drv_gpio.c
浏览该文件的文档.
1
25/*-----------------------------------------------------------------------------------
26 INCLUDE HEADE FILES
27 ------------------------------------------------------------------------------------*/
28#include "xc_drv_gpio.h"
29
30/*------------------------------------------------------------------------------------
31 Local Variables
32 -------------------------------------------------------------------------------------*/
33
34/*------------------------------------------------------------------------------------
35 Func Prototype
36 -------------------------------------------------------------------------------------*/
37
38/*------------------------------------------------------------------------------------
39 Functions
40 -------------------------------------------------------------------------------------*/
41
42
64{
65 xc_gpio_mux_ctl(init_cfg->Pin, init_cfg->Mux);
66 xc_gpio_fun_sel(init_cfg->Pin, init_cfg->FunSel);
67
68 xc_gpio_direction_config(init_cfg->Pin, init_cfg->Dir);
69 xc_gpio_it_config(init_cfg->Pin, init_cfg->Int);
70
71 xc_gpio_pull_config(init_cfg->Pin, init_cfg->Pull);
72}
73
74
75
124void xc_gpio_mux_ctl(uint8_t num, GPIO_MUX_TypeDef mux)
125{
126 uint8_t reg_idx = num >> 4UL;
127 uint8_t pin_idx = num & 0xFUL;
128
129 uint32_t val;
130
131 if (mux > 3)
132 return;
133 if (num >= 35)
134 return;
135
136 if (reg_idx == 0) {
137 val = cpr_ctl_muxctl1_get();
138 val = (val & (~(0x3 << (pin_idx << 1)))) | (mux << (pin_idx << 1));
139 cpr_ctl_muxctl1_set(val);
140 } else if (reg_idx == 1) {
141 val = cpr_ctl_muxctl2_get();
142 val = (val & (~(0x3 << (pin_idx << 1)))) | (mux << (pin_idx << 1));
143 cpr_ctl_muxctl2_set(val);
144 } else if (reg_idx == 2) {
145 val = cpr_ctl_muxctl3_get();
146 val = (val & (~(0x3 << (pin_idx << 1)))) | (mux << (pin_idx << 1));
147 cpr_ctl_muxctl3_set(val);
148 }
149}
150
152{
153 uint32_t val;
154 uint8_t reg_idx = num >> 2UL;
155 uint8_t pin_idx = num & 0x3UL;
156
157 if (num > 28)
158 return;
159
160 val = cpr_gpio_fun_sel_get(reg_idx);
161
162 val = (val & ~(0x1FUL << (pin_idx << 3UL))) | (sel << (pin_idx << 3UL));
163
164 cpr_gpio_fun_sel_set(reg_idx, val);
165}
166
168{
169 uint8_t reg_idx;
170 uint8_t pin_idx;
171 uint32_t val;
172
173 reg_idx = num >> 4UL;
174 pin_idx = num & 0xFUL;
175
176 if (num >= 32) {
177 pin_idx += 2;
178 }
179
180 if (GPIO_PULLUP == pull) {
181 if (reg_idx == 0) {
182 val = cprao_aon_pectrl1_get();
183 SET_BIT(val, 1 << ((pin_idx << 1) + 1));
184 CLEAR_BIT(val, 1 << (pin_idx << 1));
185 cprao_aon_pectrl1_set(val);
186 } else if (reg_idx == 1) {
187
188 val = cprao_aon_pectrl2_get();
189 SET_BIT(val, 1 << ((pin_idx << 1) + 1));
190 CLEAR_BIT(val, 1 << (pin_idx << 1));
191 cprao_aon_pectrl2_set(val);
192 } else if (reg_idx == 2) {
193
194 val = cprao_aon_puctrl1_get();
195 SET_BIT(val, 1 << ((pin_idx << 1) + 1));
196 CLEAR_BIT(val, 1 << (pin_idx << 1));
197 cprao_aon_puctrl1_set(val);
198 }
199 } else if (GPIO_PULLDOWN == pull) {
200 if (reg_idx == 0) {
201 val = cprao_aon_pectrl1_get();
202 CLEAR_BIT(val, 1 << ((pin_idx << 1) + 1));
203 SET_BIT(val, 1 << (pin_idx << 1));
204 cprao_aon_pectrl1_set(val);
205 } else if (reg_idx == 1) {
206
207 val = cprao_aon_pectrl2_get();
208 CLEAR_BIT(val, 1 << ((pin_idx << 1) + 1));
209 SET_BIT(val, 1 << (pin_idx << 1));
210 cprao_aon_pectrl2_set(val);
211 } else if (reg_idx == 2) {
212
213 val = cprao_aon_puctrl1_get();
214 CLEAR_BIT(val, 1 << ((pin_idx << 1) + 1));
215 SET_BIT(val, 1 << (pin_idx << 1));
216 cprao_aon_puctrl1_set(val);
217 }
218 } else if (GPIO_NOPULL == pull) {
219 if (reg_idx == 0) {
220 val = cprao_aon_pectrl1_get();
221 CLEAR_BIT(val, 1 << ((pin_idx << 1) + 1));
222 CLEAR_BIT(val, 1 << (pin_idx << 1));
223 cprao_aon_pectrl1_set(val);
224 } else if (reg_idx == 1) {
225
226 val = cprao_aon_pectrl2_get();
227 CLEAR_BIT(val, 1 << ((pin_idx << 1) + 1));
228 CLEAR_BIT(val, 1 << (pin_idx << 1));
229 cprao_aon_pectrl2_set(val);
230 } else if (reg_idx == 2) {
231
232 val = cprao_aon_puctrl1_get();
233 CLEAR_BIT(val, 1 << ((pin_idx << 1) + 1));
234 CLEAR_BIT(val, 1 << (pin_idx << 1));
235 cprao_aon_puctrl1_set(val);
236 }
237 }
238}
239
240void xc_gpio_it_config(uint8_t num, GPIO_INT_TypeDef inter)
241{
242 uint32_t val;
243 uint8_t reg_idx = num >> 2UL;
244 uint8_t pin_idx = num & 0x3UL;
245
246 val = gpio_intr_ctrl_get(reg_idx);
247 val = (val & ~(0xF0000UL) & ~(0xFUL << (pin_idx << 2UL))) |
248 (inter << (pin_idx << 2UL)) | ((0x01UL << pin_idx) << 16UL);
249 gpio_intr_ctrl_set(reg_idx, val);
250}
251
252void xc_gpio_direction_config(uint8_t num, GPIO_DIR_TypeDef direction)
253{
254 uint8_t reg_idx = num >> 4UL;
255 uint8_t pin_idx = num & 0xFUL;
256 uint32_t val;
257
258 val = (direction << pin_idx) | (1 << 16 << pin_idx);
259
260 gpio_port_ddr_set(reg_idx, val);
261}
262
263uint32_t xc_gpio_read_pin(uint8_t num)
264{
265 uint8_t reg_idx = num >> 5UL;
266 uint8_t pin_idx = num & 0x1FUL;
267
268 uint32_t value = gpio_ext_port_get(reg_idx);
269
270 return (value & (0x01UL << pin_idx)) ? (1) : (0);
271}
272
273void xc_gpio_write_pin(uint8_t num, GPIO_PinState pin_state)
274{
275 uint8_t reg_idx = num >> 4UL;
276 uint8_t pin_idx = num & 0xFUL;
277
278 gpio_port_dr_set(reg_idx, (1 << DR_WE_LSB | pin_state) << pin_idx);
279}
280
281void xc_gpio_toggle_pin(uint8_t num)
282{
283 uint8_t reg_idx = num >> 4UL;
284 uint8_t pin_idx = num & 0xFUL;
285
286 if ((gpio_port_dr_get(reg_idx) & (1 << pin_idx)) != GPIO_PIN_RESET) {
287 gpio_port_dr_set(reg_idx, (1 << DR_WE_LSB | GPIO_PIN_RESET) << pin_idx);
288 } else {
289 gpio_port_dr_set(reg_idx, (1 << DR_WE_LSB | GPIO_PIN_SET) << pin_idx);
290 }
291}
292
293void GPIO_Handler(void)
294{
295 uint64_t intr_sta;
296 uint64_t val;
297
298 intr_sta = gpio_intr_status_c_get(0);
299 val = intr_sta;
300 gpio_intr_clr_set(0, (uint32_t)intr_sta);
301
302 intr_sta = gpio_intr_status_c_get(1);
303 val |= intr_sta << 32;
304 gpio_intr_clr_set(1, (uint32_t)intr_sta);
305
307}
308
309__WEAK void gpio_intr_callback(uint64_t intr_sta)
310{
311 /* Gpio 中断回调处理函数 */
312}
GPIO_DIR_TypeDef Dir
GPIO_FUN_SEL_TypeDef FunSel
GPIO_PULL_TypeDef Pull
GPIO_MUX_TypeDef Mux
GPIO_INT_TypeDef Int
void xc_gpio_fun_sel(uint8_t num, GPIO_FUN_SEL_TypeDef sel)
void xc_gpio_toggle_pin(uint8_t num)
void xc_gpio_direction_config(uint8_t num, GPIO_DIR_TypeDef direction)
void xc_gpio_mux_ctl(uint8_t num, GPIO_MUX_TypeDef mux)
xc_gpio_init
void xc_gpio_init(GPIO_InitCfg_t *init_cfg)
xc_gpio_init
Definition xc_drv_gpio.c:63
void xc_gpio_it_config(uint8_t num, GPIO_INT_TypeDef inter)
uint32_t xc_gpio_read_pin(uint8_t num)
__WEAK void gpio_intr_callback(uint64_t intr_sta)
void xc_gpio_pull_config(uint8_t num, GPIO_PULL_TypeDef pull)
void GPIO_Handler(void)
void xc_gpio_write_pin(uint8_t num, GPIO_PinState pin_state)
GPIO_PinState
Definition xc_drv_gpio.h:43
@ GPIO_PIN_SET
Definition xc_drv_gpio.h:45
@ GPIO_PIN_RESET
Definition xc_drv_gpio.h:44
GPIO_DIR_TypeDef
GPIO_FUN_SEL_TypeDef
GPIO_PULL_TypeDef
@ GPIO_PULLDOWN
@ GPIO_PULLUP
@ GPIO_NOPULL
GPIO_INT_TypeDef
GPIO_MUX_TypeDef
Definition xc_drv_gpio.h:95