LPCXpresso IDEのRed State Machine file generatorを使ってみた
2013年12月3日
LPC8xx(LPC810/LPC811/LPC812)に搭載されているSCT(State Configurable Timer)は、このシリーズの石の目玉となる機能のようで、通常のPWMとして使えるだけでなく、多彩なコントロールの仕方が可能なタイマーらしい。User's Manualに次のような機能が例としてあげられている。
・ 複数のPWMを制御
・ dead-timeコントロール付きのPWM
・ reset-capability付きのPWM
・ その他、今までのPWMでは出来なかった設定
一度設定すれば、CPUからの制御無しに、それ自身で動作を続ける。また、割り込みを掛けることも可能である。
一つの石あたり、32ビットのタイマーが一つ用意されている。また、2つの16ビットのタイマーとして使うことも出来るようだ。クロックは、内部及び外部からの両方が使用可能。基本的に、up-counterであるが、up/downを交互に行なうモードもあるらしい。
SCTには、"state"という概念があって、これで色々制御しているようである。次のイベントが用意されている。
・ counter match condition
・ input/output condition
・ 上記2つのコンビネーション(指定のstateにおいて)
・ count direction
個々のイベントでは、次のことが制御可能だ。
・ outputs
・ interrupts
・ states
ただし、
・ "Match register 0"というイベントは、automatic limitとして利用可能。
・ up/downカウンターとして使用している場合、そのdirectionごとにイベント設定が可能。
・ Matchイベントは、特定のイベントが起こるまで止めておくことが可能。
それぞれの設定は、次の個数だけ設けることが出来る。
・ 4 inputs
・ 4 outputs
・ 5 match/capture registers
・ 6 events
・ 2 states
このSCTという機能は、多種多彩な制御が出来る一方で、その複雑さ故に設定の方法は難易度が高くなっている。これを容易に行なう為のツールとして、LPCXpresso IDE内に、"Red State Machine file generator"という、GUIによる設定ツールが設けられているので、試してみた。
SCT用にCookbookとチュートリアルが用意されているので、それを参考に、基本となるSCT_blinky_irqというサンプルプログラムと同じコードを作成することを試みた。これは、一定周期ごとに割り込みを掛けるためのコードである。
最初、Cookbookを読んだだけではRed Stateの使い方が全く分からなかったが、support.code-red-tech.comで用意されているPDFファイルを元に、試行錯誤で操作してみた。結果として、ソースコードを直接編集することでSCTの使い方をマスターするよりも、このGUIの使い方をマスターする方が速かったように感じる。以下、自分用のメモとして、このツールの使い方をまとめておく。なお、使用したLPCXpressoのバージョンは、6.1.0である。
まず、LPCXpressoを起動し、SCTを利用したいworkspaceにおいて、"File->New->Other"を選択する。
ウィザードで、"Red State Machine file generator"を選択する。
適当なファイル名を付ける(ここでは、rstestとした)。
"Choose Target"ボタンから、利用する石を選択する(ここでは、LPC810)。
↓
↓
最後に"Finish"を押すと、このような画面になり、"rstest.rsm"がソースに追加された。
中央部分は下のようになるが、これらのうち"U_ALWAYS"は使用しないので、右クリックから"Delete"を選択して、削除する。
ここから先は、"Input"をシグナルとして選択し、そのシグナルを受けたときにどの様なアクションを"Output"に出力するかという概念で、設定してゆく。
まず、Inputから。ここでは、タイマーのカウント値がある値(maxcount)になった際にイベントが起こるように設定する。"Inputs for State Machine"タブの"+"アイコン(Add Input)をクリックすると、"input1"という名で項目が追加される。"a|"アイコン(Rename)をクリックした後に"maxcount"と打ち込む。右の"Source"の欄を、カウンターの上限値(ここでは1000)に設定する。"Type"の欄は、"const int"のままにしておく。
↓
↓
つぎに、カウンター値がこの値にマッチすることを入力として定義する。"+"アイコンをクリックして新規の項目を作成し、"Type"の欄を"Match Unified"に設定し、"Source"に"maxcount"を設定する。
↓
つぎに、このMATCH0入力をシグナルとして定義する。"Signals"タブにおいて、"+"アイコンを押して新規の項目を設定し、名前を"MATCH0"に変更する。下の"(none):change to click"の所を右クリックし、"Input->MATCH0"を選択する。
↓
↓
中央の"rstest.rsm"タブの少し左、"Transition"を選択する。中央の画面中でマウスを操作し、U_ENTRYから出た矢印がU_ENTRYに戻るように、設定する。
↓
"(no signal)/(no action)"と赤で表示されたところを右クリックし、"Set Signal->MATCH0"を選択する。
↓
ここからは、Outputの処理。"Outputs for State Machine"タブにおいて、一番下までスクロールし、"IRQname"を"SCT_IRQ"に変更する。
中央画面で、"MATCH0/(no action)"となっているところ、右クリックで"Add action->CALL->Limit unified counter"を選択する。
"Action list"タブに"action1"が追加されているので、名前を"event0"に変更する。
↓
"Action list"タブの下の方を右クリックして、"Call->SCT_IRQ"を選択する。
これで、中央に表示される漫画が、CookbookのSCT_blinky_irqでのそれと同じになった。
"State Table"タブにある"Generate Code"をクリックすると、sct_fsm.smd/sct_fsm.c/sct_fsm.h/sct_user.hの4つのファイルが作成された。
↓
sct_fsm.cの内容はCookbookのSCT_blinky_irqの項で紹介されている物と同じになったので、上記で述べた操作方法は正しかったと思われる。割り込みについては、別途void SCT_IRQHandler (void) { }を記述すればよいようだ。
・ 複数のPWMを制御
・ dead-timeコントロール付きのPWM
・ reset-capability付きのPWM
・ その他、今までのPWMでは出来なかった設定
一度設定すれば、CPUからの制御無しに、それ自身で動作を続ける。また、割り込みを掛けることも可能である。
一つの石あたり、32ビットのタイマーが一つ用意されている。また、2つの16ビットのタイマーとして使うことも出来るようだ。クロックは、内部及び外部からの両方が使用可能。基本的に、up-counterであるが、up/downを交互に行なうモードもあるらしい。
SCTには、"state"という概念があって、これで色々制御しているようである。次のイベントが用意されている。
・ counter match condition
・ input/output condition
・ 上記2つのコンビネーション(指定のstateにおいて)
・ count direction
個々のイベントでは、次のことが制御可能だ。
・ outputs
・ interrupts
・ states
ただし、
・ "Match register 0"というイベントは、automatic limitとして利用可能。
・ up/downカウンターとして使用している場合、そのdirectionごとにイベント設定が可能。
・ Matchイベントは、特定のイベントが起こるまで止めておくことが可能。
それぞれの設定は、次の個数だけ設けることが出来る。
・ 4 inputs
・ 4 outputs
・ 5 match/capture registers
・ 6 events
・ 2 states
このSCTという機能は、多種多彩な制御が出来る一方で、その複雑さ故に設定の方法は難易度が高くなっている。これを容易に行なう為のツールとして、LPCXpresso IDE内に、"Red State Machine file generator"という、GUIによる設定ツールが設けられているので、試してみた。
SCT用にCookbookとチュートリアルが用意されているので、それを参考に、基本となるSCT_blinky_irqというサンプルプログラムと同じコードを作成することを試みた。これは、一定周期ごとに割り込みを掛けるためのコードである。
最初、Cookbookを読んだだけではRed Stateの使い方が全く分からなかったが、support.code-red-tech.comで用意されているPDFファイルを元に、試行錯誤で操作してみた。結果として、ソースコードを直接編集することでSCTの使い方をマスターするよりも、このGUIの使い方をマスターする方が速かったように感じる。以下、自分用のメモとして、このツールの使い方をまとめておく。なお、使用したLPCXpressoのバージョンは、6.1.0である。
まず、LPCXpressoを起動し、SCTを利用したいworkspaceにおいて、"File->New->Other"を選択する。
ウィザードで、"Red State Machine file generator"を選択する。
適当なファイル名を付ける(ここでは、rstestとした)。
"Choose Target"ボタンから、利用する石を選択する(ここでは、LPC810)。
↓
↓
最後に"Finish"を押すと、このような画面になり、"rstest.rsm"がソースに追加された。
中央部分は下のようになるが、これらのうち"U_ALWAYS"は使用しないので、右クリックから"Delete"を選択して、削除する。
ここから先は、"Input"をシグナルとして選択し、そのシグナルを受けたときにどの様なアクションを"Output"に出力するかという概念で、設定してゆく。
まず、Inputから。ここでは、タイマーのカウント値がある値(maxcount)になった際にイベントが起こるように設定する。"Inputs for State Machine"タブの"+"アイコン(Add Input)をクリックすると、"input1"という名で項目が追加される。"a|"アイコン(Rename)をクリックした後に"maxcount"と打ち込む。右の"Source"の欄を、カウンターの上限値(ここでは1000)に設定する。"Type"の欄は、"const int"のままにしておく。
↓
↓
つぎに、カウンター値がこの値にマッチすることを入力として定義する。"+"アイコンをクリックして新規の項目を作成し、"Type"の欄を"Match Unified"に設定し、"Source"に"maxcount"を設定する。
↓
つぎに、このMATCH0入力をシグナルとして定義する。"Signals"タブにおいて、"+"アイコンを押して新規の項目を設定し、名前を"MATCH0"に変更する。下の"(none):change to click"の所を右クリックし、"Input->MATCH0"を選択する。
↓
↓
中央の"rstest.rsm"タブの少し左、"Transition"を選択する。中央の画面中でマウスを操作し、U_ENTRYから出た矢印がU_ENTRYに戻るように、設定する。
↓
"(no signal)/(no action)"と赤で表示されたところを右クリックし、"Set Signal->MATCH0"を選択する。
↓
ここからは、Outputの処理。"Outputs for State Machine"タブにおいて、一番下までスクロールし、"IRQname"を"SCT_IRQ"に変更する。
中央画面で、"MATCH0/(no action)"となっているところ、右クリックで"Add action->CALL->Limit unified counter"を選択する。
"Action list"タブに"action1"が追加されているので、名前を"event0"に変更する。
↓
"Action list"タブの下の方を右クリックして、"Call->SCT_IRQ"を選択する。
これで、中央に表示される漫画が、CookbookのSCT_blinky_irqでのそれと同じになった。
"State Table"タブにある"Generate Code"をクリックすると、sct_fsm.smd/sct_fsm.c/sct_fsm.h/sct_user.hの4つのファイルが作成された。
↓
sct_fsm.cの内容はCookbookのSCT_blinky_irqの項で紹介されている物と同じになったので、上記で述べた操作方法は正しかったと思われる。割り込みについては、別途void SCT_IRQHandler (void) { }を記述すればよいようだ。