基于IMX6ULL的嵌入式Linux开发学习笔记——(6)深入了解调用官方IOMUXC.H+KEY按键功能实现

  回顾一下,在第(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初始化,一切都是过程。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

潜心修行嵌入式Linux的鼠鼠

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值