しばっち電機
-

7.チュートリアルに沿って試してみよう (UART ソフトコンソールフロー)

7-1. SoftConsole Standalone Flow Tutorial を見てみよう

今回は実際にSoftConsoleを使用して、SmartFusionの構成と、ARMのCプログラミングを行ってみます。

今回の最も注目すべき点は
「ARMと装備されているハードIPを使用するだけで、FPGA部を全く使用しない場合はSoftConsoleとFrashProだけで設計、実行できる。つまりLiberoIDEの出番は無し。」
ということです。
FPGA部は使わないで、IP選んでARMで動作させたいとかいうときは今回の手順の応用で行けます。多分 (^_^;);。

チュートリアルとデータのZIPをダウンロードしておきます。
http://www.actel.com/products/hardware/devkits_boards/smartfusion_eval.aspx にある
Using UART with SmartFusion: SoftConsole Standalone Flow Tutorial のSmartFusion_UART_SW_flow_tutorial_UG.pdf とDesign Files (ZIP, 3.9 MB, 2/11) SmartFusion_UART_SW_flow_tutorial_DF.zip をダウンロードしてきます。
今回はZIPファイルの中身は全部使わないで必要なところだけ利用します。(ZIPの中には全部入っているので単なるデモになっちゃうので。)
ZIPをとりあえず解凍しておきます。
C:\Actelprj\SmartFusion に置いて解凍すると、SmartFusion_UART_SW_flow_tutorial_DFというフォルダができて、さらにSoftConsoleの下に何個かフォルダができますね。


7-2. SoftConsole Standalone Flow Tutorial に沿って構築してみよう

手順としては
  1. Softconsoleでプロジェクト作成
  2. SmartFusion MSS 構成
  3. SoftconsoleでARMのCプログラミング
  4. FrashProでSmartFusionの構成を転送
  5. デバッガーで実行確認
といった感じです。


7-2-1. SoftConsoleでプロジェクト作成

スタート->すべてのプログラム->Microsemi SoftConsole v3.3->Micorsemi Softconsele IDE v3.3.0.14 を選択します。(2011/06/12現在、バージョンは変わる可能性があるので都度読み替えてください)
ActelでなくMicorsemiであることに注意します。
Workspace Launcherが開きました。チュートリアルにあるとおり、WorkspaceにC:\Actelprj\SmartFusion/SoftConsole といれてOKをクリックします。
   SmartFusion Workspace Launcher

SoftConsoleが立ち上がりました。
   SmartFusion SoftConsole

次にツールバーの File->New->C projectを選択します。
C Projectが開くので Project nameに polled_uart_sc を入力します。Project type:がEmpty Project、Toolchains:がMirocsemi Cortex-M3 Tools になっていることを確認して、Nextをクリックします。
   SmartFusion C Project

DebugとReleaseにチェックが付いていることを確認してFinishを押します。
   SmartFusion Debug Release


SoftConsoleの左のProcectExplorerにpolled_uart_scという名前のCと付いたフォルダアイコンができましたね。
これをクリック(シングルクリックで良い)して、有効になった状態にしておきます。(重要。選択されていないと次のMSS Configuratorが選択できないです)


7-2-2. SnartFusion MSS 構成

次にツールバーより Run->RunSmartFusion MSS Configuratorを選択します。
これにより今回どのIPを使うかとかそのIPの動作を設定します。
Create a new project が選択されていること、CoreにSmartFusion Microsontoroller Subsystem(MSS) Version2.4.1.05 となっていること、を確認し、Nextをクリックします。
   SmartFusion MSS configurator

FamilyがSmartFusion、DieがA2F200M3F、Packageが484FBGAになっていることを確認します。メガメガボードはこのタイプのデバイスが載っているのでこれ以外を選択すると動作しないので注意して確認します。OKであればNextをクリックです。
   SmartFusion Device

