I.はじめに
プログラムの設計と開発には不確実性があるため、多くの場合、いくつかの特定のピンを初期化し、ピン レベルのステータスを読み取ったり、ピンに High および Low レベルを出力したりする必要があります。
2. コードの実装
ポートの初期化ステートメントをすばやく見つけます。
まず、board.c ファイルを見つけます。下図の位置に、LED ライトのポートに関する初期化ステートメントが表示されます。
Go Definition 関数を使用するか、gpio.c ファイルを直接検索すると、具体的な実装方法を確認できます。
/*
/ _____) _ | |
( (____ _____ ____ _| |_ _____ ____| |__
\____ \| ___ | (_ _) ___ |/ ___) _ \
_____) ) ____| | | || |_| ____( (___| | | |
(______/|_____)_|_|_| \__)_____)\____)_| |_|
(C)2013 Semtech
Description: Generic GPIO driver implementation
Comment: Relies on the specific board GPIO implementation as well as on
IO expander driver implementation if one is available on the target
board.
License: Revised BSD License, see LICENSE.TXT file include in the project
Maintainer: Miguel Luis and Gregory Cristian
*/
#include "board.h"
#include "gpio-board.h"
void GpioInit( Gpio_t *obj, PinNames pin, PinModes mode, PinConfigs config, PinTypes type, uint32_t value )
{
GpioMcuInit( obj, pin, mode, config, type, value );
}
void GpioSetInterrupt( Gpio_t *obj, IrqModes irqMode, IrqPriorities irqPriority, GpioIrqHandler *irqHandler )
{
GpioMcuSetInterrupt( obj, irqMode, irqPriority, irqHandler );
}
void GpioRemoveInterrupt( Gpio_t *obj )
{
GpioMcuRemoveInterrupt( obj );
}
void GpioWrite( Gpio_t *obj, uint32_t value )
{
GpioMcuWrite( obj, value );
}
void GpioToggle( Gpio_t *obj )
{
GpioMcuToggle( obj );
}
uint32_t GpioRead( Gpio_t *obj )
{
return GpioMcuRead( obj );
}
今回主に使用するメソッドはGpioInit()です。
このメソッドには 5 つのパラメータがあるので、1 つずつ展開してみましょう。
パラメータ 1: Gpio_t *obj: これを使用するときは、最初に Gpio_t タイプの変数を作成し、後で操作できるように初期化中にそれを渡す必要があります。
パラメータ 2: PinNames pin: ここでは、PB_2 など、操作する必要があるポートを入力します。
パラメータ 3: PinModes モード: ここでは、PIN_INPUT (入力モード)、PIN_OUTPUT (出力モード) という 2 つの一般的なタイプを入力できます。PIN_ALTERNATE_FCT と PIN_ANALOGIC は、当面は注意する必要はありません。
パラメータ 4: PinConfigs config: ここでは通常、PIN_PUSH_PULL (プッシュプル) と書きます。
パラメータ 5: PinTypes タイプ: ここでは、必要に応じて PIN_NO_PULL、PIN_PULL_UP、PIN_PULL_DOWN を選択できます。
パラメータ 6: 0 を入力するだけです。
コード例:
以下に PB_2 のレベルを読み出し、LED1 を Low レベルで点灯する動作を示します。
Gpio_t Device;
int main( void )
{
Init();
GpioInit(&Device,PB_2,PIN_INPUT,PIN_PUSH_PULL,PIN_PULL_UP,0);
while( 1 )
{
if(GpioRead(&Device)==0)
GpioWrite(&Led1,0);
else
GpioWrite(&Led1,1);
}
}