IMX6ULLmini ベースの Linux ベアメタル開発シリーズ 3: キー検出入力

目次

GPIO5に対応したクロックをONにする

ピンの多重化を設定する

GPIO5_IO1 入力モードを設定する

検出レベルの設定

コードの一部

ボタン.c

LED.C

main.c


 

回路図で対応するピンを見つけたら、対応する表に従ってボード上の実際のピンを見つけることができます。

SNVS_TAMPER1 に対応する実際のピンは GPIO5_IO1 です。

 

P1357 ページの近くに GPIO5 に対応するレジスタの場所があり、直接ジャンプできます

GPIO5に対応したクロックをONにする

 

ピンの多重化を設定する

 

注: ALT5 モードは、TAMPER ピンが GPIO として使用されている場合にのみ有効です。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) に設定します。つまり、別の代替モードを使用する代わりに、ピンをそのデフォルト機能に設定します。

コードの 2 行目は、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 出力 — GPIO を出力として構成します 

最初のビットは 0 に設定され、入力モードになります。

検出レベルの設定

 

データビット。このレジスタは、信号が出力として設定されている場合 (GDIR[n]=1) の GPIO 出力の値を定義します。このレジスタへの書き込みはレジスタに保存されます。信号が出力として構成されている場合 (GDIR[n]=1)、GPIO_DR を読み取るとレジスタに保存されている値が返され、信号が入力として構成されている場合 (GDIR[n]=0) は GPIO_DR を読み取ると、 input 信号の値。

注: GPIO_DR の値を信号に接続するには、I/O マルチプレクサを GPIO モードで構成する必要があります。入力パスが無効な場合は、常に値 0 を返します。

ここで入力として設定され、外部信号の値を返します。原理によれば、ボタンのハイレベルが押され、その値は1であり、レジスタの最初のビットに格納されている値は1なので、このとき、それを比較することでボタンが押されたかどうかを検証できます左に 1 シフトします。

コードの一部

ボタン.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