// PF1,PF2 に接続したLED(R,B)を500m秒ごとに反転する

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


//ポートFのデータレジスタ改めてアドレスの数値のみで定義する
#define usr_GPIO_PORTF_DATA_BITS_R 0x40025000

//メイン関数
int main(void)
{
  //PB0のみを変化させるためのマスクデータ
  unsigned long maskBit =0x00000006;
  //LED出力用データ
  unsigned char ledData =0x02;
  //レジスタ読み出し用
  unsigned long ulLoop = 0;

 
  //ポートFへのクロック供給
  //この設定がないとポートレジスタにアクセスできません（例外処理が発生する）
  SYSCTL_RCGCGPIO_R =  0x00000020;

 //方向レジスタの設定（1=出力）
  GPIO_PORTF_DIR_R = 0x06;
  
  //データレジスタの1,2ビット目のみをLに設定（LEDはHアクティブ）
 (*((volatile unsigned long *)(usr_GPIO_PORTF_DATA_BITS_R + (maskBit<<2)))) = 0x00;
    
  //デジタル端子イネーブルレジスタの設定（1=イネーブル）
  //この設定で、端子からLレベルが出力され、LEDが点灯する
  GPIO_PORTF_DEN_R = 0x06;
 
    
 //SysTickの設定
 //リロードレジスタにカウント値を設定
 //ソースクロックが16MHzなので16000000×0.5=800000で500m秒計測
 NVIC_ST_RELOAD_R = 8000000;
 
 //カウンタをクリア
 NVIC_ST_CURRENT_R = 0;
 
 //制御レジスタの設定 CLKSOURCE=1 TICKINIT=0 ENABLE=1 
 //この命令でSysTicのカウントが開始する
 //初期設定の最後におくこと
 NVIC_ST_CTRL_R = 0x00000005;
   
   while(1)
    {
      //制御レジスタを読みだす
      ulLoop = NVIC_ST_CTRL_R;
      
      //カウントフラグが1なら500m秒経過
      if ( ( ulLoop & 0x00010000 ) != 0 ) 
      {
          
         //LEDデータを反転 
         ledData = ~ledData;
 
         //ポートFの1,2ビットのみ反転データを書き込み
         (*((volatile unsigned long *)(usr_GPIO_PORTF_DATA_BITS_R + (maskBit<<2)))) = ledData;
     
      }

    }
}
