// PF1,PF2 に接続したLED（R,B）を100m秒ごとに反転する（ROM内蔵ドライバ使用）

//LM4F120H5QRマイコンレジスタ名などの設定ファイルをインクルード
#include "inc/lm4f120h5qr.h"


//ROM内蔵のペリフェラルドライバを使うための各種ヘッダファイルをインクルード
#include "inc/hw_types.h"
#include "inc/hw_memmap.h"
#include "driverlib/sysctl.h"
#include "driverlib/gpio.h"
#include "driverlib/rom.h"
#include "driverlib/pin_map.h"


//メイン関数
int main(void)
{
  
  //LED出力用データ
  unsigned char ledData =0x02;
  
  //レジスタ読み出し用
  unsigned long ulLoop = 0;
 
  //クロックの設定 80Mhz
  ROM_SysCtlClockSet(SYSCTL_SYSDIV_2_5|SYSCTL_USE_PLL|SYSCTL_XTAL_16MHZ|SYSCTL_OSC_MAIN);
 
  //ポートFへのクロック供給
  //この設定がないとポートレジスタにアクセスできません（例外処理が発生する）
  ROM_SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOF);

 //方向レジスタの設定（1=出力）
  //第1引数=アドレス 第2引数=出力にしたい端子
  //デジタル端子イネーブルレジスタの設定もしています
  ROM_GPIOPinTypeGPIOOutput(GPIO_PORTF_BASE, GPIO_PIN_2|GPIO_PIN_1);
  

 //データレジスタの1ビット目のみを1に設定（LEDはHアクティブ）
  //第1引数=アドレス 第2引数=操作したいビット（複数の場合はOR）、第3引数=書き込む値
  //関数内ではリードライトモディファイしてます
  ROM_GPIOPinWrite(GPIO_PORTF_BASE, GPIO_PIN_2|GPIO_PIN_1, GPIO_PIN_1);
 
    
  //SysTicの設定
  //カウンタに8000000を設定
  ROM_SysTickPeriodSet(8000000);
 
  
  //カウント開始
  ROM_SysTickEnable();


   while(1)
    {
      //制御レジスタを読みだす
      ulLoop = NVIC_ST_CTRL_R;
      
      //カウントフラグが1なら500m秒経過
      if ( ( ulLoop & 0x00010000 ) != 0 ) 
      {
          
          //LEDデータを反転 
          ledData = ~ledData;
 
          //ポートFの1,2ビットのみ反転データを書き込み
          ROM_GPIOPinWrite(GPIO_PORTF_BASE, GPIO_PIN_2|GPIO_PIN_1, ledData);
      }
    }
}
