HongmengOSに基づくボタンドライバー

キーは一般的に使用される入力システムです。キー値を正確かつ効率的に取得する方法は、頻繁に直面する問題です。今日は、Hongmengシステムで独立したキーのキー値を取得する方法について説明します。

目標

今回は、Hi3861コアボードの左下隅にあるUSERボタンS2を例にとります。ボタンを押すと、USBType-cに対応するシリアルポートから情報が出力されます。

実際のオブジェクトのボタンS2の対応する関係は、次の図の黄色い線で示されています。

HongmengOSに基づくボタンドライバー

ボタンの概略図

コアボードの左下隅にあるボタンS2の概略図は次のとおりです。

HongmengOSに基づくボタンドライバー

S2を押すと、GPIO05がGNDに接続され、この時点でGPIO05入力はローになります。

コード

実装方法1:入力IOの状態を読み取る

#include <stdio.h>

#include <unistd.h>

#include "ohos_init.h"
#include "cmsis_os2.h"
#include "wifiiot_gpio.h"
#include "wifiiot_gpio_ex.h"
#include "wifiiot_errno.h"

static void Key_Task(const char* arg)
{   
    (void)arg;

    printf("Enter the Key_Task ... \n");

    while (1) 
    {
        WifiIotGpioValue wigv;

        GpioGetInputVal(WIFI_IOT_IO_NAME_GPIO_5,&wigv);

        if (wigv == WIFI_IOT_GPIO_VALUE0)
        {
            usleep(10*1000);        //10ms

            while(1)
            {
                GpioGetInputVal(WIFI_IOT_IO_NAME_GPIO_5,&wigv);
                if (wigv == WIFI_IOT_GPIO_VALUE1){
                    printf("[DEMO] GPIO05 Low level.\n");
                    break;
                }        
            }                           
        }
    }

    return;
}

static void KeyExampleEntry(void)
{
    unsigned int ret = 0;
    GpioInit();
    IoSetFunc(WIFI_IOT_IO_NAME_GPIO_5, WIFI_IOT_IO_FUNC_GPIO_5_GPIO);
    GpioSetDir(WIFI_IOT_GPIO_IDX_5, WIFI_IOT_GPIO_DIR_IN);

    if (ret != WIFI_IOT_SUCCESS)
    {
        printf("===== ERROR ======gpio -> GpioSetDir ret:%d\r\n", ret);
        return;
    }

    osThreadAttr_t attr = {0};

    attr.name = "Key_Task";
    attr.attr_bits = 0U;
    attr.cb_mem = NULL;
    attr.cb_size = 0U;
    attr.stack_mem = NULL;
    attr.stack_size = 1024;
    attr.priority = osPriorityNormal;

    if(osThreadNew((osThreadFunc_t)Key_Task,NULL,&attr) == NULL)
    {
        printf("Failed to create Key_Task !\n");
    }   
}

SYS_RUN(KeyExampleEntry);

コードをコンパイルします。

python build.py wifiiot

HongmengOSに基づくボタンドライバー

ファームウェアを更新した後、最小システムボードを再起動し、シリアルポートアシスタントを開き、コアボードの[ユーザー]ボタンS2をクリックすると、シリアルポートアシスタントは次のように情報を出力します。

HongmengOSに基づくボタンドライバー

注:
この例では、ループ内のボタンの状態を読み取る新しいタスクを作成します。KeyExampleEntryは、アプリケーションの入力関数として使用されます。while(1)の時間のかかる操作を自由に使用することはできません。すぐに戻る必要があります。そうしないと、HongmengOSの残りの部分が妨げられます。したがって、アプリケーションプログラムの操作では、このエントリ関数でボタンステータス監視専用のタスク(スレッド)を作成して、ボタンステータスを判別します。

GPIO割り込み

上記の概略図から、ボタンS2を押さない場合、GPIO05はデフォルトのハイレベル状態になっていることがわかります。ボタンS2を押すと、GPIO05がGNDに接続され、GPIO05がローになります。ボタンS2を離すと、その時、GPIO05は再びハイレベルに戻ります。

