ロボット工作研究室Wiki - STM32メモ
STM32に関する情報を適当に書きます
体系化されていないメモ書き程度のものなので、あまり期待せず



長所・短所

小型ロボットから見た長所・短所

長所

  • 小ピンで高速・大容量
  • 消費電力が少ない
  • タイマが高機能・エンコーダー入力可能
  • AD入力が多く、AD変換の順序なども自由に組み替え可能
  • 書き込み手段が多い
  • 外付けリセットIC不要
  • 外付けクリスタルも不要(最大クロックが多少落ちるのと、USBは使えなくなります)
  • アナログ入力を除くほとんどのピンが5Vトレラント
  • 動作電圧範囲が広い

短所

  • 日本語資料が少ない
  • 日本語ツールも少ない
  • まだまだ入手性は良くない
  • 開発環境の構築が大変(最近はそうでもないですが)
  • 機能がかなり複雑で、把握が大変
  • 資料も分散していて、どこに何が書いてあるのか調べるのが大変
  • フラッシュが2ウェイト

入手

DesignWaveMagazineの付録基板を持っているあなたは幸運です。
最近だと、ストロベリー・リナックスがSTM32に注力しており、容量の比較的大きいボードが3000円で入手できます。
チップ単体は、RSでも一応売っていますが、取り寄せで納期がかかるので、Digi-Keyが無難かと思います。
STM32-Primer2っていうのもあるみたいですが、持ってないので良く知りません。見た限り、ロボット開発にはあまり向かない感じです。

Ride7の導入

今STM32を始めるにあたって、一番面倒の少ないのはRide7を使用することではないかと思われます。
英語を我慢すれば、ですが。
簡単に手順を紹介してみます。

ダウンロード・インストール

Raisonanceのダウンロードページから、IDEとツールチェインをダウンロードします。
それぞれ別々にインストールすることに注意してください。ちなみに、コンパイラはCodeSourcery G++と同じものらしいです。
あとはインストールウィザードに従ってインストールします。



ペリフェラルライブラリのダウンロード

STのダウンロードページから、STM32 > Firmware と選んでいき、STM32F10x_StdPeriph_Libをダウンロードします。
展開先は、パスに全角文字やスペースを含まないフォルダの方が後々安心かもしれません。大丈夫とは思いますが、念のため。
2010年5月現在の最新版はVer.3.3.0でした。DesignWaveMagazineの付属資料はすでに古く、ライブラリの仕様も大きく変わっているため注意が必要です。



テンプレートからのビルド

思ったより使いにくかったので、自作しました。↓にあります

展開したら、"Project"フォルダを開きます。"STM32F10x_StdPeriph_Template"というフォルダがあると思いますが、これは各種開発環境向けのテンプレートが入っています。
このフォルダを同じ場所にコピーして、適当に名前を変えてやります。



中にはサンプルソースと各種開発環境向けのプロジェクトファイルが入っています。Ride7用のもの以外は不要なので消しておきます。



あとは、"RIDE"フォルダの中にRide7用プロジェクト("Project.rprj")がありますので、ダブルクリックすればRide7が起動します。

Project > Properties メニューからプロパティダイアログを開き、使用するデバイスの品種に合わせて設定を選びます。
Medium-densityはSTM3210B-EVAL、High-densityはSTM3210E-EVALです。詳細はReadme.txtに書いてあります。
他は面倒な設定もなく、そのままメニューから"Build"を選べばビルドが成功すると思います。





新しく"STM32_EVAL"フォルダが作られていると思いますので、中にHexファイルが生成されていることを確認します。
あとは、自分で好きにソースコードを追加して開発を進められます。
なお、テンプレートではライブラリが一部しか読み込まれていないので、欲しい機能を追加する場合、プロジェクトの"StdPeriph_Driver"に"Libraries\STM32F10x_StdPeriph_Driver\src"内の該当ソースを追加した上で、stm32f10x_conf.h内の該当ヘッダファイルのインクルードのコメントアウトを外します。

ライブラリには各種サンプルコードも同梱されているので参考になると思います。

DFUへの対応


プロジェクトの設定から、リンカのコマンドライン引数に
-Wl,--section-start -Xlinker .isr_vector=0x08003000
を追加することで開始アドレスを0x08003000へとずらすことができるようです。
またそれとは別に、プログラム中でベクタテーブルを再設定する必要もあります。

自作テンプレート

 ライブラリ付属のテンプレートが思ったより使いにくかったので、自作しました。個人的な好みがかなり入ってますが。
 こちらのページからダウンロードできます。
 以下、Readmeの内容です。

■ CQ-STARM および STBee 向けRide7用プロジェクトサンプル(DFU対応)

解凍場所は、Cドライブ直下などの、スペースや全角文字を含まない
ディレクトリを推奨します

Projects\ride_test1 にプロジェクトおよびソースファイルが入っています
Ride7がインストール済みであれば、"project1.rprj"をダブルクリックすれば
Ride7が立ち上がるはずです