ここで、FPGAの開発言語を選択する画面に来ます。今回はFPGA部の開発は行わないのでどっちでも良いのですが、Verilogを選択しておきます。
もし、FPGA部の開発がある場合であってもVerilogをオススメします。お仕事でASICとかFPGAの開発をしていますが、案件ではVerilogの方が多い事、開発効率がVerilogの方が良い事等の理由からです。業務上VHDLしかダメや、とかVHDLで書かんと単位がもらえんとか、おばあちゃんの遺言でVHDLとか、で無い限りVerilogで行きます。
って、話しがそれたのでもどって、次にいきます。Verilogを選択してFinishをクリックです。
   SmartFusion Verilog VHDL

SmartDesign MSS Configurator - polled_uart_sc_MSS で、Canvas の画面が開きましたね。
折角なのでどのようなブロックがあるかさらっとみておきます。左上から
  • Clock Management: クロック制御、PLLの設定(逓倍、分周)とか、どのクロック使うとかいった設定を行って、所望のクロックを作ります。
  • Reset Management: リセット制御。動作が始まる前にデバイス全体に初期化をかける信号を生成
  • Interruput Management: 割り込み制御。各ブロックやFPGA部からの割り込みを制御する部分
  • MSS I/O:MSSへ入出力端子を設定する部分
  • CoretexM3:いわずとしれたARM CoretexM3ですね。
  • AHB Bus Matrix: ARM AMBAバスです。規格書はARMのホームページからダウンロードできます。
  • ESRAM:スタティックメモリ、データを貯めとくところですね。
  • ENVM:不揮発メモリかな。プログラムを置いておいたり。
  • External Memory Controller: SmartFusionのデバイス外部にメモリを置くときのコントローラ
  • ACE: アナログ部の制御やら計算やら行う部分ですね。ここを使うとA/DやらD/Aやらの制御ができます。
  • Fablic Interface:FPGA部との橋渡し部分。FPGA部でいろいろ作り始めるとお世話になるブロックですね。
  • PDMA:ダイレクトメモリアクセス。ARMのCPUを介さずにAHBバスを使って直接データをやり取りする制御を行う部分。
  • TIMER:いわゆるタイマー、時間を図ります。
  • WATCHDOG:タイマーと良く似てますが、どちらかというと異常監視とかに良く使いますね。
  • MAC:EtherNetのコントローラ部。
  • UART:非同期シリアル通信部:メガメガボードではUSBのI/Fデバイスにつながっていてシリアルでの通信を行います。PCにもRS232Cってついてるでしょ。
  • SPI:シリアルペリフェラルインターフェース:UARTよりずっと簡単なシリアルI/F、良く小さいEPROMとかの転送に使われてますね。
  • I2C:低速のシリアルI/F、2線で送受信できるので帯域のいらない、CPUからのレジスタ設定とかによく使われてます。Philipsから規格書はダウンロードできます。
  • EPROM:書き換え可能不揮発性メモリ。これは内部なのかな外部なのかな。ちょっと未調査です。
  • RTC:リアルタイムクロック。時計ですね。
(ざっとマニュアルをナナメ読みして書いただけなので、もし間違っていたら指摘してくださいませませ。)
こうやってみてみると結構いろいろなものが装備されていますね。

それぞれのブロックに色が付いていますが
  • 青色:ハード的な設定があるブロック
  • 橙色:ソフト的に設定をするブロック
  • 緑色:ハード的にもソフト的にも設定のいらないブロック
  • 灰色:使われないブロック
です。
青色のブロックの右したにはスパナみたいなマークとチェックボックスが付いていますが、スパナみたいなマークは設定ができることを示し、チェックボックスは使うか使わないかを設定できます。
折角載っているんだから全部使うでいいじゃん。って話もありますが、使わないってすることにより電力を抑えることができます(そうだよね)。世の中エコですよ、エコ。
   SmartFusion IP Select


で、今回使用しないブロックをディゼイブルにします。使わないのは (ACE), MAC, EMC, Fabric Interface, UART_1, SPI_0, SPI_1, I2C_0, and I2C_1.です。これらのチェックを外します。チェックできるブロックで残ったのはUART_0とWatchDocだけですね。
   SmartFusion MSS select result


