STM32

少なくともマイクロマウスにおいてはH8もしくはSHにかわって主流になりつつあるSTM32に関する情報を集めた.ただし,内容は機械研究会で主に使用しているSTM32F103RET6 (LQFP 64ピン)で動作確認している.他の型にも対応できるようにある程度は考慮しているが,動作確認はできていない.
また,ここで公開しているファイル中のコメントはutf-8の文字コードで書かれています.

(文責:kojima)

注意
このページの内容は2012年9月現在やや古くなっており, また,今後更新されない可能性があります. 最新情報は 小島のホームページ のマイクロマウスに関連するページで公開しています.


CONTENTS

周辺回路

ピン配置

チップによってはまぎらわしいくぼみがあり,データシートを見てもの1番ピンの位置がわからないものがあるようです.次の写真のようにいかにもピンインジケータっぽい方が1番ピンです.文字の向きも参考にはなると思いますが,全てのチップで同じ向きに文字が印刷されている保証はありません.

stm32.jpg

最小回路構成

AN2586 (getting started) を読めば必要な回路構成がわかる.
といっても実際のところ,bootモード選択用スイッチを除けば,コンデンサをつけるだけである.

以下の回路について,

開発環境(windows)

一応はじめに断っておくけれども,動作保証はしない.
windows用の開発環境と言いながら動作確認は主にlinuxで行っている.一応windows XPでも一通り動作することは確認しているが,後に追加された内容に関しては動作確認していないものもある.また,vistaや7,もしくはそれら64bit版においては一部以下の手順と異なる可能性がある.

コンパイラなどを拾ってきて"Hello world!"を表示することを目指す.
以下の手順に従って環境構築します.

stm32関係のファイルはSTマイクロのSTM32関係のページのリソースにいろいろあります.
読むべきファイルはとりあえず以下の3つ.全て英語で書かれていて読むのに時間がかかるが,それでも英語なので読めなくはない.なお,日本語訳のドキュメントもあるようだが,文書の質は落ちるのでむしろ読みにくいかもしれない.

1. コンパイラのインストール

codesourceryのコンパイル済みgccを使う.
codesourceryにあるtargetOSがEABIのものを使う.そのリンク先から"IA32 Windows Installer"をダウンロードして、実行してインストール.
ダウンロード方法はこのページが参考になる
ファイル名・・・"arm-2011.03-42-arm-none-eabi.exe" (2012/6/12の最新)
インストールウィザードは基本的に全てデフォルトのままでよい.これでパスも設定してくれる. このままではライブラリを読みに行けないので,後に説明するプロジェクトフォルダ内のmakefileのTOOL_PATHを変更する必要がある.(STM32program_v2.3.0以降では必要なし)

2. フラッシュ書き込みツールのインストール

STマイクロのSTM32ダウンロードページにある"Flash loader demonstrator"をダウンロード,展開,インストール.
ファイル名・・・"um0462.zip" (2011/3/12確認)
バージョン・・・v2.2.0 (2011/3/12時点)
デフォルトのインストール先・・・"C:\Program Files\STMicroelectronics\Software\Flash Loader Demonstrator\"

3. Eclipseのインストール

例えば,
http://mergedoc.sourceforge.jp/から”Pleiades All in One”のJREあり,C/C++のものをダウンロードして展開する.(3.6 Heliosでコンパイルできたのに3.7 Indigoでコンパイルできない事例があります)

4. ソースコード,ライブラリなどの準備

ベースとなるプロジェクトフォルダを準備しました.基本的にはバージョン番号の大きいものを使用してください.
なお,ここの説明は最新のものを使用した場合について書いています.
STM32program_v2.0.2.zip (ライブラリv3.1.2)
STM32program_v2.0.3.zip (ライブラリv3.1.2)
STM32program_v2.1.0.zip (ライブラリv3.1.2)
STM32program_v2.2.0.zip (ライブラリv3.4.0)
STM32program_v2.2.1.zip (ライブラリv3.4.0)
STM32program_v2.2.2.zip (ライブラリv3.4.0)
STM32program_v2.3.0.zip (ライブラリv3.4.0)
STM32program_v2.3.1.zip (ライブラリv3.4.0)
STM32program_v2.3.2.zip (ライブラリv3.4.0)

TODO

STM32program_v2.2.2
folder_v2.2.0.png

