/*---------------------------------------------------------------------------------------------------- INCLUDE HEADE FILES ----------------------------------------------------------------------------------------------------*/ #include "Includes.h" /** * Copyright (c) 2022 - 2025, XinChip * * All rights reserved. * * Author : D * * Tips: NA */ extern void Init_gpio(void) { __write_hw_reg32(CPR_CTLAPBCLKEN_GRCTL, 0x40004); /*gpio_pclk enable*/ __write_hw_reg32(CPR_OTHERCLKEN_GRCTL, 0x10001); /*gpio_clk enable*/ // NVIC_EnableIRQ(GPIO_IRQn); } /** * Copyright (c) 2022 - 2025, XinChip * * All rights reserved. * * Author : D * * Tips: - GPIO0 : 【mux=0 连接到gpio_d[0] 】 【mux=1 kbs_mko_0】 【mux=2 pwm2】 【mux=3 NA】 - GPIO1 : 【mux=0 连接到gpio_d[1] 】 【mux=1 kbs_mko_1】 【mux=2 pwm3】 【mux=3 NA】 - GPIO2 : 【mux=0 连接到gpio_d[2] 】 【mux=1 kbs_mko_2】 【mux=2 clk_12M_out】【mux=3 NA】 - GPIO3 : 【mux=0 连接到gpio_d[3] 】 【mux=1 kbs_mko_3】 【mux=2 NA】 【mux=3 NA】 - GPIO4 : 【mux=0 连接到gpio_d[4] 】 【mux=1 kbs_mko_4】 【mux=2 NA】 【mux=3 NA】 - GPIO5 : 【mux=0 连接到gpio_d[5] 】 【mux=1 kbs_mko_5】 【mux=2 NA】 【mux=3 NA】 - GPIO6 : 【mux=0 连接到gpio_d[6] 】 【mux=1 kbs_mko_6】 【mux=2 txen】 【mux=3 NA】 - GPIO7 : 【mux=0 连接到gpio_d[7] 】 【mux=1 kbs_mko_7】 【mux=2 rxen】 【mux=3 NA】 - GPIO8 : 【mux=0 连接到gpio_d[8] 】 【mux=1 kbs_mki_0】 【mux=2 NA】 【mux=3 NA】 - GPIO9 : 【mux=0 连接到gpio_d[9] 】 【mux=1 kbs_mki_1】 【mux=2 NA】 【mux=3 NA】 - GPIO10: 【mux=0 连接到gpio_d[10]】 【mux=1 kbs_mki_8】 【mux=2 NA】 【mux=3 NA】 - GPIO11: 【mux=0 连接到BOOT_CTL0 】 【mux=1 连接到gpio_d[11]】 【mux=2 NA】 【mux=3 NA】 - GPIO12: 【mux=0 连接到SWI的 SWCK】 【mux=1 连接到gpio_d[12]】 【mux=2 NA】 【mux=3 pwm4】 - GPIO13: 【mux=0 连接到SWI的 SWD 】 【mux=1 连接到gpio_d[13]】 【mux=2 NA】 【mux=3 pwm5】 - GPIO14: 【mux=0 连接到gpio_d[14]】 【mux=1 kbs_mki_9】 【mux=2 SPI2_CLK】 【mux=3 NA】 - GPIO15: 【mux=0 连接到gpio_d[15]】 【mux=1 kbs_mki_10】 【mux=2 SPI2_CS】 【mux=3 NA】 - GPIO16: 【mux=0 连接到gpio_d[16]】 【mux=1 kbs_mki_11】 【mux=2 SPI2_RX】 【mux=3 NA】 - GPIO17: 【mux=0 连接到gpio_d[17]】 【mux=1 kbs_mki_12】 【mux=2 SPI2_TX】 【mux=3 NA】 - GPIO18: 【mux=0 连接到gpio_d[18]】 【mux=1 kbs_mki_16】 【mux=2 NA】 【mux=3 NA】 - GPIO19: 【mux=0 连接到gpio_d[19]】 【mux=1 kbs_mki_17】 【mux=2 NA】 【mux=3 NA】 - GPIO20: 【mux=0 连接到gpio_d[20]】 【mux=1 kbs_mki_2】 【mux=2 NA】 【mux=3 NA】 - GPIO21: 【mux=0 连接到gpio_d[21]】 【mux=1 kbs_mki_3】 【mux=2 NA】 【mux=3 NA】 - GPIO22: 【mux=0 连接到gpio_d[22]】 【mux=1 kbs_mki_4】 【mux=2 ssi2_clk】 【mux=3 NA】 - GPIO23: 【mux=0 连接到gpio_d[23]】 【mux=1 kbs_mki_5】 【mux=2 ssi2_ssn】 【mux=3 NA】 - GPIO24: 【mux=0 连接到gpio_d[24]】 【mux=1 kbs_mki_6】 【mux=2 ssi2_d0 tx】 【mux=3 NA】 - GPIO25: 【mux=0 连接到gpio_d[25]】 【mux=1 kbs_mki_7】 【mux=2 ssi2_d1 rx】 【mux=3 NA】 - GPIO26: 【mux=0 连接到gpio_d[26]】 【mux=1 kbs_mki_13】 【mux=2 ssi2_d2】 【mux=3 NA】 - GPIO27: 【mux=0 连接到gpio_d[27]】 【mux=1 kbs_mki_14】 【mux=2 ssi2_d3】 【mux=3 NA】 - GPIO28: 【mux=0 连接到gpio_d[28]】 【mux=1 kbs_mki_15】 【mux=2 adcclk】 【mux=3 NA】 - GPIO29: 【mux=0 连接到gpio_d[29]】 【mux=1 kbs_mki_16】 【mux=2 adcdata】 【mux=3 NA】 - GPIO30: 【mux=0 连接到gpio_d[30]】 【mux=1 kbs_mki_17】 【mux=2 i2s_sclk】 【mux=3 NA】 - GPIO31: 【mux=0 连接到gpio_d[31]】 【mux=1 uart2_rx】 【mux=2 i2s_ws】 【mux=3 NA】 - GPIO32: 【mux=0 连接到gpio_d[27]】 【mux=1 uart2_tx】 【mux=2 i2s_din】 【mux=3 NA】 - GPIO33: 【mux=0 连接到gpio_d[28]】 【mux=1 NA】 【mux=2 i2s_dout】 【mux=3 NA】 - GPIO34: 【mux=0 连接到gpio_d[29]】 【mux=1 NA】 【mux=2 NA】 【mux=3 NA】 - GPIO35: 【mux=0 连接到gpio_d[30]】 【mux=1 NA】 【mux=2 BOOT_CTL1】 【mux=3 NA】 */ extern void gpio_mux_ctl(uint8_t num, uint8_t mux) //(num:0-31 32-34) { if (mux > 3) return; uint32_t tv = 0; if (num < 32) { __read_hw_reg32((CPR_CTL_MUXCTL1 + (num / 16)), tv); tv = (tv & (~(0x3 << ((num % 16) * 2)))) | (mux << ((num % 16) * 2)); __write_hw_reg32((CPR_CTL_MUXCTL1 + (num / 16)), tv); } else { __read_hw_reg32(CPR_CTL_MUXCTL3, tv); tv = (tv & (~(0x3 << ((num % 16) * 2)))) | (mux << ((num % 16) * 2)); __write_hw_reg32(CPR_CTL_MUXCTL3, tv); } } extern void gpio_mux_ctl_u(uint8_t num, uint8_t mux) //(num:32-34) { if (mux > 3) return; uint32_t tv = 0; __read_hw_reg32(CPR_CTL_MUXCTL3, tv); tv = (tv & (~(0x3 << ((num % 16) * 2)))) | (mux << ((num % 16) * 2)); __write_hw_reg32(CPR_CTL_MUXCTL3, tv); } /** * Copyright (c) 2022 - 2025, XinChip * * All rights reserved. * * Author : D * * Tips: gpio编号0-34 中断类型0无中断 5上升沿中断 7下降沿中断 */ extern void gpio_fun_inter(uint8_t num, uint8_t inter) { unsigned int tv = 0; if (inter > 0xF) return; switch (num % 4) { case 3: __read_hw_reg32((GPIO_INTR_CTRL0 + (num / 4)), tv); tv &= 0x0FFF; tv |= ((inter << 12) | 0xF0000); __write_hw_reg32((GPIO_INTR_CTRL0 + (num / 4)), tv); break; case 2: __read_hw_reg32((GPIO_INTR_CTRL0 + (num / 4)), tv); tv &= 0xF0FF; tv |= ((inter << 8) | 0xF0000); __write_hw_reg32((GPIO_INTR_CTRL0 + (num / 4)), tv); break; case 1: __read_hw_reg32((GPIO_INTR_CTRL0 + (num / 4)), tv); tv &= 0xFF0F; tv |= ((inter << 4) | 0xF0000); __write_hw_reg32((GPIO_INTR_CTRL0 + (num / 4)), tv); break; case 0: __read_hw_reg32((GPIO_INTR_CTRL0 + (num / 4)), tv); tv &= 0xFFF0; tv |= ((inter) | 0xF0000); __write_hw_reg32((GPIO_INTR_CTRL0 + (num / 4)), tv); break; default: break; } } /** * Copyright (c) 2022 - 2025, XinChip * * All rights reserved. * * Author : D * * Tips: sel复用【0:GPIO_Dx】 【1:UART0_TX】 【2:UART0_RX】 【3:UART0_CTS】【4:UART0_RTS】【5:I2C_SCL】 【6:I2C_SDA】 【7:UART1_RX】 【8:UART1_TX】 【9:SIM_IO】 【10:SIM_RST】 【11:SIM_CLK_OUT】 【12:PWM0】 【13:PWM1】 【14:SSI1_CLK】【15:SSI1_SSN】【16:SSI1_RX】 【17:SSI1_TX】 【18:PWM0_INV】【19:PWM1_INV】【20:PWM2_INV】【21:PWM3_INV】 */ extern void gpio_fun_sel(uint8_t num, uint8_t sel) //(num:0-28) { unsigned int tv = 0; if (sel > 21) return; switch (num % 4) { case 0: __read_hw_reg32((CPR_GPIO_FUN_SEL0 + (num / 4)), tv); tv &= 0xFFFFFF00; tv |= sel; __write_hw_reg32((CPR_GPIO_FUN_SEL0 + (num / 4)), tv); break; case 1: __read_hw_reg32((CPR_GPIO_FUN_SEL0 + (num / 4)), tv); tv &= 0xFFFF00FF; tv |= (sel << 8); __write_hw_reg32((CPR_GPIO_FUN_SEL0 + (num / 4)), tv); break; case 2: __read_hw_reg32((CPR_GPIO_FUN_SEL0 + (num / 4)), tv); tv &= 0xFF00FFFF; tv |= (sel << 16); __write_hw_reg32((CPR_GPIO_FUN_SEL0 + (num / 4)), tv); break; case 3: __read_hw_reg32((CPR_GPIO_FUN_SEL0 + (num / 4)), tv); tv &= 0x00FFFFFF; tv |= (sel << 24); __write_hw_reg32((CPR_GPIO_FUN_SEL0 + (num / 4)), tv); break; default: break; } } /** * Copyright (c) 2022 - 2025, XinChip * * All rights reserved. * * Author : D * * Tips: NA */ extern void gpio_output_high(uint8_t num) { __write_hw_reg32((GPIO_PORT_DR0 + (num >> 4)), (0x00010001 << (num & 0x0F))); } /** * Copyright (c) 2022 - 2025, XinChip * * All rights reserved. * * Author : D * * Tips: NA */ extern void gpio_output_low(uint8_t num) { __write_hw_reg32((GPIO_PORT_DR0 + (num >> 4)), (0x00010000 << (num & 0x0F))); } /** * Copyright (c) 2022 - 2025, XinChip * * All rights reserved. * * Author : D * * Tips: NA */ extern void GPIO_Handler(void) { uint32_t val[2]; __read_hw_reg32(GPIO_INTR_STATUS_C00, val[0]); __read_hw_reg32(GPIO_INTR_STATUS_C01, val[1]); __write_hw_reg32(GPIO_INTR_CLR0, val[0]); __write_hw_reg32(GPIO_INTR_CLR1, val[1]); if (DETECT_INTER_NUM(8, val)) // 判断是否为GPIO24中断 { printf("GPIO8 interrupt\n"); } if (DETECT_INTER_NUM(9, val)) // 判断是否为GPIO24中断 { printf("GPIO9 interrupt\n"); } } /** * Copyright (c) 2022 - 2025, XinChip * * All rights reserved. * * Author : D * * Tips: NA */ extern uint8_t gpio_input_val(uint8_t num) { uint32_t val; __read_hw_reg32((GPIO_EXT_PORT0 + (num >> 5)), val); return (val & (0x01L << (num & 0x1F))) ? (1) : (0); } /** * Copyright (c) 2022 - 2025, XinChip * * All rights reserved. * * Author : D * * Tips: NA */ extern void gpio_direction_output(uint8_t num) { __write_hw_reg32((GPIO_PORT_DDR0 + (num >> 4)), ((0x10001) << (num & 0x0F))); } /** * Copyright (c) 2022 - 2025, XinChip * * All rights reserved. * * Author : D * * Tips: gpio编号(0-34) 上下拉状态(0代表上拉 1代表下拉 其他代表无上下拉 【pull_up_type=0 GPIO上拉:GPIO_Mode_Input_Up 】 【pull_up_type=1 GPIO下拉:GPIO_Mode_Input_Down 】 【pull_up_type=2 GPIO浮空:GPIO_Mode_Input_Float】 */ extern void gpio_direction_input(uint8_t num, uint8_t pull_up_type) { uint8_t tv = num; uint32_t val; uint32_t *base_reg = 0x0; if (num > 0 && num <= 15) { base_reg = (uint32_t *)(0x40002400 + 0x34); } else if (num >= 16 && num <= 31) { base_reg = (uint32_t *)(0x40002400 + 0x38); num = num % 16; } else if (num >= 32 && num <= 34) { base_reg = (uint32_t *)(0x40002400 + 0x3c); num = 2 + num % 16; } __read_hw_reg32(base_reg, val); if (pull_up_type == 1) // 下拉 { setbit(val, num * 2); clrbit(val, num * 2 + 1); } else if (pull_up_type == 0) // 上拉 { clrbit(val, num * 2); setbit(val, num * 2 + 1); } else // 无上下拉 { clrbit(val, num * 2); clrbit(val, num * 2 + 1); } __write_hw_reg32(base_reg, val); __write_hw_reg32((GPIO_PORT_DDR0 + (tv >> 4)), ((0x10000) << (tv & 0x0F))); __write_hw_reg32((GPIO_DEBOUNCE0 + (tv >> 4)), ((0x10001) << (tv & 0x0F))); } void test_gpio(void) { Init_gpio(); gpio_mux_ctl(8, 0); gpio_fun_inter(8, 5); gpio_fun_sel(8, 0); gpio_direction_input(8, 1); gpio_mux_ctl(9, 0); gpio_fun_inter(9, 5); gpio_fun_sel(9, 0); gpio_direction_input(9, 1); }