STM32をはじめとしたARMマイコンをInsightとOpenOCDを使ってデバッグする環境を整える(2016年度中期版)

この記事は前回からの続きです。前回のものよりちょっと内容が難しくなってます。
前回の内容を基に環境を構築していることが前提で話を進めさせていただきます。
今回はOpenOCDを使用し実際にARMマイコンにJTAG/SWD経由でフラッシュ書き込み・
デバッグを行うところまでいきます。もちろんNO-Eclipse,NO-Cygwinです。

※今回の記事も時代に合わせて適宜加筆修正していきます。


●必要なもの
 1.ARMマイコンが実装されたターゲットボード
  凡例として、STM32F4シリーズであるSTM32F407ZGT6が乗ったボードを使用します。
  私が配布しているSTM32F4向けのFatFs移植例は、デフォルトのターゲットボードが
  STM32F4Discovery、デバッガハードウエアがSTLink/V2となっていますのでご注意を。
  
  
  先ずは上記の形になるようmakefile中の評価ボード/デバッガ設定を変更してください。
  また、FT2232系ドライバとしてWinUSB(libusb-1.x系)を使用します。"MPSSE = ftdi"の
  定義をコメントアウトするとLibUSB0.1系のAPIでアクセスするようになりますが、1.0系
  より低速になります。また、2015年現在のOpenOCDのバージョンでは"Deprecated"
  となっています。今は1.0系(WinUSB)を必ず選択してください。


 2.JTAG/SWDデバッガハードウエア
  上記のCortex-M4はデバッグユニットとしてJTAGとSWDという接続方式の両方をサ
  ポートしています。ARM7TDMIはJTAGインターフェースのみでした。

  現在、ホビーユーザーが手軽に利用できるものとしてFT2232系を使ったJTAGデバイスが
  主流です。以後の解説はそれを利用したJTAGKey2互換の"JTAGKey2 Compatible"
  を使用しJTAG接続にて解説していきます。
  JTAGKey2 Comatibleを自作される方はこちらの解説を参考に。

  SWD接続についてはCMSIS-DAPが現在の主流となっています。NxP系の評価ボード
  にはmbed版としてデフォルトで搭載されているのでおなじみだと思います。
  その他の品種ではVersaloonや上記のJTAGKey2CompatibleでもSWD接続可能
  なっています。
  STLink/V2.STLink/V2-1もSWDで使用可能ですがOpenOCDからの扱いが特殊です。
  こちらにつきましては追補の形でここに手順を記載しましたのでご参考に。


 3.OpenOCD
  OpenOCDはターゲットMCU(ARMマイコン)と後述するgdb/insightの仲介役を果たす
  プログラムです。自身がTCPのサーバーとなり、gdb/insightに接続されます。
  以前はWindows向けにインストーラ付のバイナリが配布されていましたが、FTDI純正の
  スタティックライブラリがOpenOCDのGPLライセンスに引っかかりてめえでビルドしろ
  的なものになってしまいました。
  …しかし…
  当ぶろぐ内ではWinUSB(LibUSB1.0系)をFT2232系のデバイスドライバとして使うように
  方針を変えたので、もうビルドする必要はありません♥
  OpenOCDのWindowsバイナリはこちらからダウンロードしてください。

  注意すべきはデバッガハードウエアに対するドライバで、上記リンクにある
  OpenOCDバイナリは下記のデバイスとドライバをサポートしています。
  (注:LibUSB->クラシックなLibUSB0.1系を指す
    WinUSB->バックエンドとなるLibUSB1.0系を指す)

  *JTAGKey2をはじめとしたFT2232系デバイス:(WinUSB or LibUSB)
  *Versaloon:(WinUSB)
  *STLink/v2:(STMicro純正/WinUSB)
  *TI-ICDI(Stellaris Launchpad):(TI純正/WinUSB)
  *J-Link(WinUSB)
  *J-Link On LPCLink2(WinUSB)
  *CMSIS-DAP(HIDとしてドライバレスだがmbed版はVCPドライバ必須)
  *STLink/V2-1(VCPドライバ必須)


  各ドライバのインストールは以前は、PID/VID調べてINFファイルを作って…と非常に
  めんどくさかったのですが、現在はWinUSB,LibUSB向けのGUIな汎用インストーラのzadig
  を使用することによりインストールが大幅に簡略化され、手軽になりましたのでこちらを
  使用してドライバのインストールを行ってください。
  公式のサイトにはインストール手順も英文で懇切丁寧に書かれていますが見る必要も
  無いくらい簡単にWinUSB/LibUSBが導入可能です。
  さらに、使用するドライバにLibUSBKを選択するとドライバの入れ替え無しに0.1系と
  1.0系のAPIが使用可能になります!…が2015年現在は全てLibUSB-1.0系に移行して
  いるのでLibUSBKを適用する強い理由はなくなりました。WinUSBのドライバを
  適用してください。


  注:このOpenOCDは32bit版ですが64bit版Windows7環境でも問題なく動作します。
     64bit版OpenOCDと比べて速度的な面で大差はないです。


  どうやらJtagKey2を売ってた所が夜逃げしたらしく現在ではFT2232系を使用したデバッガ
  ハードウエアはOlimexのARM-USB-OCD-Hが主流になりつつあります。
  こいつのデバイスドライバのインストールで詰まってる方が極めて多いのでついでに
  こいつを使った時の導入方法もお伝えします。と言っても難しい操作は全くなく、おなじみ
  Zadigを使用して"ARM-USB-OCD-H (Interface 0)"のデバイスにWinUSBもしくは
  LibUSBKのドライバを適用するだけです。間違っても"Interface 1"に適用しないでください。
  そちらは仮想COMとしてFTDIのドライバを普通に適用させてください。

  初めての方は新旧の情報がいたるところで倒錯しすぎて何が正しい組み合わせかが
  分からないと思います。Windows環境でOpenOCDを使われる方は私のぶろぐをしっかり
  見ていただければとにかく途方に暮れることだけは避けられるかと思います。


 4.Insight(gdb-gui)
  InsightはgdbのGUI版です。また、純粋なフロントエンドではなく内部にGDBそのものが
  取り込まれているので別途gdb.exeを用意する必要はありません。当ぶろぐではこれを
  使用しソースコードレベルのデバッグを行います。
  これも詳細は後述しますがバイナリが配布されていますのでビルドする必要はありません。



