<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
このビデオプレゼンテーションは、 MQX RTOSアプリケーション開発のエッセンシャル ・トレーニング・コースの第5回です。このセッションでは、MQXドライバーのアーキテクチャ、ドライバーの初期化方法と使用方法を紹介し、シリアルGPIOと軽量GPIOという2つの非常に一般的なドライバーについて説明します。
このトレーニングは、フリースケールがスポンサーとなり、実績のあるパートナーである Embedded Access Inc.によって作成されました。
|
- ドライバ・アーキテクチャ
- Block vs. Byte modes
- POSIX ドライバー
- 低レベルドライバー
- ポーリング・モードと割り込みモード
- ドライバーの初期化
- I/O サブシステム (POSIX)
- シリアルドライバーのウォークスルー
- 軽量GPIOドライバーのウォークスルー
- ラボ課題
| - GPIOの初期化
- 入力の機能の設定
- 入力を監視する
- ユーザーインターフェースの更新
- 出力の構成
- 出力の制御
|
まず、セッション 5: ドライバーの概要のビデオをご覧ください。
その後、以下のインタラクティブなラボ課題に進んでください。
セッション 5: ラボ課題
はじめに
軽量 GPIO (LWGPIO) ドライバーは、入力の監視と制御に使用されます。概念は非常に単純ですが、このドライバーで使用する必要のあるいくつかの構造と機能があります。これは、プロセッサを変更した場合にコードを簡単に移植できるようにするためであり、Kinetisなどの最新のプロセッサの複雑さのためでもあります。
目的
このラボの目的は、スイッチと LED の機能を実装することです。この目的は、次の方法で達成されます。
- スイッチからの入力をポーリングするコードを入力タスクに追加する
- スイッチの 1 つの状態が変化したときに、ヘルス タスクにメッセージを送信し、そのメッセージが表示タスクに渡されます
- ディスプレイ タスクにコードを追加して、オレンジ色の LED を sw1 の状態を反映し、黄色の LED を sw2 の状態を反映するように設定します
- 緑色のLEDの状態を毎秒切り替えます
使用する新しい関数/構造:
LWGPIO_STRUCT、LWGPIO_PIN_ID、lwgpio_init、lwgpio_set_functionality、lwgpio_set_attribute、lwgpio_get_value、lwgpio_set_value、lwgpio_toggle_value
割り当て
入力の初期化
- 当面はGPIOに関連するメッセージに焦点を当てるため、余分なメッセージで結果を混乱させないように、AccelタスクとTempタスクからのメッセージを無効にします。これら 2 つのタスクからのメッセージの送信をコメント アウトするか、タスクが永続的にブロックを開始したことを示すメッセージを印刷した後でコメント アウトできます。
- Input タスクの仕事は入力を監視することですが、これまでは、プレースホルダー メッセージを定期的に送信することで入力をシミュレートしてきました。これは、K70タワーカードのスイッチ1またはスイッチ2のいずれかの状態が変更された場合にのみメッセージを送信することで置き換えることができます。思い出せば、別のセッションのラボでは、main.h のすべてのメッセージの種類を列挙型で定義しました。入力タスクからのメッセージタイプとして Input_Message を追加しましたが、スイッチ 1 (sw1) とスイッチ 2 (sw2) の 2 種類のメッセージがあります。リストからInput_Messageを削除し、SW1_MessageとSW2_Messageを追加します。
- 入力タスクでは、LWGIOに関連付けられたさまざまな構造体タイプのいくつかの変数を宣言する必要があります。変数の宣言が行われた関数の先頭に、変数 sw1 と sw2 (どちらも LWGPIO_STRUCT 型) を追加します。また、sw1 と sw2 の値も知る必要があるため、LWGPIO_VALUE 型の変数 sw1_value s と sw2_value を宣言します。最後に、各スイッチの以前の値を保持するには、sw1_last_value と sw2_last_value という LWGPIO_VALUE 型の変数がさらに 2 つ必要です。


- プロセッサで I/O を使用するには、まず初期化して使用方法を定義する必要があります。Input_Taskの初期化セクションで、_lwgpio_init() 関数を使用して sw1 に接続された入力ピンを初期化し、再度 sw2 に関連付けられた入力ピンを初期化します。各ピンの ID は、使用しているカードの BSP で定義されています (この場合は twrk70f120m.h)。これは、BSP プロジェクトの BSP_Files フォルダにあります。これらのピンを入力として使用しているため、初期化された値 LWGPIO_VALUE_NOCHANGE を使用できます。




