キーは一般的に使用される入力システムです。キー値を正確かつ効率的に取得する方法は、頻繁に直面する問題です。今日は、Hongmengシステムで独立したキーのキー値を取得する方法について説明します。
目標
今回は、Hi3861コアボードの左下隅にあるUSERボタンS2を例にとります。ボタンを押すと、USBType-cに対応するシリアルポートから情報が出力されます。
実際のオブジェクトのボタンS2の対応する関係は、次の図の黄色い線で示されています。
ボタンの概略図
コアボードの左下隅にあるボタンS2の概略図は次のとおりです。
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
ファームウェアを更新した後、最小システムボードを再起動し、シリアルポートアシスタントを開き、コアボードの[ユーザー]ボタンS2をクリックすると、シリアルポートアシスタントは次のように情報を出力します。
注:
この例では、ループ内のボタンの状態を読み取る新しいタスクを作成します。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);
コードの説明:
-
WIFI_IOT_IO_NAME_GPIO_5は、ボタンS2に接続されたGPIOです。ボタン割り込みキャプチャを実現するには、IoSetFunc()関数を使用してポート関数を再定義する必要があります。
-
GpioSetDir()関数を呼び出し、GPIO05を入力として設定し、IoSetPull()関数を介してポートをプルアップ入力(プルアップ)として設定します。
- GpioRegisterIsrFunc()関数を呼び出して、GPIO05とコールバック関数gpio5_isr_func()の登録バインディングを完了し、トリガーモードを立ち上がりエッジトリガーに設定します:WIFI_IOT_GPIO_EDGE_RISE_LEVEL_HIGH。ボタンS2を離すと、立ち上がりエッジが生成され、コールバック関数gpio5_is_がトリガーされます。
上記の2つの方法を通じて、独立したボタンステータスを取得する方法、Hongmengシステムでタスクを作成する方法、および外部割り込みの使用方法を学習しました。このコードを使用して、パイロ赤外線センサーの応答信号を識別することもできます。
情報取得
パブリックコメントセクションはありませんトップコメントは、この記事のコードを取得します。
ps:この記事は電子機器愛好家によって最初に公開されました。
Xiaohaには言いたいことがあります
最近、Hongmeng交換グループで、Hongmengオペレーティングシステムを使用して多数の開発ボードを移植することを知りました。これらのメーカーがボードを移植すると、Hongmengは本当に気候になります。組み込み開発者として、リアルタイムオペレーティングシステムを学びます。それは不可欠です。すべてを学ぶことは学ぶことです。有望なものを学びませんか?
フォローへようこそ
プログラマーXiaohaがあなたを埋め込みのWeChat検索に連れて行ってくれます:0から1まで埋め込まれ、より多くの乾物があなたを待っています。