Tiva C EK-TM4C123GXLを使ってみるの7回目です。
前回の続きでGPIOの利用ですが、ボード上のスイッチを使ってみます。
以下のメーカのサイトを見ながらプログラムを作っていきます。
Getting Started with the TIVA™ C Series TM4C123G LaunchPad
更に、このサイトで下の方の、Workshop MaterialのThe workbookを見ながら作ります。
直接のPDFファイルへのリンクは、The workbook PDF です。
このPDFファイルのLab3のプログラムの改造版です。
プロジェクト一式はこちらからダウンロード出来ます。
スイッチの使い方での注意点は以下です。
ボード上のスイッチは、SW1がPF4ピン、SW2がPF0ピンに接続されているので、これらを入力に設定してON/OFFを判定すればいいのですが、ピンの中には、安全のためロックがかかっているピンがあります。PF0ピンもその一つで、28行目からそのロックを解除している処理があります。詳細は、上の文書の3-8ページあたりを参照して下さい。またスイッチは、プルアップに設定しないとON/OFFが判定出来ないようなので、その処理が、36行目にあります。スイッチの使い方は、上の文書の15-15ページにあります。詳細は、こちらを参照して下さい。
ソース全体は、以下です。
一応、毎回書こうと思いますが、TivaWare付属のサンプルプログラム等を見ていると、ROM_ で始まっている関数をよく見かけますが、ROM_ の方は、ROM内蔵版です。こちらを使うとプログラム全体の大きさが小さくなりますが、ここでは特にサイズを気にする程でもないので、普通にリンクして使う、ROM_ が付いていない通常版の関数を使います。
//C99 standardの型を使うため #include <stdint.h> #include <stdbool.h> //ペリフェラルドライバを使うための include ファイル #include "inc/hw_memmap.h" #include "inc/hw_types.h" #include "driverlib/sysctl.h" #include "driverlib/gpio.h" #include "inc/hw_gpio.h" //pinデータ uint8_t ui8PinData=0; int main(void) { //システムクロックの設定(これで結果的に40MHz) SysCtlClockSet(SYSCTL_SYSDIV_5|SYSCTL_USE_PLL|SYSCTL_XTAL_16MHZ|SYSCTL_OSC_MAIN); //ポートへのクロック供給(必須) SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOF); //LEDの出力への方向設定 GPIOPinTypeGPIOOutput(GPIO_PORTF_BASE, GPIO_PIN_1|GPIO_PIN_2|GPIO_PIN_3); //スイッチのロックの解除 HWREG(GPIO_PORTF_BASE + GPIO_O_LOCK) = GPIO_LOCK_KEY; HWREG(GPIO_PORTF_BASE + GPIO_O_CR) |= 0x01; HWREG(GPIO_PORTF_BASE + GPIO_O_LOCK) = 0; //スイッチの入力への設定 GPIOPinTypeGPIOInput(GPIO_PORTF_BASE, GPIO_PIN_4|GPIO_PIN_0); //(weak)プルアップの設定 GPIOPadConfigSet(GPIO_PORTF_BASE, GPIO_PIN_4|GPIO_PIN_0, GPIO_STRENGTH_2MA, GPIO_PIN_TYPE_STD_WPU); //メインループ while(1) { //両方のSWが押されている場合 if( GPIOPinRead(GPIO_PORTF_BASE,GPIO_PIN_0)==0x00 && GPIOPinRead(GPIO_PORTF_BASE,GPIO_PIN_4)==0x00) { ui8PinData=2; //赤点灯 } //SW1が押されている場合 else if(GPIOPinRead(GPIO_PORTF_BASE,GPIO_PIN_4)==0x00) { ui8PinData=4; //青点灯 } //SW2が押されている場合 else if(GPIOPinRead(GPIO_PORTF_BASE,GPIO_PIN_0)==0x00) { ui8PinData=8; //緑点灯 } //どちらのSWも押されていない場合 else { ui8PinData=0; //消灯 } //LEDへ出力 GPIOPinWrite(GPIO_PORTF_BASE, GPIO_PIN_1| GPIO_PIN_2| GPIO_PIN_3, ui8PinData); SysCtlDelay(2000000); } }
上のソースのコメントにありますが、SW1(画像左下のスイッチ)が押されている間は、青が点灯して、SW2(画像右下のスイッチ)が押されている間は、緑が点灯します。両方押されている間は、赤が点灯します。
今回は、ここまでです。次回は、タイマと割り込みについてです。