- また、各ピンの機能を設定する必要があり、_lwgpio_init() は実際のピン マルチプレクサ レジスタを設定しないため、プロセッサ上の関連付けられたピンを実際に IO として使用する必要があるとは定義していません。_lwgpio_set_functionality() 関数を使用して、関連するピンを入力として定義します。IO ピンのさまざまな機能オプションの定義は、同じ BSP ファイル (towrk70f120m.h) で定義されています。つまり、BSP_SW1_MUX_GPIOは、ピンD0をsw1の内部信号に設定しBSP_SW1_MUX_GPIOピンE26をsw2の内部信号に関連付けるために使用されます。




- スイッチのタワーボード上の回路にはプルアップ抵抗がないため、lwgpio_set_attribute()機能を使用して内部プルアップ抵抗を有効にする必要があります。




スイッチのモニタリング
- 入力タスクの無限ループで最初に行うことは、_lwgpio_get_value()関数を使用してスイッチの値を読み取り、結果を sw1_value と sw2_valueに格納することです。
- 読み取り値が以前の値と同じでない場合は、変更されている必要があるため、ヘルスタスクにメッセージを送信します。以前にメッセージを送信するためのコードをコピーします。メッセージの種類 (SW1_MESSAGE または SW2_MESSAGE) を更新し、以前のように 0 のデータを送信する代わりに、スイッチの値 (sw1_value または sw2_value) を送信できます。現在の値と最後の値を比較することでスイッチの状態の変化を検出しているため、変更を検出したので、現在の値を最後の値にコピーする必要があります。


- これについてまだ考えていない場合は、sw1_last_valueとsw2_last_valueが初期化されていない場合、電源投入時に誤った状態変化検出が発生する可能性があります。スイッチが押されていないときは読み取り値が 1 になるため、最後の値を 1 (LWGPIO_VALUE_HIGH) に事前に初期化することをお勧めします。
- エンドレスループの時間遅延を100ミリ秒に変更して、スイッチのすべての押下を確実にキャッチします。
ディスプレイの更新
- 現在、メッセージで実際のデータを送信しているため、更新を受信したときにディスプレイタスクにスイッチの状態を印刷させるのが良いでしょう。これを行うには、表示タスクのprintfを更新して、メッセージのデータフィールドに渡されているこのパラメータも表示します。
- コードをコンパイルして実行します。


LED の初期化
- 入力タスクで行ったように、LEDを制御するGPIOを初期化する必要がありますが、もちろん、これらは出力として構成されます。
- Display Task で、各 LED の LWGPIO_STRUCT 型の変数を宣言します。制御したいLEDが4つあるので、このような配列を使用する方が便利かもしれません。"LWGPIO_STRUCT leds[4];"
- また、twrk70f120m.h で定義されている各 LED の ID (BSP_LED1 など) も追跡する必要がありますファイル。LWGPIO 構造体に配列を使用する場合は、これらにも配列を使用するのが理にかなっています。


- Display Taskの初期化セクションでは、LEDに関連付けられたIOピンを、スイッチに対して行ったのと同様の方法で初期化する必要があります。ただし、方向を出力 (LWGPIO_DIR_OUTPUT) として設定し、初期値を高くして値 (LWGPIO_VALUE_HIGH) にする必要があるとします。これは、これらのピンの出力に対応するスイッチの値を反映し、デフォルトで High に設定されているためです (プルアップを覚えていますか?)。
- スイッチの IO でも行われたように、対応するピンの機能を設定して、IO として構成する必要があります。BSP ヘッダー ファイルからの定義が再度必要になります (例: BSP_LED1_MUX_GPIO)
- 初期化するLEDは4つあるため、初期化にforループを使用して、物事をクリーンに保つことを検討できます。




- コードをコンパイルして実行します。


- 最後の要件は、緑色のLED(LED2)の状態を毎秒切り替えることです。これは、Display Taskのmsgq_receive()関数に1000msのタイムアウトを空けることで実現できます。この関数は、タイムアウトが経過すると NULL を返し、それ以外の場合は受信したメッセージへのポインターを返します。出力の切り替えは、現在の設定を追跡し、lwgpio_set_value() 関数を使用するか、より簡単に lwgpio_toggle_value() 関数を使用して行うことができます。




- コードをコンパイルして実行し、スイッチ処理が引き続き機能し、緑色の LED がトグルしていることを確認します。
さらにサポートが必要ですか?このラボの完全なソース コードは、こちらの 'Lab Source Code' フォルダーにあります。