回顾一下,在第(5)章中尝试了自己写gpio_init()函数,并且在之后还是以看懂NXP的官方SDK并合理运用为最终方向。在本章中,将要就上一章的IOMUXC.H里的函数解释不太清晰等问题进行重点阐述,在此之后就KEY按键作为输入进行库函数调用。
IOMUXC.H中重要函数说明
在复用为GPIO的过程中,以下两个函数较为重要——
IOMUXC_SetPinMux(); /*(1)gpio复用*/
IOMUXC_SetPinConfig(); /*(2)gpio电气属性设置*/
但在实际执行中,通过fsl_iomuxc.h的宏定义,
里面需要6个参数的PinMux仅需要1个参数即可完成设置;
同样,PinConfig也仅需要1个参数便能完成设置;
KEY按键功能开发
一、KEY按键功能原理分析
(1)按下KEY,KEY0端口接通,变为高电平。
(2)查.sch原理图可知,KEY0与UART1_CTS共用管脚
(3)查fsl_iomuxc.h可知,UART1_CTS复用为GPIO1_IO018,则将GPIO1_IO18复用为GPIO,并设置为输入模式(GDIR = 0)即可。
!!!注意,笔者这里犯了一个错误,错将GPIO1_IO06复用为UART1_CTS了。一定注意是谁复用成谁,是UART1_CTS复用GPIO1_IO18!!!
二、KEY按键功能代码编写
void key_init(void)
{
/*BEEP_init*/
/*(1)gpio复用*/
IOMUXC_SetPinMux(IOMUXC_UART1_CTS_B_GPIO1_IO18,0);
/*(2)gpio电气属性设置*/
IOMUXC_SetPinConfig(IOMUXC_SNVS_SNVS_TAMPER1_GPIO5_IO01,0X10B0);
// /*(3)gpio初始化*/
// GPIO1->GDIR &=~(1<<18); /*GPIO1_IO18设置为输入模式的一种方式*/
/*GPIO1_IO18设置为输入模式的另外一种方式*/
gpio_pin_config_t key_config;
key_config.direction = kGPIO_Digitalinput;
/*这个自己写的函数!有用!*/
gpio_init(GPIO1,18,&key_config);
}
/*
(4)读取GPIO1_IO18的高低电平
返回值:0按下,而1是未按下。
*/
int read_key(void)
{
int ret = 0;
/*直接读GPIO1_I018的DR*/
// ret = ((GPIO1->DR) >> 18) & 0X1;
/*
*调用第(4)章里面的读取函数
读取GPIO高/低电平
int gpio_pinread(GPIO_Type *base,int pin)
{
//将读取的dr右移pin位,移动到bit0上,只需要bit0的值
return (((base->DR) >> pin )& 0x1);
}
*/
ret = gpio_pinread(GPIO1,18);
return ret;
}
以下为最终的按键读取代码:
int key_getvalue(void)
{
int ret = 0;
static unsigned char release = 1; /*为1时候则按键被释放*/
if((release==1) && (read_key() ==0)) //此时有被按下
{
delay(15);
release = 0;
/*************消抖操作*************/
if(read_key() == 0) /*延时10ms后key仍为0,则按键有效*/
{
ret = KEY0_VALUE;
}
}
else if(read_key() == 1) //此时未被按下
{
ret = KEY_NONE;
release = 1;
}
return ret;
}
总结
这个使用key的例程主要是操作GPIO的输出,同时复习原理图找引脚、复用找重定义的define、然后对其gpio进行初始化的三部曲。并且将之前的gpio_init()使用了起来,这证明之前写的不是没用,而是要经过IO的Mux和Config之后再对GPIO初始化,一切都是过程。