今回は、STM32の互換性の話。
データシートだけでは、本当のところが判らないので、実際に買って試してみた。
さすがに、全品目買うわけにはいかないので、左の写真のように適当に選んで購入して、テストしてみた。写真の上段左から STM32F100VET6B STM32F101C4T6A STM32F103RGT6 STM32F105R8T6、下段左から STM32L152C8T6 STM32F205RBT6 STM32F405RGT6 である。
結論から言うと、
・シリーズ内では、ハード/ソフト共に極めて互換性が高い
・シリーズ間では、ハード/ソフト共に、やや互換性が落ちる
である。
詳しく説明する。
まず、どのようなテストをしたかだが、全ての CPU には、最低限の外部部品を配線した。概ねパスコン及びリセット用のコンデンサーと電源としてのは単三電池2本、それとプログラム書き込み用の JTAG 端子だけである。CPU内蔵のクロックを使ったので、水晶も使っていない。
動作確認用として、全ての機種に存在する Bポートの 11ビットに抵抗を介して LED を配線している。
プログラムは、JTAGkeyクローンと ST-LINK で書き込んだ。もちろん、LEDチカチカするプログラムである。
【ハードウエア互換性】
F1シリーズ内とL1シリーズ内は、完全な上位ピンコンパチだ。
パッケージのピン数が同じなら、ピンの配置は同一だし、ピン数が増えても増えた部分は主にパッケージの四隅に集中しており、そのまま存在するピンの配置は同じようになっている。
もちろん、機種ごとに周辺機器が違うので、低位のCPUには無いピンの機能もある。例えば、F100やF101にはUSB用のピンが無いが、F102より上位のCPUにはUSBがある。上位CPUでUSBに割り当てられているピンは、下位CPUでは単純なI/Oポートになっている。これらのピンは、上位CPUでも起動時デフォルト状態では、下位CPUと同じ単純なI/Oポートとして使える設定になっている。プログラム上で、USBとして使用するように設定すれば、USBピンになる。このように、上位互換性が取れている。
同じようにF2シリーズ内とF4シリーズ内も、上位ピンコンパチだ。つまり、ピン配置的に言うと STM32は「F1シリーズとL1シリーズ」のグループと「F2シリーズとF4シリーズ」のグループの2グループに分かれていて、それぞれのグループ内では、上位コンパチブルになっている。
では、「F1/L1グループ」と「F2/F4グループ」で、全くピン配置が違うと言うとそうでも無い。
実は、違いは電源周りだけだ。「F2/F4グループ」には、VCAP/PDR_ON/REFGOFFが新設されている(PDR_ONは100ピン以上のパッケージにしかない。REFGOFFは現状持っている品種が無い)。
VCAPは、CPUに内蔵された定電圧レギュレータの平滑コンデンサー用のピンだ。あって当然というか、むしろ「F1/L1グループ」が平滑コンデンサー無しで動作している方が驚きとも言える。PDR_ONは、入力電源の下限値と動作可能温度範囲を変更するためのピンである。VCAP/PDR_ON共に「F1/L1グループ」では、VSSのピンに割り当てられている。その他、「F1/L1グループ」と「F2/F4グループ」で、VDDとVSSが逆転しているところもある。もし、「F1/L1グループ」と「F2/F4グループ」で共通して使うプリント基板を作る場合、上記のように電源周りだけは、気を付けなければならない。マニュアルにも書いてあるが、数カ所ジャンパーを設けるだけで対処できる。
【プログラムの書き込み】
最新版のファームウエアにアップデートした ST-LINK なら、全てのCPUに書き込みができる。
JTAGkey クローンの場合、OpenOCDのバージョンによって異なる。リリース版の OpenOCD 0.5.0 の場合、STM32F100VET6B と STM32L152C8T6 には書き込めなかった。GITで拾った最新ソースで構築した OpenOCD 0.6.0 だと、全ての CPU に書き込めた。この違いは、CPUのIDが OpenOCD に登録してあるかによる。
なお、STM32F405RGT6 に関しては、「F205のIDになっている」とのエラッタが出ているので、それで、古いバージョンの OpenOCD 0.5.0 でも書き込めたのかも知れない。エラッタが修正されると、OpenOCD 0.5.0 で書き込めなくなる可能性がある。
【ソフトウエア互換性】
プログラムが書き込めるからと言って、必ずしも正常に動作するわけではない。
最も下位レベルのCPUである STM32F101C4T6A (全STM32ファミリー中、価格が最も安い)に合わせて作った LED チカチカプログラムのバイナリを全てのCPUに書き込んだところ、F1シリーズは全機種、何の問題もなく動作した。しかし、L1/F2/F4シリーズは動作しなかった。
元々のプログラムはF1シリーズ用のヘッダ・ライブラリを使っていたので、これらをごっそり F4シリーズ用に交換しコンパイルしたら、F4シリーズで動作した。しかし、このバイナリを他のシリーズに書き込んでも動作しなかった。L1とF2もヘッダ・ライブラリを交換したら動作すると思うのだが、まだやっていない。
結論としては、シリーズ内は、バイナリーレベルのソフトウエア互換性がある。しかし、シリーズをまたぐと、シリーズ専用のヘッダ・ライブラリを使ってコンパイルしなおす必要があると言う事になる。
とまあ、こんなところ。
・シリーズ内は極めて互換性が高いから、シリーズ中一番低いレベルのCPUから始めてステップアップしても、一番高いCPUから始めても構わない。
・シリーズ間のハードウェア互換性は、電源周りが違うだけ。プリント基板を作るなら、数カ所のジャンパーで済むから、「F1/L1グループ」と「F2/F4グループ」で共通して使えるようにしておくと良いかも。
・シリーズ間のソフトウエア互換性は、シリーズ専用のヘッダ・ライブラリを使った再コンパイルが必要になる。これが面倒と思うか、どうかは、個人の考え。
と言うわけで、私は安いものから始めた方が良いと思うので、184円の STM32F101C4T6A から始めた。高機能高性能が良いなら、1243円のSTM32F405RGT6 から始めるのも一つの手ではある。(価格は、2011.12.24現在、Digi-key調べ)
注意
ブログのコンテンツの内、「告知」など時期よって情報価値が無くなるのは除いてある。また、コンテンツに付いたコメントは書き込み者に著作権があるものと判断し、ここに持ってきていないので、コメントを見るときは、元々のブログコンテンツを参照してもらいたい。
その他、ブログ発表後、コメントなどの内容を反映するなど、内容を変更しているものもあるので、注意してほしい。