●下準備
 1.ドライバ強制認証の回避措置(WindowsXPでは不要)
  今回は絶対に必要ということではありませんが開発を行ううえで必ずぶち当たる
  問題なので紹介しておきます。

  64bit版のWindows7では、デバイスドライバはデジタル署名が必ず求められていて
  未署名のドライバを使用するときはOSの起動時にF8キーを押してドライバ署名の
  無効を強制を選択しなければなりません。毎 回。
  で、バリバリ開発する人は未署名のドライバなんかも使わざるを得ない場面がた
  くさん出てきますね。こんな糞かったるいことはやってられないのであらかじめ回
  避措置をしておきましょう。
  Driver Signature Enforcement Overriderというプログラムを使用し、使用したい
  未署名ドライバに強制的に署名を施しWindows7をTestModeとして走らせます。
  詳しい設定方法は上記URLを参考にしてください。
  また"TestMode"で動かしている時に画面右下に"TestMode"と表示されてしまって
  いますが気になる人はRemoveWatermarkX64.exeを使用して文字を消してください。


 2.OpenOCDのビルド
  以前はWindows環境にてMSYS/MinGWを用いた手順を公開しておりましたが、
  OpnOCD0.8.0以降はビルドするまでの手順が大幅に煩雑になり慣れてない人には
  ビルドがほぼ不可能になってしまいましたので公開を廃止しました。代わりとしまして
  ビルド済のWindowsバイナリを公開しております。ご利用ください。


 3.Insightの準備
  SourceForgeにあるNetXのページのかなり下のほうにある
  "arm-none-eabi-insight-7.4.50.20111222-cvs-mingw32-netx.0.7z"をダウンロード
  し、任意のフォルダに展開してください。


