摘要:这部分内容介绍了GPIO口的输入功能,引入了GPIO驱动初始化。这边复制简写一些代码,讲述部分功能。
GPIO驱动的初始化:
代码中的gpio.c文件
//gpio.h
//在头文件中首先枚举GPIO的输入输出方向,输入设置为0,输出设置为1.
typedef enum _gpio_pin_direction
{
kGPIO_DigitalInput = 0U, /* 输入 */
kGPIO_DigitalOutput = 1U, /* 输出 */
} gpio_pin_direction_t;
//设置一个结构体变量表示输入输出方向和电平。
typedef struct _gpio_pin_config
{
gpio_pin_direction_t direction; /* GPIO方向:输入还是输出 */
uint8_t outputLogic; /* 如果是输出的话,默认输出电平 */
} gpio_pin_config_t;
/* 函数声明 */
void gpio_init(GPIO_Type *base, int pin, gpio_pin_config_t *config);
int gpio_pinread(GPIO_Type *base, int pin);
void gpio_pinwrite(GPIO_Type *base, int pin, int value);
//gpio.c
//初始化GPIO,base为GPIO的组别,pin为IO口。例如:GPIO03_IO01中,base为03,pin为01.
//第三个参数为结构体变量。
void gpio_init(GPIO_Type *base, int pin, gpio_pin_config_t *config)
{
if(config->direction == kGPIO_DigitalInput) /* 输入 */
{
base->GDIR &= ~( 1 << pin); //设置输入的 与非
}
else /* 输出 */
{
base->GDIR |= 1 << pin; //设置输出的 或
gpio_pinwrite(base,pin, config->outputLogic);/* 设置默认输出电平 */
}
}
//读电平的函数,为了读电平的状态。
int gpio_pinread(GPIO_Type *base, int pin)
{
return (((base->DR) >> pin) & 0x1);
//把对应IO的电平移动到bit0,与上0x1,将其他位清零,与上1,得出读出的电平是0还是1。
}
//指定GPIO的电平,设置电平高低。
void gpio_pinwrite(GPIO_Type *base, int pin, int value)
{
if (value == 0U)
{
base->DR &= ~(1U << pin); /* 输出低电平 */
}
else
{
base->DR |= (1U << pin); /* 输出高电平 */
}
}
这边对GPIO初始化后,按键的代码key.c代码中:
//按键初始化
void key_init(void)
{
gpio_pin_config_t key_config; //结构体变量,通过key_config来调用结构体中参数。
/* 1、初始化IO复用, 复用为GPIO1_IO18 */
IOMUXC_SetPinMux(IOMUXC_UART1_CTS_B_GPIO1_IO18,0);
/* 2、、配置UART1_CTS_B的IO属性
*bit 16:0 HYS关闭
*bit [15:14]: 11 默认22K上拉
*bit [13]: 1 pull功能
*bit [12]: 1 pull/keeper使能
*bit [11]: 0 关闭开路输出
*bit [7:6]: 10 速度100Mhz
*bit [5:3]: 000 关闭输出
*bit [0]: 0 低转换率
*/
//0x1111 0100 0000
IOMUXC_SetPinConfig(IOMUXC_UART1_CTS_B_GPIO1_IO18,0xF080);
/* 3、初始化GPIO */
//GPIO1->GDIR &= ~(1 << 18); /* GPIO1_IO18设置为输入 */
key_config.direction = kGPIO_DigitalInput;
gpio_init(GPIO1,18, &key_config);
}
/*
* @description : 获取按键值
* @param : 无
* @return : 0 没有按键按下,其他值:对应的按键值
*/
int key_getvalue(void)
{
int ret = 0; //按键值初始值为0
static unsigned char release = 1; /* 按键松开 */
if((release==1)&&(gpio_pinread(GPIO1, 18) == 0)) /* KEY0 */
{
delay(10); /* 延时消抖 */
release = 0; /* 标记按键按下 */
if(gpio_pinread(GPIO1, 18) == 0) //按下
ret = KEY0_VALUE; //ret = 1
}
else if(gpio_pinread(GPIO1, 18) == 1) //没有按下
{
ret = 0;
release = 1; /* 标记按键释放 */
}
return ret;
}
最后通过在main.c函数中的代码来控制:(截取)
while(1)
{
keyvalue = key_getvalue(); //获取ret知道是否按下
if(keyvalue) //如果按下
{
switch ((keyvalue))
{
case KEY0_VALUE: //蜂鸣器翻转状态
beep_state = !beep_state;
beep_switch(beep_state);
break;
}
}
i++;
if(i==50)
{
i = 0;
led_state = !led_state;
led_switch(LED0, led_state);
}
delay(10);
}
return 0;
}
以此按键来控制蜂鸣器的发声。
标签:pin,int,按键,MX6U,base,GPIO,gpio,config,输入 From: https://www.cnblogs.com/cjl520/p/16864165.html