STM32program
ルートフォルダ.
このフォルダ自体の名前は何でもよい.
*.ld
リンカスクリプト.
ライブラリ付属の
"STM32F10x_StdPeriph_Lib_V3.1.2/Project/Template/RIDE/stm32f10x_flash_extsram.ld"
をベースにしてコンパイラ付属の
"arm-2009q3/arm-none-eabi/lib/thumb2/generic.ld"
も参考に作成.
Librariesフォルダ
ライブラリフォルダ.
STマイクロのSTM32ダウンロードページのリソースタブ内Firmwareにある
"ARM-based 32-bit MCU STM32F10xxx standard peripheral library" をダウンロードして展開.
ファイル名は,"stm32f10x_stdperiph_lib.zip"である.(2011/2/15確認)
その中から,
armのコアを操作するライブラリ"CMSIS"フォルダ,
STM32の周辺モジュール(ペリフェラル)を操作するライブラリ"STM32F10x_StdPeriph_Driver"フォルダ
をコピーします.
stm32f10x_conf.h
このファイルでstm32の周辺モジュール(ペリフェラル)のヘッダファイルが呼び出されている.
デフォルトではコメントアウトされているものをあるが,使用するペリフェラルのヘッダファイルについてはコメントアウトをはずすこと.
全部はずしておけばよいと思います.
makefile
コンパイルのコマンドなどを実行するためのスクリプト.STM32の種類に応じて"親makefile"中の変数値は書き換える必要がある.
デフォルトではSTM32F103RET6に対応.
mainフォルダ
メインプログラムフォルダ.
main.cpp
メインプログラムソース.
このファイルにプログラムを書く.
stm32f10x_it.c, .h
割り込みルーチンが定義されているソースとそのヘッダ.
"STM32F10x_StdPeriph_Lib_V3.4.0/Project/STM32F10x_StdPeriph_Template/"にあるのでコピーする.
syscall.c
printfなどの標準関数を使うために必要なシステムコール関数を定義している.
コンパイラに付属のドキュメント
"arm-2009q3/share/doc/arm-arm-none-eabi/pdf/libc.pdf"
を参照して記述.
staticフォルダ
あまり書き換えないコードや巨大なテーブルを毎回書き込むのは時間がかかるため,本プロジェクト構成では,毎回書き込む"main"の部分と一度だけ書き込んで使いまわす"static"の部分にわけられる.
ただし,若干扱いに注意があったりするのでコードが巨大でない場合は利用する必要はない.また,気にしなくても利用できるようになっている.
編集法は以下の通り
1. staticフォルダ内にソース,ヘッダを入れる
2. includes.txt内にEXTERN(シンボル名)と書く
3. いつもどおりにコンパイルする
4. write_static.batを実行してstatic.motを書き込む
memory.ld
mainとstaticのRAMとROM領域の配分を定義.
"STM32F103RET6"(RAM64k,ROM512k)用に設定されているので,異なるものを使う場合は書き換える必要がある.
このとき,FLASHの領域を変更する際は内蔵ROMのページサイズ単位(STM32F103RET6では2kbyte)で行う必要がある.
また,変更に伴ってwrite_main.bat,write_static.batも書き換える必要あり. memory.png

最新版(v2.3.2)では少し仕様変更しました.が,説明はそのうち...

write_main.batwrite_static.bat
コンパイルして生成されたhexファイルをstm32のromに書き込むプログラムを呼ぶバッチファイル.ダブルクリックで書き込める.
環境に応じて--pnの後ろのcomポート番号だけは確認,変更すること. comポート番号は,USBシリアル変換ケーブルを接続した状態で
マイコンピュータ上で右クリック --> プロパティ --> ハードウェアタブ --> デバイスマネージャ-ポート(COMとLPT)
を見れば確認できる.

5. コンパイル

Eclipseでプロジェクトを作成してビルドする.
ビルドといってもmakeコマンドを実行しているだけである.
具体的には以下のようにすればよいそうです.

makeコマンドが存在せずビルドに失敗する場合

パスの通っているところにmakeがないとビルドに失敗する.
また,rmがないとクリーンに失敗する.
この場合はcodesourceryのコンパイラフォルダにあるcs-make, cs-rmを使用すればよい.
そのための方法は主に2つある.

(a) exeファイル名を変更する
コンパイラインストール先のbinフォルダ内のファイル名を変更する.

cs-make.exe --> make.exe
cs-rm.exe --> rm.exe

(b) eclipseから呼び出すコマンド名を変更する
ビルド時にはデフォルトのmakeではなくcs-makeを呼ぶようにする.

Project --> Properties --> C/C++ Build

の"Build command"を

make --> cs-make

に書き換える.

クリーン時にはデフォルトのrmではなくcs-rmを呼ぶようにする.

Project --> Properties --> C/C++ Build --> Environment

で環境変数RMを追加する.

Eclipse tips

文字コードは

Project --> Properties --> Resource

で変更できる.
上記プロジェクトフォルダはutf8で書かれている.

”Alt+/”で補完候補が出てくる.

6. プログラムの書き込み

書き込みは,マイコンを書き込みモードで起動して,write_main.batをダブルクリック.
teratermは終了してcomポートを開放しておくこと.
また,staticは放置しておいてOKなはずです.

書き込み終了後続けてteratermを実行する

batファイルの最後に

start "" "(path to teraterm)\ttermpro.exe"

と書いておくと勝手に起動するので便利だと思います.

7. teratermのインストール

teratermをダウンロードしてインストールする.

8. 実行と通信