さて、各ブロックの設定をしていきます。まずはクロックです。 Clock Management ブロックをダブルクリックしてみます。


・CLKAがOn-Chip RC Oscillator
・MSS clock sourceがPLLの出力(VCOの出力)。PLLという緑の箱の右横に横になった茶色い台形がありますね。入力を3箇所から選べますが、真ん中を選択します。デフォルトでは上が選ばれています。
・MSS clock frequencyは80MHz。先程の台形の右横ちょい下に MHz の入力を入れるテキストエリアがあります。ここに 80.000 と入力します。デフォルトでは100MHzになっています。
OKをクリックして次へ進みます。
   SmartFusion Clock


次にFirmwareタブを選択します。なにやら表みたいなのが出てきましたね。
この表は今回使用するファームウェア(ハードとソフトの橋渡しプログラムのようなものと思ってください)を設定します。
チェックするのは MSS_UART_Driver_0、MSS_Watchdog_Driver_0、Smart_Fusion_CMSIS_PAL_0です。それ以外のはチェックをはずします。
で、CMSIS_PALって何?と思っちゃいますが、SmartFusion Cortex Microcontroller Software Interface Standard - Peripheral Access Layer (CMSIS-PAL).ということで内部のCoretexM3を制御する部分のようです。詳細はSmart_Fusion_CMSIS_PAL_0行を左クリックで選択しておいてから、右クリックするとShow Details...とあるのでそれをクリックすると説明を見ることができます。またOpen Documentationで SmartFusion_CMSIS-PAL_RN.pdfを開き詳細をみることもできます。
またConfigureで、今回使用するSoftConsoleを選択しておきます。(今回はKeilとかIARを選択してはダメです。)

選び終わったら 左上の File->Save polled_uart_sc_MSS でセーブします。(必ずセーブすることを忘れないように!)
   SmartFusion Firmware