●ターゲットデバイスにプログラムをダウンロード
  前回の手順を参考にSTM32F407ZGT6用のmain.elfが生成できてるものとします。
  デバッグ時は最適化オプションを必ず"-O0"にしてビルドしてください。

 1.makeファイルの編集
  前回も解説しましたが、makefileにあるOpenOCDとInsightがインストールされて
  いるパスを指定してください。
  
  

 2.PN2の設定
  PN2の"TOOL"から呼び出すことが出来るように前回と同じ要領で引数つきで登録
  てください。登録するのは"program"と"debug"です。

 3.書き込み
  ターゲットデバイス(STM32F407ZGT6)が載っている基板にJtagKey2を取り付け、"TOOL"
  から"make program"を呼び出し、OpenOCDからSTM32のフラッシュ書き込みスクリプトを
  呼び出しターゲットデバイスに"main.elf"をダウンロードします。
  OpenOCDのcfgファイルのパスの指定が間違っているとエラーが出ますので各自の環
  境に合わせてパスを修正してください。
  

 4.書き込み用のコマンドについて補足
  makefile内では以下のように記述されています。
  1.OpenOCDをJTAG・SWDデバイスのcfgファイル・ターゲットMCUのcfgファイルを
   -fコマンドで指定して起動する。
  2.同時に-cのコマンドでターゲットMCUのcfgに記述されているproc(関数)を呼び出す。
  3.procに記載されている順にコマンドが実行され書き込みを行う。

  上記一連の動作にてgdbやtelnetからの回りくどい操作は一切要せず、簡単に
  書き込み動作が可能です。


●ターゲットデバイスをInsightを使用しデバッグ
 1.makeファイルの編集
  正しくプログラムが書き込まれたことを確認したら次はデバッグです。
  makeでinsightをcmdウインドウ(DOSプロンプト)なしで呼び出すために
  ちょっと回りくどいですが下記のようにして記述しています。
   

 2.OpenOCD・Insightの呼び出し
  "TOOL"から"make debug"を呼び出すと、OpenOCDをターゲットデバイスに接続、その後
  insightが起動します。
  

 3.Insightの接続設定
  デバッグ開始前にFile->Target Selectionに進み、以下のように設定を行います。
  原因は不明ですが"Set Breakpoint at 'main'"が効かない事がよくあるので
  "Command issue after attaching"に"tbreak main"と記述し確実にmain関数の
  最初の行で止まるようにしてください。ここでmainに設定したブレークポイントは
  自動的に消去されるのでリソースの無駄になりません。
  

  その後"Run" -> "Connect to Target"へ進み、接続を開始します。ダイアログがまた
  出ることもありますがそのままOKを押してください。
  
  OpenOCDとInsightの接続が成功すると"Successfuly Connected"とGDBのダイアログ
  が出ます。ここで"ok"をおすとプログラムがリセット直後にhaltした状態となります。
  
  このときCortex-M系のマイコンを使用時でなおかつGDBのバージョンが7.2以上の時に、
  "Remote 'g' packet reply is too long"というエラーメッセージを吐くことがあります。
   これは従来GDB側がARMv7-mコアに対して疑似的な浮動小数点レジスタを設けていて
  それに対応するためにOpenOCD側がレジスタの分だけパケットを余分に生成して送り
  込んでいたのに対してGDB7.x以降ではその浮動小数点レジスタの領域が完全に廃止
  されてしまったため、余分なパケットが送り込まれていたと判断し、上記のエラー
  を吐いて(="Remote 'g' packet reply is too long")止まったからです。

  ↑※OpenOCD0.8.0以降のVerではtdescを指定する方針で対策されました。

  さらに"Continue"を押すとmain関数の最初の行、一時的にmain()に張った
  ブレークポイント(main()の最初の行)に飛びます。
  
  
  ここまできたらあとはInsight上でステップインとかステップアウトとかブレークポイント
  張って停止させたりレジスタとかメモリとか(条件付で)I/Oレジスタの値読み出した
  り自由自在です!

  終了する時はTools->Stop Toolsで終了させたいところですがが、PN2ではひとつの
  プログラムしか終了できず、Insightだけが終了してOpenOCDが終了してくれません。
  私は下記の要領で強制的にタスクを殺すwindowsのtaskkillコマンドを使ったバッチ
  ファイルを作成してこれを呼び出して"確実に"終了させています。
  ↓呪文
  taskkill /F /IM openocd.exe
  taskkill /F /IM arm-none-eabi-insight.exe
  

  taskkillはXPPro版とVista以降のOSしかサポートしてませんので注意です。

