/*---------------------------------------------------------------------------------------------------- INCLUDE HEADE FILES ----------------------------------------------------------------------------------------------------*/ #include "bsp_gpio_normal.h" /* --------------------------------------------------------------------------------------------------- - IO复用控制 - ----------------------------------------------------------------------------------------------------*/ typedef union gpio_fun_config { uint32_t config; struct bit { uint8_t b0004 : 5; uint8_t b0812 : 5; uint8_t b1620 : 5; uint8_t b2428 : 5; } bits; } gpio_fun_config_t; typedef struct gpio_fun_sel_config { gpio_fun_config_t fun_sel0; gpio_fun_config_t fun_sel1; gpio_fun_config_t fun_sel2; gpio_fun_config_t fun_sel3; gpio_fun_config_t fun_sel4; gpio_fun_config_t fun_sel5; gpio_fun_config_t fun_sel6; gpio_fun_config_t fun_sel7; } gpio_fun_sel_config_t; /* --------------------------------------------------------------------------------------------------- - IO功能 ----------------------------------------------------------------------------------------------------*/ typedef union mux1_config { uint32_t muxctl1; struct bit1 { uint8_t gpio0 : 2; uint8_t gpio1 : 2; uint8_t gpio2 : 2; uint8_t gpio3 : 2; uint8_t gpio4 : 2; uint8_t gpio5 : 2; uint8_t gpio6 : 2; uint8_t gpio7 : 2; uint8_t gpio8 : 2; uint8_t gpio9 : 2; uint8_t gpio10 : 2; uint8_t gpio11 : 2; uint8_t gpio12 : 2; uint8_t gpio13 : 2; uint8_t gpio14 : 2; uint8_t gpio15 : 2; } pad1; } mux1_config_t; typedef union mux2_config { uint32_t muxctl2; struct bit2 { uint8_t gpio16 : 2; uint8_t gpio17 : 2; uint8_t gpio18 : 2; uint8_t gpio19 : 2; uint8_t gpio20 : 2; uint8_t gpio21 : 2; uint8_t gpio22 : 2; uint8_t gpio23 : 2; uint8_t gpio24 : 2; uint8_t gpio25 : 2; uint8_t gpio26 : 2; uint8_t gpio27 : 2; uint8_t gpio28 : 2; uint8_t bootctl : 2; uint16_t swk : 2; uint8_t swd : 2; } pad2; } mux2_config_t; typedef struct gpio_config { mux1_config_t mux1_ctl; mux2_config_t mux2_ctl; } gpio_config_t; /* --------------------------------------------------------------------------------------------------- - IO方向 ----------------------------------------------------------------------------------------------------*/ typedef union dir_config { uint32_t dir; struct bitd { uint8_t gpio0 : 1; uint8_t gpio1 : 1; uint8_t gpio2 : 1; uint8_t gpio3 : 1; uint8_t gpio4 : 1; uint8_t gpio5 : 1; uint8_t gpio6 : 1; uint8_t gpio7 : 1; uint8_t gpio8 : 1; uint8_t gpio9 : 1; uint8_t gpio10 : 1; uint8_t gpio11 : 1; uint8_t gpio12 : 1; uint8_t gpio13 : 1; uint8_t gpio14 : 1; uint8_t gpio15 : 1; uint8_t gpio16 : 1; uint8_t gpio17 : 1; uint8_t gpio18 : 1; uint8_t gpio19 : 1; uint8_t gpio20 : 1; uint8_t gpio21 : 1; uint8_t gpio22 : 1; uint8_t gpio23 : 1; uint8_t gpio24 : 1; uint8_t gpio25 : 1; uint8_t gpio26 : 1; uint8_t gpio27 : 1; uint8_t gpio28 : 1; uint8_t gpio29 : 1; uint8_t gpio30 : 1; uint8_t gpio31 : 1; } pad; } dir_config_t; /* --------------------------------------------------------------------------------------------------- - IO上下拉 ----------------------------------------------------------------------------------------------------*/ typedef union pupd1_config { uint32_t pupd; struct bita { uint8_t GPIO0 : 2; uint8_t GPIO1 : 2; uint8_t GPIO2 : 2; uint8_t GPIO3 : 2; uint8_t GPIO4 : 2; uint8_t GPIO5 : 2; uint8_t GPIO6 : 2; uint8_t GPIO7 : 2; uint8_t GPIO8 : 2; uint8_t GPIO9 : 2; uint8_t GPIO10 : 2; uint8_t GPIO11 : 2; uint8_t GPIO12 : 2; uint8_t GPIO13 : 2; uint8_t GPIO14 : 2; uint8_t GPIO15 : 2; } pad; } pupd1_config_t; typedef union pupd2_config { uint32_t pupd; struct bitb { uint8_t GPIO16 : 2; uint8_t GPIO17 : 2; uint8_t GPIO18 : 2; uint8_t GPIO19 : 2; uint8_t GPIO20 : 2; uint8_t GPIO21 : 2; uint8_t GPIO22 : 2; uint8_t GPIO23 : 2; uint8_t GPIO24 : 2; uint8_t GPIO25 : 2; uint8_t GPIO26 : 2; uint8_t GPIO27 : 2; uint8_t GPIO28 : 2; uint8_t BOOTCTL : 2; uint8_t SWCK : 2; uint8_t SWD : 2; } pad; } pupd2_config_t; typedef struct { pupd1_config_t CTL_PECTL1; pupd2_config_t CTL_PECTL2; } pupd_config_t; /* --------------------------------------------------------------------------------------------------- - IO中断模式 ----------------------------------------------------------------------------------------------------*/ typedef union int_config { uint32_t interrupt; struct bitt { uint8_t mode0 : 4; uint8_t mode1 : 4; uint8_t mode2 : 4; uint8_t mode3 : 4; uint16_t reserved; } pad; } int_config_t; typedef struct int_config_i { int_config_t intr_ctl0; int_config_t intr_ctl1; int_config_t intr_ctl2; int_config_t intr_ctl3; int_config_t intr_ctl4; int_config_t intr_ctl5; int_config_t intr_ctl6; int_config_t intr_ctl7; } interrupt_config_t; /* ------------------------------------------------------------------------------------------------------------------ - 用户配置如下IO复用控制 - 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 [32/16PIN新加复用功能--18:PWM0_INV 19:PWM1_INV] -------------------------------------------------------------------------------------------------------------------*/ gpio_fun_sel_config_t gpio_fun_sel_config = { /*CPR_GPIO_FUN_SEL0*/ .fun_sel0.bits.b0004 = UART1_TX, /*GPIO 0*/ .fun_sel0.bits.b0812 = UART1_RX, /*GPIO 1*/ .fun_sel0.bits.b1620 = GPIO_Dx, /*GPIO 2*/ .fun_sel0.bits.b2428 = GPIO_Dx, /*GPIO 3*/ /*CPR_GPIO_FUN_SEL1*/ .fun_sel1.bits.b0004 = GPIO_Dx, /*GPIO 4*/ .fun_sel1.bits.b0812 = GPIO_Dx, /*GPIO 5*/ .fun_sel1.bits.b1620 = GPIO_Dx, /*GPIO 6*/ .fun_sel1.bits.b2428 = GPIO_Dx, /*GPIO 7*/ /*CPR_GPIO_FUN_SEL2*/ .fun_sel2.bits.b0004 = GPIO_Dx, /*GPIO 8*/ .fun_sel2.bits.b0812 = GPIO_Dx, /*GPIO 9*/ .fun_sel2.bits.b1620 = GPIO_Dx, /*GPIO10*/ .fun_sel2.bits.b2428 = GPIO_Dx, /*GPIO11*/ /*CPR_GPIO_FUN_SEL3*/ .fun_sel3.bits.b0004 = GPIO_Dx, /*GPIO12*/ .fun_sel3.bits.b0812 = GPIO_Dx, /*GPIO13*/ .fun_sel3.bits.b1620 = GPIO_Dx, /*GPIO14*/ .fun_sel3.bits.b2428 = GPIO_Dx, /*GPIO15*/ /*CPR_GPIO_FUN_SEL4*/ .fun_sel4.bits.b0004 = GPIO_Dx, /*GPIO16*/ .fun_sel4.bits.b0812 = GPIO_Dx, /*GPIO17*/ .fun_sel4.bits.b1620 = UART0_TX, /*GPIO18*/ .fun_sel4.bits.b2428 = UART0_RX, /*GPIO19*/ /*CPR_GPIO_FUN_SEL5*/ .fun_sel5.bits.b0004 = GPIO_Dx, /*GPIO20*/ .fun_sel5.bits.b0812 = GPIO_Dx, /*GPIO21*/ .fun_sel5.bits.b1620 = PWM0_INV, /*GPIO22*/ .fun_sel5.bits.b2428 = PWM0, /*GPIO23*/ /*CPR_GPIO_FUN_SEL6*/ .fun_sel6.bits.b0004 = PWM1_INV, /*GPIO24*/ .fun_sel6.bits.b0812 = PWM1, /*GPIO25*/ .fun_sel6.bits.b1620 = GPIO_Dx, /*GPIO26*/ .fun_sel6.bits.b2428 = GPIO_Dx, /*GPIO27*/ /*CPR_GPIO_FUN_SEL7*/ .fun_sel7.bits.b0004 = GPIO_Dx, /*GPIO28*/ .fun_sel7.bits.b0812 = GPIO_Dx, /*GPIO29*/ .fun_sel7.bits.b1620 = GPIO_Dx, /*GPIO30*/ .fun_sel7.bits.b2428 = GPIO_Dx /*GPIO31*/ }; /* --------------------------------------------------------------------------------------------------- - 用户配置如下系统IO功能 ----------------------------------------------------------------------------------------------------*/ gpio_config_t gpio_config = { /*CPR_CTL_MUXCTL1*/ .mux1_ctl.pad1.gpio15 = 0, .mux1_ctl.pad1.gpio14 = 0, .mux1_ctl.pad1.gpio13 = 0, .mux1_ctl.pad1.gpio12 = 0, .mux1_ctl.pad1.gpio11 = 0, .mux1_ctl.pad1.gpio10 = 0, .mux1_ctl.pad1.gpio9 = 0, .mux1_ctl.pad1.gpio8 = 0, .mux1_ctl.pad1.gpio7 = 0, .mux1_ctl.pad1.gpio6 = 0, .mux1_ctl.pad1.gpio5 = 0, .mux1_ctl.pad1.gpio4 = 0, .mux1_ctl.pad1.gpio3 = 0, .mux1_ctl.pad1.gpio2 = 0, .mux1_ctl.pad1.gpio1 = 0, .mux1_ctl.pad1.gpio0 = 0, /*CPR_CTL_MUXCTL2*/ .mux2_ctl.pad2.swd = 0, .mux2_ctl.pad2.swk = 0, .mux2_ctl.pad2.bootctl = 0, .mux2_ctl.pad2.gpio28 = 0, .mux2_ctl.pad2.gpio27 = 0, .mux2_ctl.pad2.gpio26 = 0, .mux2_ctl.pad2.gpio25 = 0, .mux2_ctl.pad2.gpio24 = 0, .mux2_ctl.pad2.gpio23 = 0, .mux2_ctl.pad2.gpio22 = 0, .mux2_ctl.pad2.gpio21 = 0, .mux2_ctl.pad2.gpio20 = 0, .mux2_ctl.pad2.gpio19 = 0, .mux2_ctl.pad2.gpio18 = 0, .mux2_ctl.pad2.gpio17 = 0, .mux2_ctl.pad2.gpio16 = 0}; /* --------------------------------------------------------------------------------------------------- - 用户配置如下系统IO的输入/输出 (0:输入1:输出) ----------------------------------------------------------------------------------------------------*/ dir_config_t dir_config = { .pad.gpio31 = 0, .pad.gpio30 = 0, .pad.gpio29 = 0, .pad.gpio28 = 1, .pad.gpio27 = 1, .pad.gpio26 = 1, .pad.gpio25 = 0, .pad.gpio24 = 0, .pad.gpio23 = 0, .pad.gpio22 = 0, .pad.gpio21 = 0, .pad.gpio20 = 0, .pad.gpio19 = 0, .pad.gpio18 = 0, .pad.gpio17 = 0, .pad.gpio16 = 0, .pad.gpio15 = 0, .pad.gpio14 = 0, .pad.gpio13 = 0, .pad.gpio12 = 0, .pad.gpio11 = 0, .pad.gpio10 = 0, .pad.gpio9 = 0, .pad.gpio8 = 0, .pad.gpio7 = 0, .pad.gpio6 = 0, .pad.gpio5 = 0, .pad.gpio4 = 0, .pad.gpio3 = 0, .pad.gpio2 = 0, .pad.gpio1 = 0, .pad.gpio0 = 0}; /* --------------------------------------------------------------------------------------------------- - 用户配置IO上下拉 ----------------------------------------------------------------------------------------------------*/ pupd_config_t pupd_config = { .CTL_PECTL1.pad.GPIO15 = 0, .CTL_PECTL1.pad.GPIO14 = 0, .CTL_PECTL1.pad.GPIO13 = 0, .CTL_PECTL1.pad.GPIO12 = 3, .CTL_PECTL1.pad.GPIO11 = 3, .CTL_PECTL1.pad.GPIO10 = 3, .CTL_PECTL1.pad.GPIO9 = 3, .CTL_PECTL1.pad.GPIO8 = 3, .CTL_PECTL1.pad.GPIO7 = 3, .CTL_PECTL1.pad.GPIO6 = 3, .CTL_PECTL1.pad.GPIO5 = 3, .CTL_PECTL1.pad.GPIO4 = 0, .CTL_PECTL1.pad.GPIO3 = 0, .CTL_PECTL1.pad.GPIO2 = 0, .CTL_PECTL1.pad.GPIO1 = 0, .CTL_PECTL1.pad.GPIO0 = 0, .CTL_PECTL2.pad.SWD = 3, .CTL_PECTL2.pad.SWCK = 3, .CTL_PECTL2.pad.BOOTCTL = 0, .CTL_PECTL2.pad.GPIO28 = 0, .CTL_PECTL2.pad.GPIO27 = 0, .CTL_PECTL2.pad.GPIO26 = 0, .CTL_PECTL2.pad.GPIO25 = 0, .CTL_PECTL2.pad.GPIO24 = 1, .CTL_PECTL2.pad.GPIO23 = 0, .CTL_PECTL2.pad.GPIO22 = 3, .CTL_PECTL2.pad.GPIO21 = 3, .CTL_PECTL2.pad.GPIO20 = 3, .CTL_PECTL2.pad.GPIO19 = 3, .CTL_PECTL2.pad.GPIO18 = 3, .CTL_PECTL2.pad.GPIO17 = 3, .CTL_PECTL2.pad.GPIO16 = 0}; /* --------------------------------------------------------------------------------------------------- - 用户配置如下系统IO的中断模式 NOT_INT(无中断) RIS_EDGE_INT(上升沿中断) FAIL_EDGE_INT(下降沿中断) ----------------------------------------------------------------------------------------------------*/ interrupt_config_t interrupt_config = { /*GPIO_INTR_CTRL0*/ .intr_ctl0.pad.mode3 = NOT_INT, /*GPIO 3*/ .intr_ctl0.pad.mode2 = NOT_INT, /*GPIO 2*/ .intr_ctl0.pad.mode1 = NOT_INT, /*GPIO 1*/ .intr_ctl0.pad.mode0 = NOT_INT, /*GPIO 0*/ /*GPIO_INTR_CTRL1*/ .intr_ctl1.pad.mode3 = NOT_INT, /*GPIO 7*/ .intr_ctl1.pad.mode2 = NOT_INT, /*GPIO 6*/ .intr_ctl1.pad.mode1 = NOT_INT, /*GPIO 5*/ .intr_ctl1.pad.mode0 = NOT_INT, /*GPIO 4*/ /*GPIO_INTR_CTRL2*/ .intr_ctl2.pad.mode3 = NOT_INT, /*GPIO11*/ .intr_ctl2.pad.mode2 = NOT_INT, /*GPIO10*/ .intr_ctl2.pad.mode1 = NOT_INT, /*GPIO 9*/ .intr_ctl2.pad.mode0 = NOT_INT, /*GPIO 8*/ /*GPIO_INTR_CTRL3*/ .intr_ctl3.pad.mode3 = NOT_INT, /*GPIO15*/ .intr_ctl3.pad.mode2 = NOT_INT, /*GPIO14*/ .intr_ctl3.pad.mode1 = NOT_INT, /*GPIO13*/ .intr_ctl3.pad.mode0 = NOT_INT, /*GPIO12*/ /*GPIO_INTR_CTRL4*/ .intr_ctl4.pad.mode3 = NOT_INT, /*GPIO19*/ .intr_ctl4.pad.mode2 = NOT_INT, /*GPIO18*/ .intr_ctl4.pad.mode1 = NOT_INT, /*GPIO17*/ .intr_ctl4.pad.mode0 = NOT_INT, /*GPIO16*/ /*GPIO_INTR_CTRL5*/ .intr_ctl5.pad.mode3 = NOT_INT, /*GPIO23*/ .intr_ctl5.pad.mode2 = NOT_INT, /*GPIO22*/ .intr_ctl5.pad.mode1 = NOT_INT, /*GPIO21*/ .intr_ctl5.pad.mode0 = NOT_INT, /*GPIO20*/ /*GPIO_INTR_CTRL6*/ .intr_ctl6.pad.mode3 = NOT_INT, /*GPIO27*/ .intr_ctl6.pad.mode2 = NOT_INT, /*GPIO26*/ .intr_ctl6.pad.mode1 = NOT_INT, /*GPIO25*/ .intr_ctl6.pad.mode0 = NOT_INT, /*GPIO24*/ /*GPIO_INTR_CTRL7*/ .intr_ctl7.pad.mode3 = NOT_INT, /*GPIO31*/ .intr_ctl7.pad.mode2 = NOT_INT, /*GPIO30*/ .intr_ctl7.pad.mode1 = NOT_INT, /*GPIO29*/ .intr_ctl7.pad.mode0 = NOT_INT, /*GPIO28*/ }; /* --------------------------------------------------------------------------------------------------- - 函数名称: Init_gpio - 函数功能: Gpio模块初始化 - 输入参数: 无 - 创建日期: 2016-05-24 ----------------------------------------------------------------------------------------------------*/ extern void Init_gpio(void) { __write_hw_reg32(CPR_CTLAPBCLKEN_GRCTL, 0x40004); __write_hw_reg32(CPR_OTHERCLKEN_GRCTL, 0x10001); for(int i=0;i<35;i++) { gpio_direction_input(i,1); } #if (TEST_SPI1_MASTER_A == 1 && TEST_SPI1_MASTER_B == 0 && TEST_SPI1_MASTER_C == 0) /*四根SPI线全采用模拟方式*/ gpio_fun_sel_config.fun_sel3.bits.b0812 = GPIO_Dx; // GPIO13复用功能 gpio_fun_sel_config.fun_sel3.bits.b1620 = GPIO_Dx; // GPIO14复用功能 gpio_fun_sel_config.fun_sel3.bits.b2428 = GPIO_Dx; // GPIO15复用功能 gpio_fun_sel_config.fun_sel4.bits.b0004 = GPIO_Dx; // GPIO16复用功能 #elif (TEST_SPI1_MASTER_A == 0 && TEST_SPI1_MASTER_B == 1 && TEST_SPI1_MASTER_C == 0) /*CS (SSN) 线采用模拟方式*/ gpio_fun_sel_config.fun_sel3.bits.b0812 = SSI1_CLK; // GPIO13复用功能 gpio_fun_sel_config.fun_sel3.bits.b1620 = GPIO_Dx; // GPIO14复用功能 gpio_fun_sel_config.fun_sel3.bits.b2428 = SSI1_RX; // GPIO15复用功能 gpio_fun_sel_config.fun_sel4.bits.b0004 = SSI1_TX; // GPIO16复用功能 #else // gpio_fun_sel_config.fun_sel3.bits.b0812 = SSI1_CLK; //GPIO13复用功能 // gpio_fun_sel_config.fun_sel3.bits.b1620 = SSI1_SSN; //GPIO14复用功能 // gpio_fun_sel_config.fun_sel3.bits.b2428 = SSI1_RX; //GPIO15复用功能 // gpio_fun_sel_config.fun_sel4.bits.b0004 = SSI1_TX; //GPIO16复用功能 gpio_fun_sel_config.fun_sel0.bits.b0004 = SSI1_CLK, /*GPIO 0*/ gpio_fun_sel_config.fun_sel0.bits.b0812 = SSI1_SSN, /*GPIO 1*/ gpio_fun_sel_config.fun_sel1.bits.b0004 = SSI1_RX, /*GPIO 4*/ gpio_fun_sel_config.fun_sel1.bits.b0812 = SSI1_TX, /*GPIO 5*/ #endif __write_hw_reg32(CPR_GPIO_FUN_SEL0, gpio_fun_sel_config.fun_sel0.config); __write_hw_reg32(CPR_GPIO_FUN_SEL1, gpio_fun_sel_config.fun_sel1.config); __write_hw_reg32(CPR_GPIO_FUN_SEL2, gpio_fun_sel_config.fun_sel2.config); __write_hw_reg32(CPR_GPIO_FUN_SEL3, gpio_fun_sel_config.fun_sel3.config); __write_hw_reg32(CPR_GPIO_FUN_SEL4, gpio_fun_sel_config.fun_sel4.config); __write_hw_reg32(CPR_GPIO_FUN_SEL5, gpio_fun_sel_config.fun_sel5.config); __write_hw_reg32(CPR_GPIO_FUN_SEL6, gpio_fun_sel_config.fun_sel6.config); __write_hw_reg32(CPR_GPIO_FUN_SEL7, gpio_fun_sel_config.fun_sel7.config); __write_hw_reg32(CPR_CTL_MUXCTL1, gpio_config.mux1_ctl.muxctl1); __write_hw_reg32(CPR_CTL_MUXCTL2, gpio_config.mux2_ctl.muxctl2); __write_hw_reg32(GPIO_PORT_DDR0, (0xFFFF0000 | ((dir_config.dir) & 0xFFFF))); __write_hw_reg32(GPIO_PORT_DDR1, (0xFFFF0000 | ((dir_config.dir) >> 16))); //__write_hw_reg32(CPR_CTL_PECTL1, pupd_config.CTL_PECTL1.pupd); //__write_hw_reg32(CPR_CTL_PECTL2, pupd_config.CTL_PECTL2.pupd); __write_hw_reg32(GPIO_INTR_CTRL0, (0xF0000 | (interrupt_config.intr_ctl0.interrupt))); __write_hw_reg32(GPIO_INTR_CTRL1, (0xF0000 | (interrupt_config.intr_ctl1.interrupt))); __write_hw_reg32(GPIO_INTR_CTRL2, (0xF0000 | (interrupt_config.intr_ctl2.interrupt))); __write_hw_reg32(GPIO_INTR_CTRL3, (0xF0000 | (interrupt_config.intr_ctl3.interrupt))); __write_hw_reg32(GPIO_INTR_CTRL4, (0xF0000 | (interrupt_config.intr_ctl4.interrupt))); __write_hw_reg32(GPIO_INTR_CTRL5, (0xF0000 | (interrupt_config.intr_ctl5.interrupt))); __write_hw_reg32(GPIO_INTR_CTRL6, (0xF0000 | (interrupt_config.intr_ctl6.interrupt))); __write_hw_reg32(GPIO_INTR_CTRL7, (0xF0000 | (interrupt_config.intr_ctl7.interrupt))); NVIC_EnableIRQ(GPIO_IRQn); } /* --------------------------------------------------------------------------------------------------- - 函数名称: gpio_mux_ctl (0-31) - 函数功能: pin脚连接控制 - 输入参数: mux - 创建日期: 2021-5-18 - 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) { if (mux > 3) return; uint32_t temp = 0; __read_hw_reg32((CPR_CTL_MUXCTL1 + (num / 16)), temp); temp = (temp & (~(0x3 << ((num % 16) * 2)))) | (mux << ((num % 16) * 2)); __write_hw_reg32((CPR_CTL_MUXCTL1 + (num / 16)), temp); } extern void gpio_mux_ctl_u(uint8_t num, uint8_t mux) //(num:32-34) { if (mux > 3) return; uint32_t temp = 0; __read_hw_reg32(CPR_CTL_MUXCTL3, temp); temp = (temp & (~(0x3 << ((num % 16) * 2)))) | (mux << ((num % 16) * 2)); __write_hw_reg32(CPR_CTL_MUXCTL3, temp); } /* --------------------------------------------------------------------------------------------------- - 函数名称: gpio_fun_inter (0-34) - 函数功能: gpio中断模式设置 - 输入参数: gpio编号0-28 中断类型0无中断 5上升沿中断 7下降沿中断 - 创建日期: 2019-12-03 ----------------------------------------------------------------------------------------------------*/ extern void gpio_fun_inter(uint8_t num, uint8_t inter) { unsigned int temp = 0; if (inter > 0xF) return; switch (num % 4) { case 3: __read_hw_reg32((GPIO_INTR_CTRL0 + (num / 4)), temp); temp &= 0x0FFF; temp |= ((inter << 12) | 0xF0000); __write_hw_reg32((GPIO_INTR_CTRL0 + (num / 4)), temp); break; case 2: __read_hw_reg32((GPIO_INTR_CTRL0 + (num / 4)), temp); temp &= 0xF0FF; temp |= ((inter << 8) | 0xF0000); __write_hw_reg32((GPIO_INTR_CTRL0 + (num / 4)), temp); break; case 1: __read_hw_reg32((GPIO_INTR_CTRL0 + (num / 4)), temp); temp &= 0xFF0F; temp |= ((inter << 4) | 0xF0000); __write_hw_reg32((GPIO_INTR_CTRL0 + (num / 4)), temp); break; case 0: __read_hw_reg32((GPIO_INTR_CTRL0 + (num / 4)), temp); temp &= 0xFFF0; temp |= ((inter) | 0xF0000); __write_hw_reg32((GPIO_INTR_CTRL0 + (num / 4)), temp); break; default: break; } } /* --------------------------------------------------------------------------------------------------- - 函数名称: gpio_fun_sel (0-28) - 函数功能: gpio复用功能设置 - 输入参数: gpio编号0-28 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】 - 创建日期: 2019-12-03 ----------------------------------------------------------------------------------------------------*/ extern void gpio_fun_sel(uint8_t num, uint8_t sel) //(num:0-28) { unsigned int temp = 0; if (sel > 21) return; switch (num % 4) { case 0: __read_hw_reg32((CPR_GPIO_FUN_SEL0 + (num / 4)), temp); temp &= 0xFFFFFF00; temp |= sel; __write_hw_reg32((CPR_GPIO_FUN_SEL0 + (num / 4)), temp); break; case 1: __read_hw_reg32((CPR_GPIO_FUN_SEL0 + (num / 4)), temp); temp &= 0xFFFF00FF; temp |= (sel << 8); __write_hw_reg32((CPR_GPIO_FUN_SEL0 + (num / 4)), temp); break; case 2: __read_hw_reg32((CPR_GPIO_FUN_SEL0 + (num / 4)), temp); temp &= 0xFF00FFFF; temp |= (sel << 16); __write_hw_reg32((CPR_GPIO_FUN_SEL0 + (num / 4)), temp); break; case 3: __read_hw_reg32((CPR_GPIO_FUN_SEL0 + (num / 4)), temp); temp &= 0x00FFFFFF; temp |= (sel << 24); __write_hw_reg32((CPR_GPIO_FUN_SEL0 + (num / 4)), temp); break; default: break; } } /* --------------------------------------------------------------------------------------------------- - 函数名称: gpio_output_high - 函数功能: Gpio输出高电平 - 输入参数: gpio编号 (< 29) - 创建日期: 2016-05-24 ----------------------------------------------------------------------------------------------------*/ extern void gpio_output_high(uint8_t num) { __write_hw_reg32((GPIO_PORT_DR0 + (num >> 4)), (0x00010001 << (num & 0x0F))); } /* --------------------------------------------------------------------------------------------------- - 函数名称: gpio_output_low - 函数功能: Gpio输出低电平 - 输入参数: gpio编号 (< 29) - 创建日期: 2016-05-24 ----------------------------------------------------------------------------------------------------*/ extern void gpio_output_low(uint8_t num) { __write_hw_reg32((GPIO_PORT_DR0 + (num >> 4)), (0x00010000 << (num & 0x0F))); } /* --------------------------------------------------------------------------------------------------- - 函数名称: GPIO_Handler (0-34) - 函数功能: GPIO0中断处理函数 - 输入参数: 无 - 创建日期: 2016-05-26 ----------------------------------------------------------------------------------------------------*/ 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(24, val)) // 判断是否为GPIO24中断 { // printf("GPIO24 interrupt\n"); } } /* --------------------------------------------------------------------------------------------------- - 函数名称: gpio_input_val - 函数功能: 获取GPIO管脚状态 - 输入参数: gpio编号(0-34) - 输出参数: 高低电平值 - 创建日期: 2016-06-07 ----------------------------------------------------------------------------------------------------*/ 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); } /* --------------------------------------------------------------------------------------------------- - 函数名称: gpio_direction_output - 函数功能: 设置GPIO管脚方向为输出 - 输入参数: gpio编号(0-34) - 创建日期: 2016-06-07 ----------------------------------------------------------------------------------------------------*/ extern void gpio_direction_output(uint8_t num) { __write_hw_reg32((GPIO_PORT_DDR0 + (num >> 4)), ((0x10001) << (num & 0x0F))); } /* --------------------------------------------------------------------------------------------------- - 函数名称: gpio_direction_input (pe_ctrl1: 0x40002400+0x34)(pe_ctrl2:0x40002400+0x38)(pu_ctrl1:0x40002400+0x3c) - 函数功能: 设置GPIO管脚方向为输入 - 输入参数: 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】 - 创建日期: 2021-05-18 ----------------------------------------------------------------------------------------------------*/ extern void gpio_direction_input(uint8_t num, uint8_t pull_up_type) { uint8_t temp_num = num; uint32_t val; uint32_t *base_reg = 0x0; // uint32_t pos = (num&0x0f)<<1; 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 + (temp_num >> 4)), ((0x10000) << (temp_num & 0x0F))); __write_hw_reg32((GPIO_DEBOUNCE0 + (temp_num >> 4)), ((0x10001) << (temp_num & 0x0F))); }