このプロセスでは、ボタンS2を押すと、GPIO05は高から低へのレベル変化を受け取ります。このプロセスを立ち下がりエッジと呼びます。ボタンS2を離すと、GPIO05は低を受け取ります。大まかに言うと、このプロセスを立ち上がりエッジと呼びます。

要約すると、ジッタの影響を考慮せずに、GPIO05はボタンが押されるたびに立ち下がりエッジを受け取り、GPIO05はボタンが離されるたびに立ち上がりエッジを受け取ります。

GPIO05ピンにエッジトリガー関数(立ち上がりエッジまたは立ち下がりエッジトリガーのいずれか)を登録すると、この登録されたエッジトリガーコールバック関数が1回呼び出され、理論的にはキーが押されます。


#include <stdio.h>
#include <unistd.h>
#include "ohos_init.h"
#include "cmsis_os2.h"
#include "wifiiot_gpio.h"
#include "wifiiot_gpio_ex.h"
#include "wifiiot_errno.h"

/* gpio callback func */
void gpio5_isr_func(char *arg)
{
    (void)arg;
    printf("----- gpio05 isr success -----\r\n");
}

static void KeyExampleEntry(void)
{
    unsigned int ret = 0;
    GpioInit();
    IoSetFunc(WIFI_IOT_IO_NAME_GPIO_5, WIFI_IOT_IO_FUNC_GPIO_5_GPIO);
    GpioSetDir(WIFI_IOT_GPIO_IDX_5, WIFI_IOT_GPIO_DIR_IN);
    //IoSetPull(WIFI_IOT_GPIO_IDX_5,WIFI_IOT_IO_PULL_UP);

    if (ret != WIFI_IOT_SUCCESS) 
    {
        printf("===== ERROR ======gpio -> GpioSetDir ret:%d\r\n", ret);
        return;
    }
    ret = GpioRegisterIsrFunc(WIFI_IOT_GPIO_IDX_5,WIFI_IOT_INT_TYPE_EDGE,WIFI_IOT_GPIO_EDGE_RISE_LEVEL_HIGH, gpio5_isr_func, NULL);
    if (ret != WIFI_IOT_SUCCESS) 
    {
        printf("===== ERROR ======gpio -> hi_gpio_register_isr_function ret:%d\r\n", ret);
    }
}

SYS_RUN(KeyExampleEntry);

コードの説明:

  1. WIFI_IOT_IO_NAME_GPIO_5は、ボタンS2に接続されたGPIOです。ボタン割り込みキャプチャを実現するには、IoSetFunc()関数を使用してポート関数を再定義する必要があります。

  2. GpioSetDir()関数を呼び出し、GPIO05を入力として設定し、IoSetPull()関数を介してポートをプルアップ入力(プルアップ)として設定します。

  3. GpioRegisterIsrFunc()関数を呼び出して、GPIO05とコールバック関数gpio5_isr_func()の登録バインディングを完了し、トリガーモードを立ち上がりエッジトリガーに設定します:WIFI_IOT_GPIO_EDGE_RISE_LEVEL_HIGH。ボタンS2を離すと、立ち上がりエッジが生成され、コールバック関数gpio5_is_がトリガーされます。

HongmengOSに基づくボタンドライバー

上記の2つの方法を通じて、独立したボタンステータスを取得する方法、Hongmengシステムでタスクを作成する方法、および外部割り込みの使用方法を学習しました。このコードを使用して、パイロ赤外線センサーの応答信号を識別することもできます。

情報取得

パブリックコメントセクションはありませんトップコメントは、この記事のコードを取得します。

ps:この記事は電子機器愛好家によって最初に公開されました。

Xiaohaには言いたいことがあります

最近、Hongmeng交換グループで、Hongmengオペレーティングシステムを使用して多数の開発ボードを移植することを知りました。これらのメーカーがボードを移植すると、Hongmengは本当に気候になります。組み込み開発者として、リアルタイムオペレーティングシステムを学びます。それは不可欠です。すべてを学ぶことは学ぶことです。有望なものを学びませんか?

HongmengOSに基づくボタンドライバー

フォローへようこそ

プログラマーXiaohaがあなたを埋め込みのWeChat検索に連れて行ってくれます:0から1まで埋め込まれ、より多くの乾物があなたを待っています。

おすすめ

転載: blog.51cto.com/14950741/2547478