Comments

STM32F407ZGT6_FatFS_DISP_20120425
ではコンパイルできましたが、
STM32F407xGT6_FatFS_DISP_20120520
では、
MSGECHO = "echo.exe"
に変更された影響で止まります。

DEVTOOL = LAUNCHPAD
で試しました。


  • 寝太郎
  • 2012/06/07 6:11 PM

寝太郎様、はじめまして。
ねむいです。


2012年5月中旬以降に公開している私のコードはビルド時に
Windows内部コマンド「ECHO」と競合するのを防ぐため、Unix
ライクツールの「echo.exe」を明示して使用(ダブルクォー
テーションでくくる)を行うようにしています。

それ故にecho.exeまでのパスが通っていないとエラーで
止まります(パスはmakefile内で設定しています)。


nemuisan.blog.bai.ne.jp/?eid=188089
↑のURLの手順を正しく踏まれた上でまだエラーで止まる
のであればこちらの説明に手落ちがある可能性があります
ので、再現確認のために下記の詳細を教えてください。
1.使用しているOS(Win7の場合は32bitか64bitか)
2.上記URLで指定しているサポートツールはCoreutils
 とWinAVRのutilsのどちらを使用しているか
2.ARM以外の開発環境を使用しているか
3.環境変数PATHの設定に2.の環境があるディレクトリ
 が含まれているか

先の2つのバージョンは同一環境で実行しています。

