STM32F3DiscoveryをCooCoxの環境でプログラミングする方法を解説する。
STM32F3Discovery は ARM Cortex-M3 を使った評価ボードである。
http://akizukidenshi.com/catalog/g/gM-06268/
主な仕様は次の通り
32-bit ARM CortexM3系MPU,STM32F303VCT6-LQFP100搭載国内では,秋月電子などで1250円ほどで販売されている。
256KBflashMemory/48KB RAM
ST-LINK/V2でのプログラム書き込み,デバッグ可能
USBケーブルより供給の5V電源で動作(USBケーブルを切り離した場合は別途5Vまたは3V電源で動作可能)
ユーザ用の8つのLEDが利用可能(PE8-PE15)
ユーザ用プッシュボタン利用可能(PA0)
L3GD20, ST MEMS motion sensor, 3-axis ディジタル出力ジャイロセンサ
LSM303DLHC, ST MEMS 3Dディジタル出力加速度センサ+ディジタル出力方位センサ
12bitDAC1出力2ch
12bitADC4個入力各16ch+
PWM出力MAX17ch
エンコーダ入力MAX5個分
USART5ch
ARMとはARM社が設計したマイクロコントローラの構造の名前であり,
製造会社がその構造を元にマイクロコントローラを製造して販売している。
STM32F303VCT6はSTMicroelectronics社が製造しているマイクロコントローラの名前である。
STM32F3DiscoveryはSTMicroelectronics社が製造している評価ボードの名前である。
STM32F3Discovery
購入してそのまま,USBケーブル(スタンダードA-ミニB)でPCに接続すると,USBケーブルから供給される電力で,デモプログラムが動作する。モーションセンサの状態をLEDで表示する。
ユーザマニュアル DM00063382.pdf(UM1570) stm32f3discoveryのピン割り当て
リファレンスマニュアル DM00043574.pdf(RM0316) MCU_STM32F303VCT6のリファレンスマニュアル
STM32F3Discoveryボードの情報DM00063389.pdf
サンプルプロジェクト・ペリフェラルライブラリ stm32f3discovery_fw.zip STSW-STM32118をダウンロード
STMはいくつかの開発環境を推奨しているようだが,無料で使うには制限があるようなので
開発環境としてCooCoxを導入する。
CooCoxは開発用の環境だが,コンパイラ・リンカは持っていないので,コンパイラ・リンカは別途用意する必要がある。
説明は次の2箇所を参考にしている。
(1)チカラの技術
(2)Qiita - プログラマの技術情報共有サービス
3.1 コンパイラ・リンカなどの開発プログラム類(ツールチェイン)のダウンロードとインストール
20150303現在MentorGraphicsはArmサポートを中止している3.2 ST-LINKユーティリティのインストール
http://www.mentor.com/embedded-software/sourcery-tools/sourcery-codebench/editions/lite-edition/
フォームに入力するとE-Mailが届き,ダウンロードできるようになる。。
arm-2013.11-24-arm-none-eabi.exeをダウンロードした。
実行すると
C:\Users\XXXXX\MentorGraphics\Sourcery_CodeBench_Lite_for_ARM_EABI
ここにインストールされた。
20150303現在配布中
launchpad.netがArmコンパイル用toolchainを配布している。。
windows版のインストールexe形式が使える。
https://launchpad.net/gcc-arm-embedded
gcc-arm-none-eabi-4_9-2014q4-20141203-win32.exe
がダウンロードされるので,これを実行しインストール
C:\Program Files (x86)\GNU Tools ARM Embedded\4.9 2014q4
ここにインストールされた。
http://www.st-japan.co.jp/web/jp/catalog/tools/PF2511683.3 CoIDEのインストール 20150303時点
Related Tools and Softwareから
STSW-LINK004 STM32 ST-LINK utility
をダウンロードし,インストールした。
C:\Program Files (x86)\STMicroelectronics\STM32 ST-LINK Utility\
ここにインストールされた。
http://www.coocox.org/3.4 CoIDEを立ち上げてツールパスを設定
Software Tools から「Soft ware Tools」にて CooCox XoIDE のところで
Read moreに進み,「Previous Version CoIDE-1.7.8」に進む。
RegisterしてからSign Inする。
CoIDE-1.7.8.exe がダウンロードされるので,インストールする。
C:\CooCox\CoIDE
ここにインストールされた。
注意 20150303現在
Software Tools から「Soft ware Tools」にて CooCox XoIDE のところでそのままDownLoadすると
CoIDE-V2Beta-20150213.exe
がDownloadされてしまうが,これはまだ不安定で,異常終了がたびたび起こるので今は使わない。
「Project」→「Select Toolchain Path」
「C:\Program Files (x86)\GNU Tools ARM Embedded\4.9 2014q4\bin」を設定
これでCooCoxとコンパイラツールチェインが合体される。
stm32f3diecovery購入時に,モーションセンサの状態をLEDで表示するデモプログラムが入っている。
USBケーブルで電源を供給すると動作するようになっている。
せっかくだから,このプログラムを抜き出し,別なプログラム開発の後で,もう一度転送し,デモプログラムを復活させることができるようにしておこう。
抜き出し
stm32f3diecoveryをUSBケーブルで接続します。
STM32 ST-LINK Utilityを起動し,
プログラムサイズが大きいので,sizeを0x1000から0x5000に増やしておく。
「Target」メニューからConnectを実行すると,
stm32f3diecovery内の機械語部分をPC側に自動的に抜き出します。
これをhexファイルで保存すれば,抜き出し完了
再転送
stm32f3diecoveryをUSBケーブルで接続します。
STM32 ST-LINK Utilityを起動し,Fileメニューから先に保存したhexファイルを読み込みます。
TargetメニューからProgram & verifyを選んで,startすると書き込みます。
書き込みが終わると,デモプログラムが動作を開始します。
stm32f3diecoveryの8個のLEDを点滅させる最小限のプログラムを作る。
8つのLEDはGPIOのPortEの第8ビットから第15ビットに接続されている。
(ユーザマニュアル DM00063382.pdf(UM1570) 4.4 LEDs, Table 6, Figure 14 参照)
この各ビットに1を出力することによりLEDが点灯し,
0を出力することで消灯する。
GPIOのPortEの第8ビットから第15ビットに0/1を出力するには事前に2つの準備が必要である。
(1)PortEのクロックを有効にする(RCC_AHBENRのbit21を1)
(リファレンスマニュアル DM00043574.pdf(RM0316) 8.4.6 参照)
(2) PortE_Bit8-15を出力に設定(GPIOC_MODERのbit16,18,20,22,24,26,28,30を1)
(リファレンスマニュアル DM00043574.pdf 9.1 9.4.1 参照)
これで準備ができて あとはPortC_Bit8-15に0/1を出力する(GPIOC_ODRのbit8-15を0/1)
(リファレンスマニュアル DM00043574.pdf 9.4.6 参照)
この手順はARMプロセッサのビット入出力として一般的なものである。
作業手順は次のとおりである。
(1)CoIDEを起動
(2)「Projectメニュー」から「New Project」を選択
一応プロジェクト名「LED_demo_stm32f3discovery」をつける。
「C:\CooCox\CoIDE\workspace\LED_demo_stm32f3discovery」
実体はここに作成される。
(3)テンプレート作成手順に自動的に入るので「chip」か「board」を選ぶところで,
「chip」を選択して緑色にする。
ST → STM32F303 → STM32F303VC
(ARM から選んではいけない。)
(4)Repository(収納庫の意味)が表示される。
(「viewメニュー」-Repositoryで後から追加・削除は可能)
最低限のコンポーネントを使うことにして,
「CMSIS BOOT」と「M4 Cmsis Core」を選定する。
選定するごとにCoIDE左側のProjectにファイルが増える。
(5)main.cを次のように作成
5.ボタン(ユーザボタン)によって8つのLEDを制御
#include "stm32f30x.h"
// LEDs are controlled by Port E Pin8-15 output
int main(void)
{
volatile unsigned int x=0;
RCC ->AHBENR |= 0x200000; //Enable CLK for Port E
GPIOE -> MODER |= 0x55550000; //Enable Port E Pin8-15 as a digital output
while(1) {
GPIOE ->ODR |= 0xff00; //Turn GPIOE Pin8-15 On
for (x=0; x<1000000; x++);
GPIOE ->ODR &= ~0xff00; //Turn GPIOE Pin8-15 Off
for (x=0; x<1000000; x++);
}
}
注意 int型変数xにおいて x |= 0xff00; は他のビットに影響を与えず第8ビットから第15ビットのみ1にする。
また,x &= ~0xff00; は他のビットに影響を与えず第8ビットから第15ビットのみ0にする。
(6)stm32f3diecoveryの準備
stm32f3discoveryをUSBケーブル(A-miniB)で接続する。
購入直後の場合はデモプログラムが動作しているが,デモプログラムは上書きされてなくなってしまうことになる。
(7)ビルド(build)&転送(Program Download)&デバッグ(debug)
ビルドと転送はそれぞれProjectメニュー,Flashメニューにあるが,ビルドボタンと転送ボタンが便利である。
ビルドボタンを押して,「BUILD SUCCESSFUL」が画面下のconsoleに表示されたらビルド終了
転送ボタンを押して,転送ダイアログが消えたら,転送終了。
(8)デバッグ実行
mainの入り口で(黄色の矢印)止まっているので,緑三角アイコンでRUN
青のLEDがチカチカしたら,成功
黄色ポースアイコンでSuspend(一時停止)
赤四角アイコンでterminate(デバッグ終了)
(デバッグ終了すると,デバッグなしで勝手に動作する)
LED_demo_stm32f3discovery.zip
stm32f3diecoveryのユーザボタンで8つのLEDをONOFFする最小限のプログラムを作る。
青のユーザボタンを押したら4つのLEDが点灯し,そうでない時は別の4つのLEDが点灯するようにする。
8つのLEDはGPIOのPortEの第8ビットから第15ビットに接続されている。
ユーザボタンはGPIOのPortAの第0ビットに接続されている。
(ボタンOFFで0V,ボタンONで電源電圧が入力される。)
GPIOのPortAの第0ビットを入力として使うには事前に2つの準備が必要である。
(1)PortAのクロックを有効にする(RCC_AHBENRのbit17を1)
(2) PortA_Bit0を入力に設定(GPIOA_MODERのbit0,1を0)
GPIOのPortCn2つのビットは4で説明済みである。
作業手順は4と全く同じとなり,(ただし,プロジェクト名は別の名前)
main.cのみ次のようにすれば良い。
6.semihostingを用いたprintfの使用
#include "stm32f30x.h"
// User Button is checked as Port A Pin0 input
// LEDs are controlled by Port E Pin8-15 output
int main(void)
{
RCC ->AHBENR |= 0x20000; //Enable CLK for Port A
RCC ->AHBENR |= 0x200000; //Enable CLK for Port E
GPIOA -> MODER &= ~3; //Enable Port A Pin0 as a digital input
GPIOE -> MODER |= 0x55550000; //Enable Port E Pin8-15 as a digital output
while(1) {
if (((GPIOA ->IDR)&1) ==1 ) { //if user's button pushed
GPIOE ->ODR |= 0x9900; //Turn GPIOE Pin8,11,12,15 On
GPIOE ->ODR &= ~0x6600; //Turn GPIOE Pin9,10,13,14 Off
} else {
GPIOE ->ODR &= ~0x9900; //Turn GPIOE Pin8,11,12,15 Off
GPIOE ->ODR |= 0x6600; //Turn GPIOE Pin9,10,13,14 On
}
}
}
ButtonLED_demo_stm32f3discovery.zip
coIDEでは,デバッグの時に右下にsemihostingというペインが開いている。
このペインにstm32f3diecoveryからprintfで表示してみよう。
デバッグの時に使えるかもしれない。
作業手順は次のとおりである。
(1)CoIDEを起動
(2)「Projectメニュー」から「New Project」を選択
一応プロジェクト名「hello_with_semihost_stm32f3discovery」をつけた。
「C:\CooCox\CoIDE\workspace\hello_with_semihost_stm32f3discovery」
実体はここに作成される。
(3)テンプレート作成手順に自動的に入るので「chip」か「board」を選ぶところで,
「chip」を選択して緑色にする。
ST → STM32F303 → STM32F303VC
(4)Repository(収納庫の意味)が表示される。
(「viewメニュー」-Repositoryで後から追加・削除は可能)
「CMSIS BOOT」と「M4 Cmsis Core」「C Library」「Retarget」「semihosting」を選定する。
(5)Viewメニューから,Configuration - Debugger
Semihosting Enableをチェック
(6)左下のプロジェクト内でstdio/printf.cの関数PrintCharを関数SH_SendCharに渡すようにする。
#include <semihosting.h> ←を追加
void PrintChar(char c)
{
/* Send a char like:
while(Transfer not completed);
Transmit a char;
*/
SH_SendChar(c);
}
(7)Configuration - Link
Debug in flashをチェック。
Debug in RAMではメモリが不足してprintfが動かない。
(8)main.cを次のように作成
#include <stdio.h>
int main(void)
{
volatile int x=0;
while(1)
{
printf("Hello world! %3d\r\n",x++);
if (x==100) x=0;
}
}
(9)コンパイルと転送は同時に行わなければならないため,
てんとう虫アイコンでコンパイル&転送する。
(10)mainの入り口で止まっているので,緑三角アイコンでRUN。
Semihostingペインに次のように表示される。
Hello world! 0
Hello world! 1
Hello world! 2
Hello world! 3
Hello world! 4
Hello world! 5
Hello world! 6
Hello world! 7
Hello world! 8
黄色ポースアイコンでSuspend
赤四角アイコンでterminate
hello_with_semihost_stm32f3discovery.zip
★printfに関する補足
(1)浮動小数点型の表示非対応
CooCoxが提供しているprintfは浮動小数点型の表示には対応していないが,
実行ファイルはその分小さく仕上がる。
(2)浮動小数点型表示のための変更
1) printf.cをプロジェクトから削除し,
2) syscalls.c内のint _write(int file, char *ptr, int len)を
int _write(int file, char *ptr, int len)このように変更すると,標準関数のprintfが組み込まれ,浮動小数点型の表示が
{
ptr[len] = '\0';
SH_SendString(ptr);
return len;
}
可能になるが,実行ファイルは非常に大きくなる。
5,6のように0からプロジェクトを作ることは結構大変である。
フレームワークと呼ぶほど大げさではないが,機械工学科の学生が良い方法を教えてくれた。
予めすべてのヘッダーファイル,ソースファイルをプロジェクト内に登録しておくと,煩雑な選定作業が不要になる。
CooCoxのRepositoryのお世話にならず,全部まとめて登録するという方法である。
不要なヘッダをCソースが取り込んだとしても,実行コードには何も影響がない。
不要なソースファイルがプロジェクト内にあってもオブジェクトコードまでは作られるが,
実行コードには取り込まれないので,実行ファイルが肥大化することもない。
フレームワークプロジェクトと呼んでいるが,デモンストレーション用プロジェクト(一部変更)そのものである。
使い方は,CoIDEを起動し,フレームワークプロジェクトの.coprojファイルでプロジェクトを立ち上げると,
デモンストレーションのプログラムが出て来る。そのまま「てんとう虫」ボタンで実行できる。
自分用のプログラムにするには,不要な部分を削除し,必要なことを書き足せば良い。
このフレームワークプロジェクトでは,
ペリフェラルドライバの全ヘッダファイルの取り込みはstm32f3xx_conf.hが一手に行っている。
ダウンロード
フレームワークプロジェクト(デモンストレーション用プロジェクト)
このワークフレームプロジェクトに関する使用上の注意☆☆
ワークフレームプロジェクトを使っても,不要な部分の削除,必要な関数群の作成は
- printfが使用されており,semihostingの機能を利用している。
もし,semihosting機能を使わない場合は,Viewメニューから,
Configuration - Debugger Semihosting Enableのチェックを外す。- このprintf関数は浮動小数点型をサポートしていない。サポートが必要な場合は
プロジェクト内のフォルダstdio中のprintf.cをプロジェクトから外す。
そうすると標準組込関数のprintfが使われるようになる。
行わなければならない。
また,このワークフレームプロジェクトを用いると,新規作成のすべてのプロジェクト名がおなじになってしまい困る。
そこで,次の「フレームワークプロジェクト作成ツール」を使うと,この問題が解決する。
フレームワークプロジェクト作成ツールstm32f3_makeBasicProjectダウンロード
上記の手順ではすべてのプロジェクト名が同じになってしまうので,
新しいプロジェクト名でのフレームワークプロジェクト一発作成ツールを作った。
1)このアプリケーションの目的
STM32f3Discovery用の新たなプロジェクト名をつけたプロジェクト
フォルダ(CooCox用テンプレート)を生成する。
生成されたプロジェクトフォルダを適当な場所に置き,その中の
.coprojファイルを使って,CoIDE上にプロジェクトを開き,作業
を開始くことができる。
このテンプレートはフレームワークとも呼ばれており,ペリフェラ
ルのドライバやそのヘッダファイルをすべて取り込んだものになっ
ている。
2)操作方法
(1)CoIDE_makeBasicProject.exe を起動し,
プロジェクトフォルダを作りたい親フォルダを上の段に書く。
(デフォルトはCoIDE_makeBasicProject.exeの親ディレクトリ)
新しいプロジェクト名を下の段に書く。
makeボタンを押す。
(2)CooCox Project → Open Project で
.coprojファイルを選択すると,作業開始できる。
main.cを変更することになるが,includeのところは残して,main()以下を書き換えるようにすれば良い。
他のファイルをプロジェクトに取り込んでも良い。
3)完成済みのプロジェクトフォルダから新たな名前のプロジェクトを作成する方法
ダウンロード・ファイル中のreadme.txt中に,方法が記載されている。
4)注意
上記「このワークフレームに関する使用上の注意☆☆」はそのまま適用される。