020 IAR開発ツールをまずは起動してSTM32-DISCOVERYをつないでみる
AtollicのTrueSTUDIOでは、projectを新規作成した時点でライブラリが組み込まれたprojectが出来るので便利でした.
IARの開発ツールではそうではないようです.
そこで、とある場所からサンプルprojectをダウンロードして、ビルドしてSTM32-DISCOVERYを動かしみました.
●起動します.
スタート→すべてのプログラム→IAR Systems→IAR embedded workbench for ARM→IAR embedded workbench
●言語選択ダイアログが表示されます.日本語のままでOKをクリック.
●開発ツールの画面が開きます.シンプルな画面という印象です.
●この先に進むために、ある場所からサンプルプロジェクトをダウンロードします.
まず、ここを開きます.STM32 DESIGN CHALLENGEというページです.
http://www.stm32challenge.com/resources
●こういう部分があります.大事なのは四角で囲ったリンクです.
まず、IAR EWARM をクリックしますと、サンプルプログラムの取説を見れます.
つぎに、STM32DesignChallengepackage をダウンロードします..zipですので解凍します.
●.zipを解凍すると、次のようなフォルダが現れます.
とりあえず開発ツールを動かすのが目的なので、解凍する場所はどこでもいいです.
このフォルダでいま使うのは、Project\Demo\EWARMv5 です.
●次のファイルをダブルクリックで開発ツールが開くはずです.
Project\Demo\EWARMv5\DiscoveryDesignChallenge.eww
するとワークスペースが開きます.
いろいろなファイルがありますが、main.cがユーザープログラムです.
●さて、サンプルプロジェクトなのでなにも編集しないでもビルドできるはずです.
projectをビルドするには、DiscoveryDesignChallenge..... のところを右クリックして、プルダウンメニューから すべてを再ビルド を選びます.
●ビルドが始まりますが、盛大にエラーが出ます.
これ、なぜかファイルを修正しないとダメなんで、ファイルを修正します.
エラーが表示された行をダブルクリックします.
●ファイル編集ペインに、core_cm3.h が現れます.
エラーが出ているのは、uint32_t のところです.
関数のプロトタイプ宣言では、unsigned longで宣言しているにもかかわらず、core_cm3.hではunit32_tになっているのでエラーが出ています.
なので、エラーがでなくなるまで unit32_t を全部unsigned longに変更します.
extern uint32_t __STREXB(uint8_t value, uint8_t *addr);
↓
extern unsigned long __STREXB(uint8_t value, uint8_t *addr);
なかにはuint16_tでエラーになっているところもありますので、そこもunsigned longにします.
●ふたたびビルドしますと、こんどは、ノーエラーでビルドが完了します.
●ビルドできたので、STM32-DISCOVERYをUSBケーブルでPCに接続します.
●デバッガを起動します.メニューのボタンを押します.
●すると、プログラミング中だというダイアログが出て、止まってしまいます.
実は設定しなくちゃイケナイところをまだやってないからこうなってしまうんです.
●projectオプション設定を変更します.
DiscoveryDesignChallengeを右クリックしてオプションをクリックします.
●おかしいのはデバイス指定です.STM32-DISCOVERYのCPUはSTM32F100RBですからここを修正します.
ちょい右の変更ボタンをクリックしますと出てくるメニューから、ST→ST STM32F100xB を選びます.
ここでCPU名が紛らわしいので注意してください.STM32F10XXBではなくSTM32F100XBですので.
before
after
●projectオプション設定を変更すべき箇所がまだあります.
C/C++コンパイラのプリプロセッサタブを選んでください.
STM32F10X_XLという文字が見えますが、これは不適です.
STM32-DISCOVERYのSTM32F100RBは、中規模バリューラインですので、STM32F10X_MD_VL が正しい設定です.
直接編集して書き換えます.
●これでビルドがうまくゆくはずです.こんどはいきなりデバッグボタンをクリックしてみましょう.
ウィンドウ画面がそれとなく変わります.
●下図の実行ボタンを押すとSTM32-DISCOVERYが動き始めます.
●赤い手のひらボタンで止まります.
●動いてる最中に、STM32-DISCOVERYの青いボタンを押すと、一瞬ブルーLEDが点灯し、グリーンLEDの点滅周期が変わります.
この動作をさせているのがmain.cのこの部分です.
codeしたとおりに動いていることがわかります.
/* main while */
while(1)
{
if(0 == STM32designchallenge_PBGetState(BUTTON_USER))
{
if(KeyState == 1)
{
if(0 == STM32designchallenge_PBGetState(BUTTON_USER))
{
/* USER Button released */
KeyState = 0;
/* Turn Off LED4 */
STM32designchallenge_LEDOff(LED4);
}
}
}
else if(STM32designchallenge_PBGetState(BUTTON_USER))
{
if(KeyState == 0)
{
if(STM32designchallenge_PBGetState(BUTTON_USER))
{
/* USER Button released */
KeyState = 1;
/* Turn ON LED4 */
STM32designchallenge_LEDOn(LED4);
Delay(1000);
/* Turn OFF LED4 */
STM32designchallenge_LEDOff(LED4);
/* BlinkSpeed: 0 -> 1 -> 2, then re-cycle */
BlinkSpeed ++ ;
}
}
}
count++;
Delay(100);
/* BlinkSpeed: 0 */
if(BlinkSpeed == 0)
{
if(4 == (count % 8))
STM32designchallenge_LEDOn(LED3);
if(0 == (count % 8))
STM32designchallenge_LEDOff(LED3);
}
/* BlinkSpeed: 1 */
if(BlinkSpeed == 1)
{
if(2 == (count % 4))
STM32designchallenge_LEDOn(LED3);
if(0 == (count % 4))
STM32designchallenge_LEDOff(LED3);
}
/* BlinkSpeed: 2 */
if(BlinkSpeed == 2)
{
if(0 == (count % 2))
STM32designchallenge_LEDOn(LED3);
else
STM32designchallenge_LEDOff(LED3);
}
/* BlinkSpeed: 3 */
else if(BlinkSpeed == 3)
BlinkSpeed = 0;
}