sw4stm32でOpenOCDを使う(たぶんOK?)

自作のJTAG書き込みツール oocdJTAG を使ってsw4stm32とOpenOCDでデバッグ、書き込みが出来るようになりました。
タイトルの たぶんOK? というのはeclipseの設定がややこしいので再現性に自信がないからです 8-)

とりあえず文章だけで手順をメモしておきます。
sw4stm32は英語バージョンのままです、日本語化して使っている人はメニューの部分を読み替えてください。

OpenOCDのバージョン

sw4stm32のバージョンはinstall_sw4stm32_win_64bits-v2.4.exeです。
OpenOCDはsw4stm32に含まれているものでOKでした。

oocdJTAG

oocdJTAGはftdiのft2232Dを使ってJTAG書き込みとシリアル通信が出来るようにしたJTAG書き込みツールです。
書き込みだけならSTLinkを使えば簡単に出来ますがデバッグ時にシリアルポートが使えると何かと便利なので自製書き込みツールを使っています。

oocdJTAGを使えるようにするための手順

oocdJTAG用定義ファイルをコピー

下記の定義ファイル2つを次のディレクトリにコピーします
Ac6\SystemWorkbench\plugins\fr.ac6.mcu.debug_2.1.4.201801121207\resources\openocd\st_scripts\interface
このでぃくとりはシステム環境変数を使うと ${openstm32_openocd_script_root_path}\interface となります

oocdjtag-ftdi.cfg

#
# oocdJTAG
#

interface ftdi
ftdi_device_desc "oocdJTAG"
ftdi_vid_pid 0x0403 0x6010
transport select jtag

ftdi_layout_init 0x0c08 0x0f1b
ftdi_layout_signal nTRST -data 0x0100 -noe 0x0400
ftdi_layout_signal nSRST -data 0x0200 -noe 0x0800

oocdjtag-swd-ftdi.cfg

#
# oocdJTAG
#

interface ftdi
#interface ft2232
ftdi_device_desc "oocdJTAG"
ftdi_vid_pid 0x0403 0x6010
transport select swd

ftdi_layout_init 0x0c08 0x0f1b
ftdi_layout_signal nTRST -data 0x0100 -noe 0x0400
ftdi_layout_signal nSRST -data 0x0200 -noe 0x0800

source [find interface/ftdi/swd-resistor-hack.cfg]
#source [find interface/ftdi/swd-resistor-hack.cfg]
#
# Connect TDI to SWDIO via a suitable series resistor (220-470 Ohm or
# so depending on the drive capability of the target and adapter);
# connect TDO directly to SWDIO.
#
# You also need to have reliable GND connection between the target and
# adapter. Vref of the adapter should be supplied with a voltage equal
# to the target's (preferrably connect it to Vcc). You can also
# optionally connect nSRST. Leave everything else unconnected.
#
# FTDI                          Target
# ----                          ------
# 1  - Vref   ----------------- Vcc
# 3  - nTRST  -
# 4  - GND    ----------------- GND
# 5  - TDI    ---/\470 Ohm/\--- SWDIO
# 7  - TMS    -
# 9  - TCK    ----------------- SWCLK
# 11 - RTCK   -
# 13 - TDO    ----------------- SWDIO
# 15 - nSRST  - - - - - - - - - nRESET
#

ftdi_layout_signal SWD_EN -data 0

ボード定義ファイルの作成

ProjectExplorerでプロジェクトを右クリックしてDebug Asを実行すると [プロジェクト名 Debug]という名前のファイルがプロジェクトディレクトリに作成されるのでこれをベースにボード定義ファイルを作成します。

ボード定義ファイルの修正

source [find interface/stlink.cfg] 
の部分を
source [find interface/oocdjtag-swd-ftdi.cfg]
に置き換えます

# This is an Lantern board with a single STM32F051C8Tx chip
#
# Generated by System Workbench for STM32
# Take care that such file, as generated, may be overridden without any early notice. Please have a look to debug launch configuration setup(s)

#source [find interface/stlink.cfg]
source [find interface/oocdjtag-swd-ftdi.cfg]

set WORKAREASIZE 0x2000
...

ボード定義ファイルを 指定する

Debug Configurations の DebuggerタブでConfiguration scriptの設定を User Definedに変更して修正したボード定義ファイルを指定します。

以上でoocdJTAGボードでデバッグとプログラム書き込みが使えるはずです。

sw4stm32でOpenOCDを使う(試行錯誤編)

stmicroが提供するフリーで制限の無いstm32マイコン用開発環境がかなり使えます。

今までstm32f シリーズの開発に自作の開発環境JDEを使ってきました。

