STM32等のARMマイコンをGCCでビルドする(2017年度前期版)

OpenOCD for Windows is HERE!
↑ねむいさんは自前ビルドのOpenOCDバイナリ公開してます。
 解説はこのバイナリを基にすすめますので4649!


当記事はWindows環境下におけるARMマイコンの開発環境構築”入門”ではなく、
私が公開しているプロジェクトをビルド/デバッグするために必要な最小限の手順の
指南という位置づけです。
はっきり言いますが初学者向きの解説ではありません。専門的な語句の意味や
GNUMakeを駆使したコマンドラインビルドの方法を熟知している前提で話を進めます。
初めてSTM32等のARMマイコンやXMEGA等の大規模AVRマイコンに触れ、情報を
求めて迷い込んできたという方は私のぶろぐの事は忘れて回れです。

2017年現在は無料のEclipseベースの開発環境CoIDEGNUARMECLIPSE
無償版は機能は一部限定ですがAc6 System Workbench for STM32MDK-ARM
2品種、そしてオンラインコンパイラ+ライブラリ等の強力なサポートがあるmbedなどが充実して
おり、一般的な事柄を学びたい初学者の方にはそちらを強くお勧めいたします。


ちなみにねむいさんはメーカサポートが無い素のEclipseを使うと「あわびゅ!」と
叫びながら全身からを吹き出して死ぬ奇病に罹っていて、且つCygwinを使うと
バストサイズが強制的に20cm減のマイナス補正を喰らい(=フラットなB(Breasts)特性
を持ついないさん
と同レベルに堕ちてしまい)虹裏メイドねむいさんとしての
あいでんてぃてぃを完全に失ってしまうため、当ぶろぐでは絶対に扱いません。


 ※要注意※
   ツール群の盛衰や時勢により時々刻々と本記事の内容は変化していきます!



●必要なもの
 1.ARM用GCCコンパイラ
  とにもかくにもまずはこれです。
  現在はLaunchpad.netが提供し、ARM本家から配布されている
  GNU Tools for ARM Embedded Processors
  を強くお勧めします。主にCortex-Mx向けとなっておりますがLPC2388等のARM7TDMIも
  しっかりサポートしており古い品種でも問題なくビルドが可能です。

  今回の手順ではダウンロードした上記コンパイラをC:/Devz/ARM/launchpad直下に
  解凍するものとします。解凍後launchpadフォルダにはarm-none-eabi,bin,share,libの
  4つのフォルダがあるのが正解です。

  ほかにWindows環境下で動くARM用GCCコンパイラとして、Bleeding Edge Toolchain
  やdevkitARMなんかもあります。いずれもABIEABIで2017年現在流通している
  最新のコンパイラはもはやすべてEABIとなっています。


 2.サポートツール群
  ねむいさんが公開しているプログラムはコマンドラインビルドを想定しています。
  IDE全盛の昨今は古臭いものとなってしまいましたがmakeコマンドでビルドするという
  ベタベタなクラシックな手法を敢えてとっています。makeの他にunixコマンドのechoや
  rmなどを用いているので、これらのunixライクなコマンドをネイティブなWindows環境下
  で動かすことができるCoreutilsを使用します。

  a.Coreutils本体
   有志の方々が作成されたCoreutilsの"Binaries"のリンク先をダウンロードし、
   2バイト文字やスペースを含まない任意のフォルダに解凍してください。
  b.GNUMake3.81
   次にGNUMakeを同様にダウンロードしたあと解凍しCoreutilsを解凍した
   場所と同じフォルダに置いてください。
  c.サポートDLL群
   最後にmakeをダウンロードしたページの下にある"dependencies zip file
   (中身はlibintl3libiconv2)"をダウンロードしGNUMakeと同様の処置をしてください。

  今回の手順では上記3点がすべてC:/Devz/Coreutils/bin内にあるものとします。
  このbinフォルダ内にmake,echo,rm等のunixライクコマンドとdepedenciesの
  libintl3.dll,libiconv2.dllが存在していることを必ず確認して進めてください。
  ここで間違ってるとpn2からmakeを呼び出す段階でコケて失敗します。
  
  よくやる間違いが、最初のCoreutilsを解凍して出てくるbinフォルダの中に
  さらにmakeやdepedenciesの入ったbinフォルダを置いてしまうことです。

 