サンプルを取っておきたい時はフォルダごと適当にコピー・リネームして使ってください
ただしディレクトリ階層は同じにしてください。ライブラリが読み込めなくなります

起動したら、メニューの Project > Properties より、設定を選択してください
選べるのは以下の4通りです
  • CQ_STARM
  • CQ_STARM_DFU
  • STBee
  • STBee_DFU

後はビルドすればHexファイルが生成されます

DFU版は、リンカのオプションに
  • Wl,--section-start -Xlinker .isr_vector=0x08003000
と加えることで開始アドレスをずらしています

また、マクロに"DFU"を追加して、ソース上でベクタテーブルの位置を
切り替えています(main.cの114行目)
サンプルでは割り込みを使っていないのであまり意味はないですが

コンパイラ設定のCQ、STBEE、DFUの3つのマクロはライブラリとは無関係です
他のマクロはライブラリで必要なものです

サンプルの内容は
  • 内臓オシレータを使用した立ち上げ、
  • シリアル通信による"Hello World!" (USBの仮想COMでなく、単純なUSART)
  • LED点滅
です

LEDポートもマクロで切り替えているので、どちらのボードを使うかによって
ソースをいじる必要はありません

内臓オシレータを使用しているのはクリスタルの違いを無視するためです
ロボット等の用途には、どのようなクロックで動作しているのか
正確に知ることが必要不可欠だと考えているので、ライブラリ標準の
初期化関数は使いませんでした

他の機能を使いたい時は、
プロジェクトの"StdPeriph_Driver"のところに
"Libraries\STM32F10x_StdPeriph_Driver\src" フォルダ内の
該当ソースファイルを追加し、
stm32f10x_conf.h 内の該当ヘッダのインクルードのコメントアウトを
外してください

同梱のライブラリは StdPeriph_Lib_V3.3.0 のものです
一部のファイルを省いています

使用した環境は
Ride7 7.28.10.0075
RKit-ARM 1.24.10.0050

また、CQ-STARMで動作検証しました
STBeeは動作未検証です
 ⇒正常動作したとの報告を頂きました

日本語表示


 Ride7はデフォルトのフォントが英字フォントなので日本語が表示できません。
 Options > Editor preferences より、エディタのフォントをMS ゴシックなどに変更すれば一応表示できるようになります。
 ただ、内部的に文字を1バイト単位でしか扱っていないようで、文字列の選択や削除がおかしな挙動をします。
 すぐにエラーが起きるわけではないので、使えなくはないですが、なるべく使わないに越したことはないでしょう。コンパイラの問題もありますし。

 エディタもこの調子なので、GUIの日本語化はあきらめた方がいいでしょう。

割り込み関数名


スタートアップファイルとかmapファイルの中身を見ると、割り込みハンドラがどういう名前で定義されているか分かる。
まあ本当はどこかのドキュメントにちゃんと書いてあるんでしょうが。
使いそうなものを自分用にメモ。

SysTick_Handler
EXTI0_IRQHandler
ADC1_2_IRQHandler
TIM1_UP_IRQHandler
TIM1_CC_IRQHandler
TIM2_IRQHandler
SPI1_IRQHandler
USART1_IRQHandler

シリアル書き込み

書き込み方法としては他にJTAGやDFUがありますが、自分はシリアル経由の書き込みを愛用しています。
理由はいろいろあるのですが・・・
  • シリアル接続の方がPC側のツール開発が楽
  • 配線が最小限ですむ
  • コストが少ない
  • ロボットを「動かしている時」には有線接続できないので、デバッガはあまり役に立たない
  • DFUを使うには外付けクリスタルが必要
  • ドライバの心配がない(FTDIのチップを愛用。ドライバの対応が早い)
  • 電気的特性にさほど気を配る必要がない
  • ブートローダがシステムメモリに標準で書き込まれており、消してしまう心配がない

・・・などです

書き込み手順としては・・・
・使用するツールはFlash loader demonstrator。(STのダウンロードページ > STM32 > Software - PC > Flash loader demonstrator)
・PA9のUSART1_TXとPA10のUSART1_RXにシリアル接続。(他ポート未確認。5Vトレラントあり)
・BOOT0をHに、BOOT1をLにして電源入れるとシリアルブートローダが起動。
・Flash loader demonstratorでHEXファイルを書き込み

コマンドライン版も同梱されており、毎回Flash loader demonstratorを起動するのが面倒なら、
バッチファイルなどを作ってコマンドライン版を使うのもいいかもしれません

DFUの修復

DFUファームを壊してしまっても、↑のシリアル書き込みで修復可能です。
付録基板用のDFUファームの改良版がねむいさんのぶろぐで入手可能です。
STBeeのファームはストロベリーリナックスにメールすれば送ってもらえるようです。

DFUファームは基本的に自分自身を書き換えることはしないので、DFUのみ使っている限り、開始アドレスを間違えていたとしてもちゃんと動作しないだけで、DFUファームを壊してしまうことはないようです。

リンク