Files
hpw421/component/boot2/bsp/bsp_gpio_normal.c
2026-07-03 18:08:25 +08:00

696 lines
28 KiB
C

/*----------------------------------------------------------------------------------------------------
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)));
}