さて、今回はMDK-ARMの使い方。プログラムをマイコンに書き込むところまで行きましょう。
前回入れたuVision4を起動します。
プログラムはプロジェクトで管理します。
つまり どういうチップが対象で、プログラムはこれとこれとこれ、書き込みにはこれを使う という設定の塊です。
これを用意して初めてプログラムが書けるようになります。
では、STM32F3Discover用のプロジェクトを作りましょう。
上のProjectタブから New uVision Projectを選びます
そしたらどこに保存するかを聞かれますので、適当な場所を選びます。ドキュメントとかね。フォルダを作っておくのもいいですね。
そしてプロジェクトの名前を決めます。今回はtestにします。
できたら「保存」を押します。
すると「どのチップを使うの?」と聞いてきます。ベンダー(メーカーのことね)からチップを選ぶようになっています。今回はSTつまりSTMicroelectronicsのSTM32F303VCT6を使うのでこのリストにある「STM32F303VC」というのを選びOKを押します。
すると、startup_stm32f30x.s をプロジェクトにコピーして追加するかと聞かれます。
これは何かというと初歩的な設定がアセンブリ言語で書かれたものです。
全部C言語で書くこともできるのかもしれませんが、今回はこのアセンブリを使いましょう。はい を選びます。
するとプロジェクトが完成して、プロジェクトが開かれた状態になります。
Target 1というのがそうです。これの+を押して開いていくとSourceGroup1というのにstartup_stm32f30x.sというのがあると思います。
これをクリック(ダブルクリックだったかな)すると右側にアセンブリ言語のプログラムが出てきます。
つまり左側がどのファイルか、右側が開いたプログラムの中身 という表示になっているわけです。
ここまではOKですね。 さて、こっからは自分のプログラムを書きましょう。
とりあえずなにもしないでmain関数だけ書いてみましょう。
SourceGroup1を右クリックして「Add New Item to Source Group1」を選びます。そしてmain.cを追加します。
タイプで C Fileを選びNameにmainを入れてばOKです。ぶっちゃけ名前はなんでもいいです英語なら。
addを押すとmain.cが開かれます。さっそくmain関数を書いてみましょう。
int main(void)
{
while(1);
}
ただ無限ループするだけのプログラムです。
かけたらビルドします。ビルドというのはプログラムを読んでコンパイルし、マイコンに転送できるファイルを作成することをいいます。
ビルドは保存アイコンの下あたりにあるこれです。
これを押すと見事に失敗すると思います。こんなエラーが出てきます。
Build target 'Target 1'
assembling startup_stm32f30x.s...
compiling main.c...
main.c(4): warning: #1-D: last line of file ends without a newline
linking...
.\test.axf: Error: L6218E: Undefined symbol SystemInit (referred from startup_stm32f30x.o).
".\test.axf" - 1 Errors, 1 Warning(s).
Target not created
エラーの内容を読むと Undefined symbol SystemInit (referred from startup_stm32f30x.o).
だそうです。
これはつまり
「startup_stm32f30x の方にはSystemInitってのがどこかに書いてあってそれを使うよ! ってかいてあるのにどこにも見つからなかったからエラー」
ということです。
困りましたね。とりあえずstartup_stm32f30x.sを見てみましょう。検索を使ってそれっぽい部分を探すとこんなのがありました。
; Reset handler
Reset_Handler PROC
EXPORT Reset_Handler [WEAK]
IMPORT SystemInit
IMPORT __main
LDR R0, =SystemInit
BLX R0
LDR R0, =__main
BX R0
ENDP
これはマイコンの電源が入った時に呼ばれるアセンブリプログラムです。
見覚えのある関数名がありますね main関数のことです、つまりこのアセンブリは「電源が入ったらmain関数を呼ぶ」と書いてあるわけです。
そして、何故かSystemInittに関しても書いてあります。どうやらmain関数を呼ぶ前にSystemInit関数を呼ぶらしいです。
でもこのアセンブリの中にはSystemInit関数なんてありません。用意しろということでしょうね~
ということでmain.cを書き直します。
void SystemInit(void)
{
}
int main(void)
{
while(1);
}
新しくSystemInit関数を追加しました。
これでビルドすると見事にエラー無しでビルド成功!やったね!
[ 書き込み ]
さてさて、こっからは書き込みです。何もしないプログラムですがマイコンに書き込んでみましょう。
まず、STMDiscoverをPCにつなぎます。この段階で自動的にドライバが入ります(ここに関するエラーはあとでまとめます)。
そしてSTMDiscoverのCN4はどっちもピンをショートさせてくださいね。そしてCN3には他のものを何も繋がないこと。
さて、プログラムの書き込みですが、Loadと書かれたアイコンが有ると思いますのでそれを押します。
すると見事にエラーになります。ULINK Cortex-M Error "No ULINK Device found"だそうです。
実はプロジェクトの設定が足りません。つまりマイコンはプロジェクトを作るときに指定したんですが、そのマイコンと何でつなぐかとかそういうのを設定しないといけないわけです。
めんどいですがやっちゃいましょう。
Projectの[Options for target"target1"]みたいなのを選びます。
するといろんな設定が出てきますが、最初はTargetに関する設定です。「Code Generation」の「Use Lib」にチェックを入れます。
ライブラリを使うかっていう設定だと思います。(たぶんね、ごめん知らない)
それを選んだらDebugタブを選びます。
これはDebugをどうやってやるか選択する画面です。シュミレーターなのかそれとも実際にデバイスに書き込んで使うのかという感じです。
これを右側のUseにチェックを入れてST-Link Debuggerを選びます。つまり実際のデバイスでデバッグする設定です。
そして右側のSettingを押してより細かい設定をします。
DebugAdapterのPortでSWとJTAGが選べますが、SWにします。それだけです。
ちなみにSWDeviceというのが右側に出てきますが、STM32F3DiscoverをPCにつないだ状態ならちゃんと右側にデバイスが出てきます。
こんなかんじで
もし出てこなかったらドライバーの設定がミスってます。詳しくは後で書きます。
出てきたらOKを押します。最後にUtilitiesです。
Use Target Driver for Flash Programming を選択して(選択状態であっても選択して)
ST-Link Debuggerを選びます。
プログラムの書き込みに何を使いますか?ということです。もちろんこれです。
そして右側のSettingsを押してください。
するとFlash Downloadという設定が出てきます。
ST-Link Debuggerをつかって 何にどうやって書き込むのかという設定です。
非常にナンセンスなんですが、ここのプログラムデバイスリストがからです。せっかくSTM32F303VCを使うって設定したのにここには出てきていません。
しょうがないので追加します。Addを押してリストからSTM32F3xx Flash というのを選びAddします
これですね。これを選んでAddを押すと追加されます。
こんなかんじになっていればOK.
これですべての設定は完了です。OKを押しましょう。
そして、前回失敗したLoadを押してみましょう。今度は
Build target 'Target 1'
compiling main.c...
linking...
Program Size: Code=328 RO-data=408 RW-data=0 ZI-data=1632
".\test.axf" - 0 Errors, 0 Warning(s).
Load "C:\\Users\\sato\\Documents\\uvision_projects\\test\\test.axf"
Internal DLL Error
Load "C:\\Users\\sato\\Documents\\uvision_projects\\test\\test.axf"
Erase Done.
Programming Done.
Verify OK.
というメッセージが出てくるはず。
Programも成功してVerifyも成功しています。マイコンにプログラムが書き込まれました。
さっきまでサンプルプログラムが動いていてチカチカしていたマイコンがおとなしくなったと思います。
これで開発環境はOKです!次回からこのProjectを使って開発していきましょう。
全部やったのに書き込めない。
そもそもSW Deviceにデバイスが出てこない人は以下のことを確認して下さい。
・デバイス上のCN4がちゃんとショートされているか
・ドライバが入っているか。
ショートの確認は簡単ですが、ドライバがめんどいですね。
ドライバの確認はマイコンがPCにつながった状態で マイコンピューターの右クリックから「プロパティ」を開いて「デバイスマネージャー」を開きます。
そのなかにビックリマークのついた ST-LInkがいたらデバイスドライバのインストールに失敗しています。
ちなみにWindows8なら100%失敗します。
Windows8からは証明書のついてないドライバが入らないようになっているからです。そして、ST-LInkのドライバには証明書はついてません。
まず、windows8を証明書なしドライバー使えるモード にしちゃいましょう。
を見ながらやれば出来ると思います。
そして、再度ドライバーを入れます。
C:\Keli\ARM\STLink\USBDriverにSt-Link_V2_USBdriver.exe
というのがありますのでこれを実行してみましょう。そしたらドライバーが入ります。
もしよくわかんなかったら連絡してください。サポートします
です