LPC

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"を選択する。
2013-12-03-1.png

ウィザードで、"Red State Machine file generator"を選択する。
>div style="text-align: center"<>/div<

適当なファイル名を付ける(ここでは、rstestとした)。
2013-12-03-3.png

"Choose Target"ボタンから、利用する石を選択する(ここでは、LPC810)。
2013-12-03-4.png

2013-12-03-5.png

2013-12-03-6.png

最後に"Finish"を押すと、このような画面になり、"rstest.rsm"がソースに追加された。

中央部分は下のようになるが、これらのうち"U_ALWAYS"は使用しないので、右クリックから"Delete"を選択して、削除する。
2013-12-03-8.png

ここから先は、"Input"をシグナルとして選択し、そのシグナルを受けたときにどの様なアクションを"Output"に出力するかという概念で、設定してゆく。

まず、Inputから。ここでは、タイマーのカウント値がある値(maxcount)になった際にイベントが起こるように設定する。"Inputs for State Machine"タブの"+"アイコン(Add Input)をクリックすると、"input1"という名で項目が追加される。"a|"アイコン(Rename)をクリックした後に"maxcount"と打ち込む。右の"Source"の欄を、カウンターの上限値(ここでは1000)に設定する。"Type"の欄は、"const int"のままにしておく。
2013-12-03-9.png

2013-12-03-10.png

2013-12-03-11.png

つぎに、カウンター値がこの値にマッチすることを入力として定義する。"+"アイコンをクリックして新規の項目を作成し、"Type"の欄を"Match Unified"に設定し、"Source"に"maxcount"を設定する。
2013-12-03-12.png

2013-12-03-13.png

つぎに、このMATCH0入力をシグナルとして定義する。"Signals"タブにおいて、"+"アイコンを押して新規の項目を設定し、名前を"MATCH0"に変更する。下の"(none):change to click"の所を右クリックし、"Input->MATCH0"を選択する。
>div style="text-align: center"<>/div<

2013-12-03-15.png

2013-12-03-16.png

中央の"rstest.rsm"タブの少し左、"Transition"を選択する。中央の画面中でマウスを操作し、U_ENTRYから出た矢印がU_ENTRYに戻るように、設定する。
>div style="text-align: center"<>/div<

2013-12-03-18.png

"(no signal)/(no action)"と赤で表示されたところを右クリックし、"Set Signal->MATCH0"を選択する。
2013-12-03-19.png

2013-12-03-20.png

ここからは、Outputの処理。"Outputs for State Machine"タブにおいて、一番下までスクロールし、"IRQname"を"SCT_IRQ"に変更する。
2013-12-03-21.png
2013-12-03-22.png

中央画面で、"MATCH0/(no action)"となっているところ、右クリックで"Add action->CALL->Limit unified counter"を選択する。
2013-12-03-23.png

"Action list"タブに"action1"が追加されているので、名前を"event0"に変更する。
2013-12-03-24.png

2013-12-03-25.png

"Action list"タブの下の方を右クリックして、"Call->SCT_IRQ"を選択する。
2013-12-03-26.png

これで、中央に表示される漫画が、CookbookのSCT_blinky_irqでのそれと同じになった。
2013-12-03-27.png

"State Table"タブにある"Generate Code"をクリックすると、sct_fsm.smd/sct_fsm.c/sct_fsm.h/sct_user.hの4つのファイルが作成された。
2013-12-03-28.png

2013-12-03-29.png

sct_fsm.cの内容はCookbookのSCT_blinky_irqの項で紹介されている物と同じになったので、上記で述べた操作方法は正しかったと思われる。割り込みについては、別途void SCT_IRQHandler (void) { }を記述すればよいようだ。

コメント

コメントはありません

コメント送信