C:/Devz
   ├ARM
   |└launchpad
   | └bin (←GCCコンパイラのバイナリがある場所)
   ├Coreutils
   |└bin (←make他unixライクコマンド群のある場所)
   └ocd(←openocd.exeのある場所)
↑ねむいさんは上記のディレクトリ構造にしています。
  以下この構成で話を進めます。


  ちなみにAVRToolChainでもARMと同じような感じのディレクトリ構成にすると同じ
  感じでWinAVRの頃みたいにコマンドラインビルドが出来ますのでおすすめです。

  ※以前はWinAVRのutils配下にあった同様のファイル群の使用を推奨していましたが、
   WinAVRは開発が停止し数年経ち、フリーで利用できるAVRToolchainに主流が移行
   したのでもう一切使用しませんし使ってはいけません。


 2.5.sh.exeが見つかりません対策(必ずしも必要ではない)
  ネット上で手に入るARMマイコンのGCCプロジェクトの中ではWinAVRのmakefileを
  ベースにしたものがいくつか存在し、そこにはshell関数などのbashに依存した記述が
  数か所あります。この記述が含まれているとまともにビルドができません

  当ぶろぐで公開してるプロジェクトはmakefileからbash(/bin/sh)に依存して
  いる記述はすべて排しておりますが、他の方のプロジェクトをビルドする際の
  回避措置として紹介します。
  こちらからwin-bash.zipをダウンロードし、解凍して出てきたwin-bash.exeを
  Coreutilsのbinフォルダに突っ込んでください。次にmakefile ファイル中に
  記載されているはずのSHELLの設定を以下のように書き換えてください。
  SHELL = sh
  ↓
  SHELL = win-bash.exe
  bash.exeは自身のファイル名によって特殊な動きをするので横着してwin-bash.exeの
  方をsh.exeとリネームしてしまうと逆にビルドが通らなくなります。ご注意ください。



 3.エディタ
  メモ帳でせこせこ編集してコマンドプロンプトからmake実行してもいいですけど
  makeを引数つきで呼び出せられるエディタを使えばIDEのように使えます!
  ねむいさんのお勧めはProgrammers Notepad2(PN2)です。素のEclipseは(ry
  ビルド時の解説はこのPN2を使用して解説します。

  注:必ずStable2.3以降を使用してください。
    また、日本語入力に対応するために下記の要領で多バイト文字の設定を
    ”Shift-JIS”に変更しておいてください。
   

  それとPN2のインストール先は好きにしていいですけどなるべくスペースや
  2バイト文字が混ざるディレクトリにしないようにしましょう。
  

 4.デバッガソフトウエア&ハードウエア
  ARM用のデバッガはホビーユーザーご用達のGDBサーバであるOpenOCDを使用します。
  また、MCUとJTAGで通信するハードウエアはFTDIのFT2232系JTAG-I/Fを使用するのが
  スタンダードになっています。これらに関しては次回詳しく紹介します


●下準備とビルド
 ※以後はエディタとしてPN2をインストールして使うことを想定して解説します。

 1.ソースコードの展開
  今回の凡例として、STM32F4向けの液晶表示プログラムをダウンロードしてローカルに
  落としたzipファイルをローカルフォルダに展開します。
  このときディレクトリパス(アドレス)にスペースや2バイト文字が絶対に入らないよ
  うにしてください。
  

 2.makeファイルの編集
  PN2がインストールされている場合、拡張子pnprojのアイコンをダブルクリックす
  ると下のような画面になると思います。"makefile"をクリックして編集画面を
  出しましょう。
  

  下画像の要領でそれぞれの環境に合わせてARM用GCCコンパイラ、サポートツール群、
  デバッガのディレクトリパスを設定していきます。パスの区切りは"¥"ではなく"/"を
  使用してください。
  ディレクトリパスはスペースや2バイト文字が絶対に入らないようにしてください。
  大事なことなので二度言います!!

  
  

  ぇ?makefileの読み方書き方が分からないから教えろですって!?
  出直してきなさい!


 3.PN2の設定
  PN2をインストールしたての人は、makeコマンドをPN2の"TOOL"から呼び出すことが
  出来るように以下の要領でmakeコマンドを引数"all"つきで登録してください。
  その後、"build","clean"の引数についても同様に登録してください。
  
  
  

  重要:Windows環境変数のPATHはもはや設定する必要はありません!
     逆に下手に設定しているとビルドが通らなくなるので注意してください。


 4.ビルド開始
  
  ビルドの前に…デフォルトでは評価ボードの設定はSTM32F4Discovery向け
  になっています。これをSTM32F4系に汎用な形でビルド/デバッグしたい場合は
  上記画像のようにEVAL_BOARD = REDBULLにしてください。
  また、各評価ボード設定時の各ピン配置を知りたい場合は同梱のdoc/Boards.txtを
  参照してください。

  設定が終わったら"Tool"から"make all"を呼び出しビルド開始です。
  

  上記の液晶表示プログラムはデフォで下記のライブラリ/ドライバを有効にしてます。
    -libjpeg
    -libpng
    -giflib
    -FONTX2ドライバ
    -抵抗膜式/容量性タッチパネルドライバ(特定のボード限定)
    -HelixMP3デコーダ(特定のボード限定)
    -HelixHE-AACデコーダ(特定のボード限定)
  数分ほど時間がかかります。Warningが出ますがビルド時の設定喚起の
  ためにソースコード中に"#warning"プリプロセッサを敢えて入れてる箇所が
  いくつかありますので気にしないでください。
  エラーが出てビルドが止まった場合は各種設定を見直しましょう。殆どの場合、
  makefile中でPATHの設定を誤っています。

  ちなみに"make all"はコンパイルしたオブジェクトを全部消してまっさらにしてから
  ビルド、"make build"はすでにオブジェクト吐かれたソースはスルーしてビルド(ソー
  スコードを一部書き換えてカット&トライしたいときに最適)です。
  "make clean"はその名のとおり生成されたelfやhexファイル含めてアセンブラリスト
  ファイルやオブジェクトをまるっと消去してしまいます。


お次はターゲットCPUへの書き込み&デバッグですが…長いので次回に続きます。

GPSを試用する2

20140328追:
最強のGNSSモジュールGms-g9をゲットせよ!


前回作成したSTM32Primer2を使ったGPSロガーはさまざまな厳しいフィールドで活躍し、
輝かしい実績を残してきた・・・といいたいところですが、実際は使ってるうちに不都合
がいくつも見つかりそれをひとつずつ少しずつ潰していきながらやっと長時間安定して
ロギングを行えるところまで持っていくことが出来るようになりました。

一番の強敵は衛星を捕捉していてもロギングがランダムで停止してしまう現象に遭遇
したことで、どの部分で問題を起こしているかという切り分けにかなり時間を要しま
した。東海自然歩道のルートで言うと湯ノ山温泉->西藤原のルートから始まって笠置
->奈良くらいまでは特別なファームをあれこれ試したりノイズ抑制のためにコンデンサ
追加したり導電性エアキャップにやさしくくるんだりあれこれ試してようやく不具合を
特定しました。(結局FatFsの書き込み時のエラー処理が不適切なだけだった・・・)




ついでに使っているGPSモジュールもGM316+外部アンテナから秋月さんちから2月にライ
ンナップに加わったCanMore製のGT-723Fに変更し、なかなかの結果を収めています。
un
↑比較表作ってみました。
GT-723Fは衛星を見つける最初期のacquisition(同期捕捉)の段階では80mA以上喰って
しまってしますがtracking(同期追跡)状態に入ると32~36mA前後まで落ち着き、結果的
に野外で使うなら電池の持ち的にもGM316+外部アンテナで使うよりも有利なのが分か
りました。主人の持ってたGT-720Fは常時180mA位馬鹿食いしてたのをかんがみると技術
って進歩してるんだなぁ・・・とおもうことひとしきりです。
un
↑現在の運用形態。STM32 Primer2からVCC,RxD(STM32 Prime2側),GNDを引き出し、
 なおかつGT-723Fは別に基板を設けてそこに固定し、機械的にも接続を強化しています。
 また、このモジュールは+3.0Vからの電源入力に対応していますので、STM32Primer2だと
 LCDのバックライト電源からパワー(3.1Vavg)を拝借する形になります。
un
↑尤もSTM32Primer2いじり倒してる人はとある理由で当然電源周りも改造していて原形と
 どめてない人も多いでしょうからもう好きにすればいいと思いますよ(←投げやり気味)。
un
↑JR笠置駅にて。
 ねむいさんチキンなので実際に使う時はGPSモジュールを導電性エアキャップにくる
 み、さらにここからSTM32Primer2全体をGPSモジュールごとくるんで物理衝撃対策し
 てます。この状態でもザックにぶち込んだ状態で氷点下の環境はもちろん猛暑の中
 でも安定して動作したので満足です♥
 タフすぎて そんはない


肝心の捕捉精度なんですけどGT-723Fはパッチアンテナのみですが深い森の中でもしっ
かり衛星を握ってくれていて、逆にトンネルやトイレ等の電波が完全に遮断される場
所では案外簡単にぱっと手放してくれるようです。GM-316の場合は電波が途切れても
捕捉状態から離れずでたらめな場所を記録してしまうことがよくあったので山中の行
動の記録に使う用途としてはGT-723Fのほうが良いかとおもいます。
それとGT-723F買ったときに結局ついでに買ってしまったのですが市販品のスポーツガイ
ドメイト
と比較した場合もほとんど引けをとらない結果になってます。
un
↑結局買ってしまった・・・Garminは高いから論外で(欲しいけど)
un
↑スポーツガイドメイトは電源ボタン長押しでOFFではなくワンプッシュでOFFとなっ
 てしまう設計のため、ザックに無造作に放り込んで山野を走るような荒っぽい使い方
 は出来ないのが難点です(自転車に固定して使うことを想定されているようです)。
 PCとの接続は内蔵のUSB-シリアル変換でUSB経由でデータの読み書きをします。
un
↑これはJR奈良駅から近鉄長谷寺までのルートを同時に記録したものです。
 ほとんどぴったり重なっちゃってるんですけど赤のラインがスポーツガイドメイト
 で青が自作のGPSロガーです。

本末転倒になってしまっていますが、ロギング中に一方が何らかの理由で停止しても
困らないように現在は両方持って山に行ってます。
本当に本末転倒ですがもういいです(投げやり気味に)。



おまけ
私のぶろぐの中でpvが圧倒的に少ない、つまり人気が無いのが東海自然歩道関連の記
事なのですが、一部の方々にブラウザのベンチマークとして使われているのを知って
まぁ少しは役にたっているかなと思ふことひとしきりですが、それはおいといて山に興味が
ない方はドリフの雷様的な物とおもってあきらめてください。

東海自然歩道の山の辺ルートは本道ではないのでぶろぐには書かないつもりでしたが、
今回は特別にダイジェストを。

石山->宇治
un
このルートは99%舗装路でした。
un
ゴール地点の平等院鳳凰堂。
un
宇治茶のアイス(宇治茶+桜だそうな)

宇治->原山
un
やっぱり舗装路。
un
見所(というかこれしかないけど)の鷲峰山。
un
加茂駅の昔からある倉庫。
(※体力あまってたので原山から加茂駅まで走って帰りました)


原山->笠置
un
童仙房山荘。
un
ないおん!
un
高山ダム。ここから先が長い。
un
関西本線が間近に!
un
ゴール地点のJR笠置駅にある良く分からない像。


笠置->奈良
un
柳生家老屋敷。
un
一刀石。
un
日照が体力を削る季節になってきました・・・。
un
峠の茶屋。
un
鹿。


奈良->長谷寺
un
鹿。
un
一番やさしいルートですが夏場だけは
逆に一番過酷なルートに!!!
un
石上神宮。
un
大神神社領からの展望。
un
狭井神社のハイテク御神水供給装置。
un
長谷寺山門
un
長谷寺駅からの夕暮れ。


これから夏本番です。夏場の激しい運動は熱中症や脱水症状という直ちに死ぬ危険
性の高いリスクが常に付きまといます。ねむいさん絶対に日焼けしたくないので長袖とUV
カットのゴーグみたいな眼鏡で完全ガードしてるおかげで上記のリスクがさらに高ま
るので一応そっち対策もばっちりしてる(つもり)です。
欲張らずに走る距離は30km以内に抑え、朝早く出発して遅くとも15時までには走り
終えて帰るというのを心がけるようにしてます。
あとせっかく体重落ちたのに風呂上りにうっかりビール飲まないようにsh…
ビールには勝てなかったよ…プハー♥

Go to top of page