696 lines
29 KiB
C
696 lines
29 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)));
|
|
}
|