GPSを試用する3

STM32Primer2を使用したGPSロガーもだいぶ安定してきましたのでファームウェアを
公開します
。ただし下記ハードウエアの条件を必ず合わせておいてください。

1.STM32Primer2の電源ICをLDOに置き換えて強化する。
2.リポ電池をこれに交換する。
  JSTのコネクタははずしてリードを基板に直ハンダで。ショートに注意!
3.GPSはGT-723FもしくはUP-501を使うものとする。ボーレートはデフォルトの9600bpsで。
4.GPSの電源はLCDバックライトの3.1V系から取るものとする。
  (LDOに変えた時点で3.3Vになりますが)

5.GPSは下記のピンのみSTM32Primer2と接続する(GT-723Fの場合)
  1pin(GND)
  2pin(VCC)
  6pin(SerialOUT,LVTTL)
6.GPSの1-2pin(GND-VCC)の近くに16V,10uF,X5R以上のグレードのMLCCを付ける。
7.STM32Primer2にmicroSD/microSDHCカード(1GB〜16GBまで動作確認済)を挿しておく。
  もちろんFat12/32でフォーマットしておくこと!


ファームウェアの動作としてはSTM32Primer2の十字キーのセンター(CTキー)を押して
電源投入。投入時はSTM32は36MHzで動作しています。投入後のキー操作でGPSロガー
モードとマスストレージモードに動作が分かれます。いずれのモードもリポ電池の
電圧が3.3V以下になると自動で電源OFFの操作がされシャットダウンします。

●GPSロガーモード
電源投入直後に十字キーを何も触らなければGPSロガーモードに突入します。
シリアルのボーレートの適正な(9600bps)データが受け取られたら緑LEDが点滅します。
この点滅はGPSが衛星を補足するまで続きます。捕捉後は緑LEDは消えて以後はmicroSD
にデータが書き込まれるごとに赤LEDが点灯します。ロギングを止めるにはセンター
キーを3Sec以上押し続けた後離してください。LCDがOFFになっているのでよく分から
ないとはおもいますが代わりにGT-723FにあるLEDが消えるのでOFFされたことが分か
りす。

●マスストレージモード
電源投入直後0.5Sec以内に十字キーの右を3Sec以上押し続けるとSTM32の動作周波数
が72MHzに上がり、LCDが点灯初期化され、"Start Mass Storage"と表示されます。
この状態でSTM32primer2にある"STM32"側のUSB-miniBコネクタとUSBケーブルで接続
するとPC上にドライブが見えるようになり、USBカードリーダーのように通常のファ
イルの操作を行うことができます。
GPSのデータを取り出すためにいちいちSTM32primer2の蓋開いてmicroSDカードを取
りだして別のリーダーで読みだすと言った煩雑な操作はもう必要ありません!


上記ハード・ソフト構成で捕捉状態だと11時間以上ロギングできるので日帰りならば
十分に使用できる代物だと思います。実際には保険代わりにCanmoreのスポーツガイド
メイトGP-101
持ってってますが〜(これはデジタルコンパスがあるので結構重宝する)。
un
中太郎生・丸八酒店手前にて。



てわけでほとんどの人は興味ないでしょうけど自作のGPSロガーで記録していった東海
自然歩道山の辺ルートの後半編を…

長谷寺->室生口大野
un
長谷寺の回廊。
un
初瀬ダム(まほろば湖)。
un
室生ダムとダム穴。

室生口大野->中太郎生(なかたろう)
un
大野寺の弥勒磨崖仏。
un
済浄坊渓谷の滝。
un
亀山峠から見た曽爾高原。

中太郎生->西青山
un
伊賀富士・尼が岳。下山路で蜂に追っかけられる。
un
メナード青山リゾート。
un
廃墟のような近鉄西青山駅。

西青山->柘植
un
青山高原の三角点の手前。強風と大雨が叩きつけるいい天気だ〜!
un
風力発電の風車…だがガスにおおわれて視界ゼロの恐怖!
un
新大仏寺の山門。
un
霊山についてころにはすっかり晴れ、朝に通過した
風車群もくっきりと。
un
東海自然歩道の本線ルートと合流し、柘植駅に再び到着。

本ルートの関ヶ原から先は11月から再開なのでこれまでは平地を走り込みつつご無
沙汰だったSTM32F2の続きやっていこうと思います。USBライブラリもやっと出たし!

STM32等のARMマイコンをInsightとOpenOCDを使ってデバッグする(2017年度前期版)

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



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

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


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


 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が使用可能になります!…が2017年現在は全てLibUSB-1.0系に移行して
  いるのでLibUSBKを適用する強い理由はなくなりました。WinUSBのドライバを
  適用してください。


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


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

  ARMは新旧の情報がweb上のいたるところで倒錯しすぎて何が正しい組み合わせか
  分からないと思います。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以降しかサポートしてませんのでご注意ください。

Go to top of page