teratermを実行して適切なシリアルポートのポート番号を選択.
"設定"メニュー-"シリアルポート"で各種設定.

ボーレート115200
データ8 bit
パリティnone
ストップ1 bit
フロー制御none

設定した後は,"設定"メニュー-"設定の保存"で"TERATERM.INI"を上書きしておくとよい.

STM32をROM領域から実行するモードで起動する.

古い情報

いつ何がどう役に立つかはわからないので一応消さずに保存しておく.
STM32_old

プログラム

ライブラリのドキュメント

ライブラリをダウンロードするとヘルプファイルが入っていますが,かなり読みにくいように思います.
そこで,昔のライブラリ用のマニュアル(UM0427)を使うことをお奨めします.
ただし,古いドキュメントですのでライブラリの仕様が変わっている場合には役に立ちません.
(ライブラリv3.4.0ではまだ使える)

STマイクロのSTM32ダウンロードページのリソースタブ内Firmwareにある

Archive for legacy STM32F10xxx Firmware Library V2.0.3 and all related Firmware packages

の中の

13457.pdf

がpdf版のライブラリの説明です.リファレンスマニュアルの項目に沿った構成になっているので読みやすい.

割り込み

割り込みには以下の2種類がある.

PWM出力

位相係数カウンタ

AD変換

変数値の記録(RAMを使ったログ機能)

これはSTM32のモジュールとは関係ない.

STM32はRAMが多いため,余っているメモリ領域を使って変数値のログをとるようにするとデバッグやパラメータの調整が容易になる.
そのために,例えば以下のソースとヘッダを準備する.

rlog.cpp (110521)
rlog.h (110521)

パラメータの保存(Flashへの定数の保存)

ロボットのソフトウェアを作っていく過程では定数の調整を頻繁に行う. STM32のFlashは1万回の書き換えができるのでFlashにパラメータを保存しておき,その書き換えを行うインターフェースを準備しておくと便利である.

parameter_110903.zip (use with STM32program_v2.3.2)

ポート

STM32にはかなり多くの機能(タイマ,AD変換器など)が詰め込まれているが,入出力ピンを共有しているものが多く,うまく組まないと思ったほど多くの機能は使えない.

推奨する使用例

ペリフェラル用途
USART1PCとのシリアル通信ROM書き込み端子がUSART1なのでほぼ確定
DMAC1-4シリアル送信用
DMAC1-5シリアル受信用
TIM1(CH1,4)モータ制御用PWMCH2,CH3はUSART1とかぶっている
TIM8(CH1,2,3,4)モータ制御用PWM
TIM3(CH1,2)エンコーダ入力
TIM4(CH1,2)エンコーダ入力
TIM5(CH1,2)エンコーダ入力
TIM2AD変換トリガ裏で自動AD変換させる
DMAC1-1AD変換結果移動用
DMAC1-7AD変換同期ポート制御
TIM6周期割り込み制御ルーチン

各ペリフェラルの初期設定はだいたい以下の流れとなる.なお,このあたりの設定はライブラリに付属のサンプルプログラムとライブラリのマニュアルを参考にしている.

  1. 使用するペリフェラルへのクロックをENABLEにする
  2. 使用するポートの入出力を設定
  3. 設定値を構造体に書き込む
  4. その構造体をペリフェラルのInit関数に渡して設定
  5. タイマ,割り込みなどをENABLEにする

まとまっていない情報

メモ書き程度に既知の問題点などを列挙.

更新履歴

2010/03/28 マイクロマウス関西支部勉強会の内容をうけてページ作成
2010/03/31 メールアドレスを追加
2010/04/02 RAM,ROM領域割り当てを図解
2010/04/08 コンパイラをインストーラを使ってインストールするように変更.Qt CreatorをIDEとして使う方法を紹介.
2010/11/12 STM32のライブラリなどリンクが変更されているので修正.
2011/1/8 開発環境が安定してきたので情報の整理を開始.古い情報の除去.
2011/2/15 ライブラリの更新をうけて現状のSTM32programではコンパイルエラーとなることが発覚.
2011/2/16 ライブラリv3.4.0に対応したSTM32programをup.
2011/2/21 64LQFPチップの向きに関する情報を更新.
2011/2/25 最小回路構成を追加.
2011/2/26 ライブラリのドキュメントPDF版について追加.
2011/3/2 STMprogramの修正版v2.2.1をup.
2011/3/4 STMprogramのv2.2.1にバグ発見.修正版v2.2.2をup.
2011/3/8 Eclipseにはmakeが付属してないことに気付く.代替策を追記.
2011/3/13 flashへの書き込み後teratermお手軽起動方法について記述.
2011/5/21 rlog.cpp, rlog.hをup.使用方法を記述.
2011/7/23 STMprogram_v2.3.2をup.変更点はフォルダ内のchange_log.txt参照
2011/9/3 parameter_110903.zipをup.その使用方法について記述を追加.