次にDesign->Generateで回路生成します。超重要。これを忘れると後々、何で動かんのん?と悩むことになります。
数分かかります。(途中で応答なしになっちゃったりしますけどしばしガマンです。
成功すると、ログウィンドウに ネットリスト、NVMプログラミングファイルが作成されたことが表示されます。
メモリマップを見るには Design->Show Memory Map/Data Sheet を選択すると、入出力部のアドレスが判ります。
注:Logに Error:Unable to create directory:. とか出ますが、問題なく生成されているようです。
Info: Design "polled_uart_sc_MSS" was successfully generated. と表示されればOKです。
作成終了したら、File->ExitでSmartDesign MSS Configuratorを抜けます。
   SmartFusion Generate

ソフトコンソールで polled_uart_scの左の白三角をクリックすると階層下に、CMSISとかdriveとかpolled_uart_sc_MSSとかpolled_uart_sc_MSS_tmp_cmsis_svd.xmlとかができていますね。
   SmartFusion Result


7-2-3. SnartFusion Cプログラム作成

さて、ここからいよいよCのプログラミングをします。

ソフトコンソールで File->New->Source File を選択します。Source Folder:にはpolled_uart_scとすでに入っているので、Source File:に main.c と入力します。
そしてFinishをクリックします。
   SmartFusion C program setting


するとソフトコンソールに中央のペーンに main.c というタブがヘッダー部分数行入力された状態で開きます。
その行は消しよいので、SmartFusion_UART_SW_flow_tutorial_UG.pdf の P17 にあるCプログラムを入力します。
手で打って行ってもよいですし、ざくっと選択して、コピー、ペーストしても良いです。短いですし、ARMのCを覚えるという意味でも手入力した方が良いかもしれません。
では、どうぞ...。
   :
   :
   :
えー、入りましたでしょうか。以下のような感じですね。
File->Saveで保存しておきます。

折角なのでプログラムをざっと見ておくと
  • #include行:ウオッチドッグとUARTのヘッダファイルの読み込み
  • #define行:アクテルロゴの宣言
  • メイン文内 const uint8_t greeting[]行:UARTに出力するための文字列宣言
  • MSS_WD_disable()行:ウオッチドッグを使わないので止めておく。注:MSS Configuratorのバージョンが上がって、チュートリアルのときはWatichDocはOFFにできなかったのが、現在できるようになっているようです。ですので、Configuratorでウオッチドッグを選択せず、この行も書かないということでも大丈夫だと思います。
  • MSS_UART_init行:UARTの初期化、57600Bps、8bit、ノンパリティ、ストップビット1 に設定
  • MSS_UART_polled_tx_string行:アクテルのロゴをUARTから送信
  • MSS_UART_polled_tx行:グリーティングメッセージをUARTから出力
  • while(1){}return0;行:ループし続ける
つまり、このプログラムはActelのロゴとグリーティングメッセージをUARTからおくるだけの動作ですね。
polled_tx_stringとpolled_txの違いは複数行0が来るまで送るか、文字数指定で送るかの違いのようです。
   SmartFusion C program


さてここからちょっとライブラリの設定になります。ちょっとややこしいので間違えないように。
この設定ってSmartFusionでARM Cプログラム使うときの おまじないみたいなもんですね。
Project Explorer の polled_uart_scを左クリックで選択したあと右クリックでPropertiesを選びます。
左のペーンからC/C++ buildのSettings をクリックします。右ペーンにSettingsが開くので、Tool SettingタブのGNU C LinkerのMiscellaneousを選択します。結構深いところにありますね。
ここの Linker flags の所に、-T ../CMSIS/startup_gcc/debug-in-actel-smartfusion-esram.ld を入力します。
これはSmartFusionのARM用ライブラリのようです。なのでSmartFusionでARMソフト開発を行うときには必ずここの設定が必要になります。
1つのプロジェクトでは最初に1回設定すれば良いですが、新しいプロジェクトのときはやはりこの設定が必要です。毎度のことながら忘れやすいので注意します。(実際、これ忘れてて、コンパイルできないなぁ、なんでだーってなりました(^-^;); )
設定し終わったら Apply->OK で閉じます。
   SmartFusion Library


さて、いよいよコンパイルですよ〜、ドキドキしますね。
Project->Cleanを選択します。
Clean all project になっているのを確認して、OKをクリック!
   SmartFusion Compile

これぐらいであれば数秒〜数十秒で完了します。
Consoleタブを選ぶとコンパイル結果がわかります。
スクロールさせてみてエラーがなければOKです。もしエラーがあればその行番号が示されているはずなので、プログラムの修正をします。Saveも忘れずに。再度Project->Cleanを行います。エラーが無くなって最後まで行けば(GNU Listing Generatorの表示)OKです。
   SmartFusion Compile result


7-2-4. FlashProで構成とプログラムの転送

さて、プログラムもコンパイルできたところで、実際にボードに転送してみます。

まず、書き込みツールであるFlashProをソフトコンソールから呼び出すための設定をします。
  1. ツールバーから、 Run -> External Tools -> External Tools Configuration を選択します。
  2. 左のペーンのProgramをダブルクリックします。New_configrationが開きます。ここでFlashProを設定します。
  3. Name: の所がNew_configurationになっているので、 FlashPro と書き換えます。
  4. Location: のところでBrowse File System をクリックします。ダイアグが開きます。 C:\Actel\Libero_v9.1\Designer\bin のディレクトリが開いているはずです。ディレクトリが違っていたら移動します。ズーッとスクロールして、flashpro.exe を探してクリック、開く で完了です。Location: のところに今選択したパスと実行ファイル名が入っていますね。
  5. Apply、Closeで一旦閉じます
   SmartFusion FlashPro setting

次に、メガメガボードの設定です。今までと変えていなければそのままでOKのはずです。
念のために設定は
  • JP10:1と2接続
  • JP7:1と2接続
  • J6:1と2接続
  • JP6:2と3接続
OKであれば
  • J13:USBでPCと接続
  • J14:USBでPCと接続
です。毎度目が痛いですね。(笑)


さて、FlashProを起動してみます。
ツールバーから、 Run -> External Tools -> External Tools Configuration を選択します。左のペーンに先ほど設定した Program -> FlashPro がみえています。
FlashProをクリックしてから、Runをクリックします。FlashProが立ち上がります。Updatesを確認しているようで、有効になるまで少し時間がかかります。
   SmartFusion FlashPro

New Project アイコンボタンをクリックします。
Project Name: に polled_uart_fp と入力します。
ProjectLocation: で Browse をクリックするとダイアログが開きます。そこから、C:\Actelprj\SmartFusion\SoftConsole を選びOKをクリックします。自動的に末尾にpolled_uart_fpが付加されて入力されます。
OK をクリックして閉じます。
   SmartFusion FrashPro project

すこしして下のLogWindowに Created new project 'C:\Actelprj\SmartFusion\SoftConsole\polled_uart_fp\polled_uart_fp.pro' と表示されます。
次に Configure Devices をクリックします。 画面の真ん中にウィンドが開きます。
ここで、Programming file にある、Create ボタンをクリックします。
   SmartFusion FlashPro Configure Device

CreatePDBダイアログが開きます。ここで使用するデバイスとか、プログラムの位置を指定します。
Device:A2F200M3F をプルダウンから選択
Package:484FBGA をプルダウンから選択
Name:polled_uart_fp (すでに入力されているはずです)
Location:C:\Actelprj\SmartFusion\SoftConsole\polled_uart_fp (すでに入力されているはずです)
OKをクリック
   SmartFusion Create PDB

つづいて、FlashPoint-polled_uart_fp.pdb が開きます。
今回必要なのはEmbedded Flash Memory の所だけなので、そこのチェックボックスにチェックを入れます。
Import が有効になるのでクリックします。開いた場所には残念ながら目的のファイルはないのでディレクトリを変えます。
C:\Actelprj\SmartFusion\SoftConsole\polled_uart_sc\polled_uart_sc_MSS\component\work\polled_uart_sc_MSS\MSS_ENVM_0 にMSS_ENVM_0.efc というファイルが目的のファイルです。クリックして、Importをクリックします。しかし、深いところにありますねぇ。
Save PDBをクリックして閉じます。。
   SmartFusion FlashPoint

先程の Programming file になにやらゾロゾロ表示されましたね。
Created new project 'C:\Actelprj\SmartFusion\SoftConsole\polled_uart_fp\polled_uart_fp.pro'
PDB file 'C:\Actelprj\SmartFusion\SoftConsole\polled_uart_fp\polled_uart_fp.pdb' has been loaded successfully.
となっていればOKです。
View Programmers アイコンボタンをクリックしてみます。
まんなかにProgrammer List Windowが開きました。ここでProgrammerNameとかProgammerTypeとかが表示されます。もし表示されないようならメガメガボードを接続し忘れているか、うまく認識できていません。正しく接続、認識させて、Refresh/Rescan for Programmers をクリックすると表示されます。
   SmartFusion View Programmers

いよいよプログラミングです。
PROGRAM アイコンボタンをクリックします。
数秒後、
programmer '73018' : Finished: Sat Jul 02 23:05:45 2011 (Elapsed time 00:00:01)
programmer '73018' : Executing action PROGRAM PASSED.
o - o - o - o - o - o
のように表示され、Programmer List Windowの Programmer Status に RUN PASSED と緑色の文字が表示されていれば成功です。
これでFlashProは閉じてよいです。File -> Exit で閉じます。Save it ? と聞かれるので はいを選びます。


7-2-5. デバッガーで実行確認

さて、UARTの動作をみるためにTeraTermを起動、設定します。
すでにデモを行っている場合は設定->シリアルポートで、ボーレートが正しく(57600)なっていることが確認できればOKです。
   SmartFusion TeraTerm

ちょっとメガメガボードのリセットボタンを押してみます。なにやらザラザラと意味不明な文字が表示されます。「うわ!壊れてる」とか思わないように。まだARMのソフトを動作させていないのでまだUARTの設定とか動作ができていないだけです。

さ、いよいよARMのプログラムを走らせますよ。
SoftConsoleのツールバーから Run -> Debug Configurations を選択します。
左のペーンにいろいろ表示されていますが、 Microsemi Cortex-M3 RAM Target をダブルクリックします。
Name:polled_uart_sc_Debug
Project:polled_uart_sc
C/C++Application Debug\polled_uart_sc
になっているのを確認してDebugをクリックします。
   SmartFusion Debug


Softconsoleにいろいろウィンドが開きます。また、メガメガボードにプログラムがロードされます。(LEDがキラキラするので判りますね)
次にDebug環境を開ますか(超意訳です。(^^;);)と聞かれるのでYesを選びます。
   SmartFusion perspective

さらにデバッグ用の各ウィンドが開きます。
   SmartFusion Debug window

Resumeボタン(Debug の右側にある黄色い縦長四角と緑の横三角)かF8キーを押します。
画面にActelロゴと、Welcome to SmartFusion - The intelligent mixed-signal FPGA と表示されましたか。
また、メガメガボードの黄色のLEDがピカピカ点滅し動作していることが判ります。
えっと、これだけ?。ハイ、これだけです。 あ、そこそこ、暴れないように。(笑)
   SmartFusion run

一時停止して、レジスタ値とかを見てみます。
Suspendボタン(Debug の横の黄色縦長四角2本の一時停止ボタン)かRun -> Suspend で止めます。
ボードの黄色LEDの点滅も止まります。
右上のペーンのRegistersをクリックしてみます。Mainをクリックすると現在のレジスタ値が表示されます。
また、Varialbesをクリックすると変数の値をみることができます。右上の最大化をクリックすると画面一杯れ見れます。
   SmartFusion register

Window -> Show View -> Disassenbly で逆アセンブルリストが表示されます。その他 Show View から選択するとそのウィンドウに飛べます。

また Run -> Step Into (F5) や Step Over (F6) を選んでみます。1ステップづつ実行できます。今回のプログラムではwhileループの中に入っているので見かけ上なにも起こらないですね。ちょっと残念。
ちなみに、Step Into は関数が出てきたらその中に入って実行していきます。Step Overは関数が出てきたらその関数を実行して次の行に行きます。(関数の中は一気に実行)

一時停止して、Instruction Steping Mode i→ボタン を押してから、ステップ実行すると、アセンブラのコード毎に実行できます。

一時停止状態から再度動作させるにはResumeをクリックします。(もしくはF8)

ブレークポイントをかけるには、main.c のウィンドでブレークポイントを設定したい行を選択してツールバーから Run -> Toggle Brakepoint で設定できます。実行していてその行に来ると一時停止します。Resumeで再実行できます。

最初から走らせたい時。
チュートリアルに書いてなくていろいろ試してみたのですが、どうもDebugペーンで 1 main()の行を選び右クリックでTerminate and Relaunchで良いようです。
またはTerminateで止めてしまって、再度走らせたい時。
Debugペーンで <terminated,ext value:0>〜の行を選び右クリックで Relaunchで良いようです。

ブレークをかけてみたり、main.cのペーンで行を選択して、右クリックするとメニューが出るのでいろいろ試してみます。
わけわかんなくなっても、Terminate(Debug 横の赤い四角ボタン)してRelaunchで復活できます。


終了するには Debug ペーンで、右クリックして Terminate and Remove を選択します。もしくはTerminate で実行を止めて Debug ペーンで、右クリックして Remove All Terminate を選択します。

ツールバーから File -> Exit を選択し、ソフトコンソールを終了します。

またTeraTermも ファイル -> 終了 で終了します。


7-3. おわりに


結構長々となりましたが、ARMのプログラムを書いて実際に走らせる事ができました。
ツールに慣れは必要ですが、結構お手軽にソフト開発実行ができると思います。
後は、載っているIPの使用方法(関数とか)をマニュアル見て試していけば結構いろいろな事ができると思います。

次は LiberoIDEを使用したチュートリアルのフローを試してみます。


1つ上
1つ上へもどる


トップ
トップページへもどる


mark  Copyright(c) shibatchii 2011 All Rights Reserved.

-