STM32

STM32 old contents

CONTENTS

cygwinのインストール (OLD)

ここからcygwinをインストールする. Devel内にあるmakeをインストール指定すること.それ以外はデフォルトでよいと思う.
以下cygwinインストール先はc:\cygwinであるとする.

コンパイラのインストール(OLD)

この項目は近いうちに消します.

codesourceryのコンパイル済みgccを使う. codesourceryにあるtargetOSがEABIのものを使う.そのリンク先から"IA32 Windows TAR"をダウンロードして、c:\cygwin\usr\local\におく.
2009/12/26時点でのファイル名は"arm-2009q3-68-arm-none-eabi-i686-mingw32.tar.bz2"
.tar.bz2は,そのディレクトリで

$ tar jxvf arm-2009q3-68-arm-none-eabi-i686-mingw32.tar.bz2

として展開.展開すると"arm-2009q3"というディレクトリができる.名前が異なる場合やインストール先が異なる場合はmakefile内のTOOL_PATHを書き換える必要がある.

Qt Creator IDEのインストール (OLD)

補完機能があってlinux,windowsともタダで使えてmakeが実行できるIDE(ほとんどエディタとしてしか使わないが)としてQt Creatorを使ってみる.
ウィンドウ分割とかもできてなかなか素敵.

Qt Creatorのダウンロードページの下の方にある"Qt Creator IDE"をダウンロードしてインストールします.セットアップウィザードは全てデフォルトで進めればよい.

プログラムのコンパイル(Qt Creator IDEから)

IDEは使い方がわかるまで大変ですが,今回は以下の手順だけです.

  1. "Qt Creator"を起動する
  2. "ファイル > プロジェクトの新規作成 > Makefileベースのプロジェクトをインポート"で後に説明するプロジェクトフォルダ(STM32program)を指定してプロジェクト作成.
  3. "ビルド > すべてビルド"でmakeを呼び出してコンパイル

なお,STM32program内では文字コードUTF-8を使っていますので,
"プロジェクト > エディタの設定 > デフォルトの文字コード"をUTF-8にします.

パスの設定

環境変数に
変数名: PATH
変数値: C:\cygwin\bin
を設定します.すでにPATHが存在する場合はセミコロン(;)で区切って追記します.

プログラムのコンパイル(コンソールから)

STM32programディレクトリで

$ make

してコンパイル.
依存関係で,ライブラリ,staticプログラム,mainプログラムを全てコンパイルします.もちろん2回目以降は変更されたファイルだけ.

2017年 12/3 古い内容としてこのページに移行

開発環境(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
&ref(): File not found: "folder_v2.2.0.png" at page "STM32_old";

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も書き換える必要あり. &ref(): File not found: "memory.png" at page "STM32_old";

最新版(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)