/usr/bin/sh: -c: line 1: unexpected EOF while looking for matching `"'
/usr/bin/sh: -c: line 2: syntax error: unexpected end of file
make: *** [clean] Error 258

とのエラーを見て
nemuisan.blog.bai.ne.jp/?eid=188089
を読んで
>MSGECHO = "echo.exe" <-ダブルクォーテーションでくくる

の経緯があったことを知り、ダブルクォートを外したら
コンパイルは通ってくれましたので、前回のコメントを
書きました。

1.WindowsXP 32bit
2.WinAVR
   MAKEDIR = C:/WinAVR-20100110/utils/bin
3.含まれています。
  コマンドプロンプトで試すと
  >echo.exe hoge
  >.exe hoge    内部コマンドのECHOが呼ばれている様子
  >"echo.exe" hoge
  >hoge
  となり、パスは通っており、ファイル検索でも他に
  echo.exeは見つかりませんでした。

以上、遅くなりましたが報告させて頂きます。

  • 寝太郎
  • 2012/06/29 12:50 PM

寝太郎様こんばんは、ねむいです。

ご連絡ありがとうございます。寝太郎様の情報をもとにこちらでも
試してみましたが、WinAVR(20100110版)のインストール時に環境変数PATH
にWinAVRのパスを追加を選んだ場合、問題が再現しました。PATHを追加
しない場合は発生しないのでPATHに追加されたWinAVRのパスが原因です。

WinAVRのインストーラはPATHの一番頭に自身のパスをねじ込んでくるので、
複数環境持ちだとちょっと面倒なことになります。
…とはいえAVRToolchainに変った今でもWinAVRを愛用されてる方は多数い
ますので、次回の更新時からはmakefileを見直してダブルクォーテーション
を含まないecho.exeでも表示が崩れないようにちょっと工夫してみますね。

同じく私が公開しているビルド手順もサポートツールをWinAVR付属のutils
ではなくCoreutilsの使用を推奨するようにシフトする予定です。

ねむい様、はじめまして。imenihsと申します。
秋月のSTM32F4 Discoveryを購入して、制限なしコンパイル環境を構築しようとねむい様のこちらのページを参考にさせていただいています。
その過程で、私が2つ引っかかったことがありましたので、こちらに報告させて頂きます。
Insightを使ったデバッグを行うため、make debugメニュー(こちらのページの作業で追加したもの)からInsightを起動して、Insightのメニュー File->Targetsettingsをクリックしても、その後無反応になります。
Insight+OpenOCDを強制終了後のち、再度起動させてRunなどいろいろ実行させても同様に無反応になります。
この回避方法は、arm-none-eabi-insight.exe本体のexeを右クリックし、プロパティから互換性タブを選択し、Windows98/ME互換モードで動作させると良いようです。
更に、ねむい様の作成されたstm32f4用のmakefileの、Insight呼び出しの引数も、
$(WSHELL) /c start /B $(INSIGHT) $(TARGET).elf target_cmd=remote/tcp localhost:3333
と変更すると、remote/tcpで接続されるようです。(変更以前はlocalhost:3333の引数が無効とメッセージを吐いていました。)
もしかしたら、初歩的な誰でも知っている事かもしれませんが・・・。
ちなみに、私のPCのOSはWindows7 HomePremium 64bitです。
長文失礼しました。

imenihs様
はじめまして、ねむいです。

Insightはgdbtk.iniという設定ファイルをログイン下ユーザーフォルダ
(Windows7だとC:¥ユーザー¥(ユーザー名)に相当する)に作り、次回の
起動で最後に動かした時のgdbtk.iniの設定を反映させます。ここで設定に
誤りがあるとパケット待ちによりフリーズしたように見えるので注意
してください。

ということでmakefileのtarget_cmd...の部分は全く不必要です(無視されます)。
STM32やFM3向けのプログラムでmakefileに書いてあったのは検証用に
残していて削除するの忘れてましたすみません。次回mp3再生機能を追加
して更新しますのでmakefileの余計な記述は消しておきますね。

初めまして...です(私の方からはということで)
最近コメント整理をしておらず、ご本人からコメントをいただいていたとは気が付かず、失礼しましたm(__)m
PN2からMake出来なかったあと、Eclipseでなんとかなったので、その後は他のことにかまけて(トランジスタのペア取りとか)ARMはお休みしていました

多分ご指摘のミスだったと思うので(消してしまいましたが)、再度追試をしてこちらの環境も是非使わせていただきたいと思います
何か始めるときは環境構築が一番面倒なので、ついお仕着せで済ませてしまうのですが、こちらのようの丁寧に説明していただくと非常に助かります
今後とも参考にさせていただきます、今回はこちらの方こそお手数をおかけしてすいませんでした(決して批判がましいつもりではなく、自分の作業メモのつもりだったので...)

Sabotenboy様こんばんは、ねむいです。

私も抜けている所が少々どころか多々ありますので、他の方の"ここが分からない"
"上手くいかない"というご意見はフィードバックして修正する際に非常に
大切であると感じております。今後ともよろしくお願いいたします。

ねむい様、はじめまして。555と申します。
Interface2012年6月号の付録基板MB9BF618Tを用いてWindows7環境でこちらのブログを参考にさせて頂いて、MB9BF618T_Simple_20130103を使用して、開発環境を整えています。

しかし、make programでデバイスに書き込もうとする段階で
Error: unable to open ftdi device: device not found
とエラーが出てしまい困っています。
USB-Blasterを接続していなくても同じメッセージがでますので、OpenOCDがUSB-Blasterを認識できていないようです。
(デバイスマネージャやAlteraのQuartusには認識されているようです。)

最近はじめたばかりでmakefileの記述なども分からないことばかりなのですが、
USB-Blasterを使用する場合の変更点はmakefile中の、

21行目の MPSSE = ftdi をコメントにして、22行目の MPSSE = のコメントを解除する。
58行目の読み込むinterfaceのcfgファイルをjtagkey2.cfg からaltera-usb-blaster.cfgに変更する。
(-f interface/$(MPSSE)/altera-usb-blaster.cfg とする。)
の2点のみで正しいでしょうか?
それとも他の変更または、makefileの変更以外のなんらかの操作が必要になるのでしょうか?

  • 555
  • 2013/01/11 1:16 PM

555様はじめまして、ねむいです。

ご質問いただいた件ですが、私のぶろぐ上にて公開している
デバッグ手順は既にプロプラのftd2xxからLibUsb/WinUSBに
ドライバを移行しております。USB-BlasterにおいてはWinUSB
にはまだ対応しておらずLibUSBをドライバとして使用する
必要があります。LibUSBのドライバとしてインストールする
際はzadigを使用すれば簡単です。

…と言いたいところですがUSB-BlasterのOpenOCD側のコードが
まだごく原始的な段階で全く使い物にならない状態です。
私てっきり下記URLの大幅修正がコミットされたかと思い込んで
ましたが、ステータスがレビュー段階で止まったままなんですよね…
ttp://openocd.zylin.com/#/c/467/

ということで申し訳ありませんがUSB-Blasterを使うのはまだ
お勧めできません。

  • 261
  • 2013/01/11 6:11 PM

ねむい様、お返事ありがとうございます。
USB-Blasterが使えないのは残念です。
情報は参考になりました。ありがとうございます。

  • 555
  • 2013/01/12 8:03 PM

はじめまして。さかなです。

自宅に眠らせたままになっていた(-_-;)
STM32F4 Discoveryボードをようやく触り始めたところで、
まずはこちらのサイトの手順でまずは環境を構築してみました。

当方の環境(Windows10 Pro 64bit)でも、
STM32F4向けの液晶表示プログラムのビルドが成功し、
評価ボード上で動作できることが確認できました。
ありがとうございます。
(・・・といっても、液晶パネルを持っていないので、
main関数冒頭にあるLチカの部分での確認ですが・・・)

これで、ビルド可能な環境が準備できたので、
少しずついろいろ触ってみたいと思います。

ところで、ねむいさんの環境は、
Programmers Notepad2(PN2)をポータブル版にすれば、
USBメモリでビルド環境を一式持ち歩けそうですね。
帰省するときなどには重宝しそうです。

  • さかな
  • 2015/10/13 2:04 AM

さかな様はじめまして、ねむいです。

Win10環境下の動作報告ありがとうございます。
これで私の開発環境でもあと10年はゆうに戦えそうですね・・・!

はじめまして、ダークロンと申します。

STM32F7マイコンの開発環境を構築したいと思いまして、こちらのサイトを見させて頂きました。
無事、ビルドが成功し、STM32F7 discovery board にてねむいさんのプログラムの動作を確認しました。

また、STM32F746VGT6を使った自作のマイコン基板にて、LED点滅プログラムが動作しました。

ありがとうございます。

  • ダークロン
  • 2016/01/16 2:38 PM

ダークロンさまはじめまして、ねむいです。
返信が大幅に遅れ申し訳ありません。

少しだけ時間に余裕が出てきましたので今後も記事の
充実を進めて行かせてもらいます!

Post a Comment








Go to top of page