基于IMX6ULLmini的Linux裸机开发系列三:按键检测输入

目录

开启GPIO5对应的时钟

设置引脚复用

设置GPIO5_IO1输入模式

设置检测电平

部分代码

button.c

led.c

main.c


 

在原理图上找到对应的引脚后即可以根据对应的图表找到真正在板字上的引脚,这里的

SNVS_TAMPER1对应实际的引脚是GPIO5_IO1

 

P1357页附近有GPIO5对应的寄存器位置,可以直接跳转

开启GPIO5对应的时钟

 

设置引脚复用

注意:当TAMPER引脚用作GPIO时,ALT5模式才有效。这取决于FUSE设置"TAMPER_PIN_DISABLE[1:0]"。

当TAMPER引脚用作GPIO时,以下是复用信息:SNVS_TAMPER1 ==> GPIO5_01

  • 101 ALT5 — 选择复用模式:ALT5复用端口,实例中的GPIO5_IO01,即gpio5
  • 其他保留

所以设置复用为GPIO5

第一行代码 IOMUXC_SetPinMux(IOMUXC_SNVS_SNVS_TAMPER1_GPIO5_IO01, 0); 设置了引脚 IOMUXC_SNVS_SNVS_TAMPER1_GPIO5_IO01 的复用功能为默认值(0)。也就是说,将该引脚配置为其默认的功能,而不是使用其他的复用模式。

第二行代码 IOMUXC_SetPinConfig(IOMUXC_SNVS_SNVS_TAMPER1_GPIO5_IO01, 0x10B0); 设置了引脚 IOMUXC_SNVS_SNVS_TAMPER1_GPIO5_IO01 的PAD属性。具体的属性值为 0x10B0。

设置GPIO5_IO1输入模式

GPIO方向位。该寄存器的第n位定义了GPIO[n]信号的方向。

注意:GPIO_GDIR仅在I/O MUX中相应位配置为GPIO时,才会影响I/O信号的方向。

  • 0 INPUT — 将GPIO配置为输入。
  • 1 OUTPUT — 将GPIO配置为输出 

第一位设置为0,输入模式

设置检测电平

 

数据位。该寄存器在将信号配置为输出(GDIR[n]=1)时定义了GPIO输出的值。对该寄存器的写入操作会存储在一个寄存器中。当信号被配置为输出(GDIR[n]=1)时,读取GPIO_DR将返回存储在寄存器中的值;当信号被配置为输入(GDIR[n]=0)时,读取GPIO_DR将返回输入信号的值。

注意:为了使GPIO_DR的值与信号连接,必须将I/O复用器配置为GPIO模式。如果禁用了输入路径,则始终返回零值。

这里配置为输入,返回外部信号的值。根据原理,按下按键高电平,值为1,寄存器存储在第一位的值是1,所以这时与1左移一位进行对比可以验证是否按下按键。

部分代码

button.c

# include  "common.h"



/*按键初始化函数*/

void button_init(void)

{

    /*按键初始化*/

    CCM->CCGR1 = 0xffffffff;

    //CCM_CCGR1_CG15(0x3);  //开启GPIO5的时钟



    

    /*设置 绿灯 引脚的复用功能以及PAD属性*/

    IOMUXC_SetPinMux(IOMUXC_SNVS_SNVS_TAMPER1_GPIO5_IO01,0);     

    IOMUXC_SetPinConfig(IOMUXC_SNVS_SNVS_TAMPER1_GPIO5_IO01, 0x10B0); 

    

    /*设置GPIO5_01为输入模式*/

    GPIO5->GDIR &= ~(1<<1);  

}



/*按键状态输出函数*/

int get_button_status(void)

{

    if((GPIO5->DR)&(1<<1))

    {

        delay(0xFF);

         if((GPIO5->DR)&(1<<1))

         {

             return 1;

         }

    }

    return 0;

}

led.c

# include  "common.h"



  /*led初始化函数*/

void rgb_led_init(void)

{

    /*使能GPIO1时钟*/

      CCM->CCGR1 = 0xffffffff;



     /*设置 红灯 引脚的复用功能以及PAD属性*/

    IOMUXC_SetPinMux(IOMUXC_GPIO1_IO04_GPIO1_IO04,0);     

    IOMUXC_SetPinConfig(IOMUXC_GPIO1_IO04_GPIO1_IO04, 0X10B0); 



    /*设置GPIO1_04为输出模式*/

    GPIO1->GDIR |= (1<<4);  



    /*设置GPIO1_04输出电平为高电平*/

    GPIO1->DR |= (1<<4);  



}

main.c

# include  "common.h"



int main()

{

    int i = 0;



    /*初始化led灯和按键*/

    rgb_led_init();

    button_init();



    while(1)

    {

        /*按键按下*/

        if(get_button_status())

        {

            /*翻转红灯状态*/

            if(i == 0)

            {

                red_led_on;

                i = 1;

            }

            else

            {

                red_led_off;

                i = 0;

            }

            while(get_button_status());//等待按键松开

        }

    }



    return 0;    

}

猜你喜欢

转载自blog.csdn.net/qq_51519091/article/details/132351532