何度かFreeで制限のない開発環境を探したことがあり、eclipseにも挑戦したことがありますがセットアップが複雑で動きがもっさりしているので仕方なくJDEをバージョンアップしながら使い続けてきました。

今回STマイコンの開発環境にSTマイコン用システムワークベンチのsw4stm32を使いたいというお話があったのでインストールして触ってみたところなかなか使えそうなのでこれからsw4stm32にシフトして行こうと思っています。

インストールからコンパイルまでは簡単に出来ましたがOpenOCDを使った書き込みは苦労しました。
自作の書き込みツールoocdJTAGを使って、JDEではサポートしていなかったブレークポイントとステップ実行を使ったデバッグが出来るところまで確認しました。
デバッグ後にターゲットボードからoocdJTAGを外してリセットすれば普通にプログラムが走ります。
デバッグシンボル等を含んでいるのでプログラムサイズが大きく実行速度にも影響があると思いますが、とりあえずはFlashへの書き込みが出来たことになります。

Relase モードでコンパイルしたプログラムをFlashへ書き込む手順についてはまだ模索中です。

sw4stm32の良い点

1.コードサイズの制限などが無くGCCの機能をフルに使える。

2.ショートカットキーの割り当てが簡単(私的にはこれが必須条件です。)

3.OpenOCDでデバッガも使える。

4.その他IDEに必要な機能が網羅されている(らしく見えます)

sw4stm32の悪い点

1.eclipseベースなので柔軟に拡張が出来る反面、構成が複雑でわかりにくい。
 使い方について検索しても現バージョンとは異なる手順ばかりが見つかる。

2.今後も、OpenOCDのサポートなどバージョンアップの度にやり方が変わると思われるので初心者が使い始める手順書を作るのが困難。

OpenOCDを使うための設定

Google先生に聞いたところでは別途OpenOCDをインストールして使いなさいとのことでしたが、ダウンロードしたバージョンにはOpenOCDが入っていました。
設定のためにはOpenOCDの実行ファイルやスクリプトの場所を知らなければならないのですがややこしいディレクトリ校正になっていてわかりにくいのでメモ

OpenOCDがインストールされている場所

メニューの Windows -> Preference から
C/C++
  Build
    Build Variables のページで Show system variables  にチェックを入れると定義済みの環境変数が表示されます。
<ECLIPSE DYNAMIC VARIABLE>と表示されている項目はその項目をダブルクリックするか選択して右のEditボタンをクリックすると別ウィンドウが開いて表示されます。

下記の値は install_sw4stm32_win_64bits-v2.4 の場合です。
バージョンが違うと変更になると思います。

環境変数openstm32_openocd_script_pathの値 :  stmicroボードの定義が置いてある場所
Ac6\SystemWorkbench\plugins\fr.ac6.mcu.debug_2.1.4.201801121207\resources\openocd\scripts\st_board

環境変数openstm32_openocd_legacy_script_root_pathの値 :  OpenOCDスクリプトの場所 
Ac6\SystemWorkbench\plugins\fr.ac6.mcu.debug_2.1.4.201801121207\resources\openocd\scripts\

環境変数openstm32_openocd_pathの値: openocd.exeがある所
Ac6\SystemWorkbench\plugins\fr.ac6.mcu.externaltools.openocd.win32_1.17.0.201801121207\tools\openocd\bin

環境変数openstm32_openocd_script_root_pathの値: ??
Ac6\SystemWorkbench\plugins\fr.ac6.mcu.debug_2.1.4.201801121207\resources\openocd\st_scripts

コマンドラインオプションで環境変数を認識しないバグ??

Run -> Debug Configuration でopenOCDのコマンドラインオプションに環境変数を使うとファイルの場所を認識してくれなくて暫く悩みました。
この画面で <OpenOCD Options> のところ

環境変数を使わずにOpenOCD Optionsを指定するとちゃんと動作したのでたぶんコマンドラインの解釈時に環境変数の認識をしていなのでしょう。
ここでつまづいた人は環境変数を使わないようにするとうまくいきます。
この問題を解決する過程で最新のOpenOCDを別の場所にインストールしてシステム環境変数も変更して、それを元に戻すのが面倒なので新しいOpenOCDを使っていますがインストール済みのOpenOCDでも動作は問題ないような気がします。

JSD製oocdJTAGボードを使う場合

メニュー Run -> Debug Configurations で直接OpenOCDを設定するとOpenOCDが起動しますがどうやってもエラーでうまくいかなかったので

メニュー Run -> External Tools -> External Tools Configurations で OpenOCDを外部ツールとして設定するとデバッグまで出来ました。

フラッシュ書き込みはもう一工夫必要みたいです。

Debug Releaseの切り替え

メニュー Project -> Builed Configurations -> Set Active から Debug/Releaseを選択する。