YES! Momiji momimomi! w/ST-Link.

sorry. japanese only.

モミジもみもみボードをST-Linkを使ってデバッグしてみる

デバッグをどうするか MapleIDEを使ったところで,コードを書いて実行することは簡単に出来てもテストやデバッ グの効率は変わりません。 従来どおりのシリアル出力やLEDチカチカでのデバッグが基本になります。 そこで,少しでもデバッグの労を小さくするために,ST-Link/v2やSTM32F4discoveryボード などに搭載されている同様機能(以下ST-Link機能と総称します)を使用して,STM32のSWD (Serial Wire DebugPort)の機能を使ってデバッグする方法を試してみます。
SWD connect STM32F4discovery搭載のST-Link機能を使用してデバッグ実行中の様子
SWDとはSWCLK(PA14),SWDIO(PA13)を使用して行うハードウェアデバッガの支援機能のこと で,この2線をデバッガが占有することを許容すれば,プログラムのステップ実行やMPUレ ジスタおよびペリフェラルレジスタを含むメモリの読書きが行えるようになります。 また副次的なものですが,STmicro社が配布しているST-Link utilityを使用して,フラッ シュROMの書き換えも行えるので,ブートローダの更新も出来るようになります。 簡単に言えば,STM32F4discoveryとほぼ同様の開発テスト手段が使えるようになります。 ここでは,そのST-Link utilityを使用して,モミジもみもみボードのデバッグが行って みます。 接続さえ出来てしまえば,このST-Link機能を使ってのSWDデバッグは,OpenCDCでもサポー トされ始めているので,慣れた人であればOpenOCDやGDBなどのポピュラーなデバッガを使 用して,さらに効率よくテストを行うことが出来るようになります。 (稿末に簡単なメモを置いておきます。詳細は OpenOCD ST-link support などのキーワー ドでググって調べてみてください) 多分ST-Link/2やSTM32F4discoveryボードなどを使用して開発した事のある環境であれば, そのままで継承して使用できるはずです。そうでない場合には,ST-LinkのUSBドライバや ST-Link utility自身のインストールを,STmicro社のホームページを参照して行う必要が あります。
ST-Link connectivity WindowsXPでのST-Linkの認識とST-Link utilityからモミジもみもみボードの認識状況
ST-Link機能とモミジもみもみボードの接続方法 接続は, 以下のようにST-Linkの6ピンコネクタで供されるSWDインターフェイスを使用しま す。 SWDインターフェイスの6本の内4本のラインを以下のように接続すればOKです。 ST-Link機能側 モミジもみもみ側 1 Vcc検知 - 2 SWCLK D21(PA14-SWCLK) 3 GND GND 4 SWDIO D22(PA13-SWDIO) 5 NRST nRST 6 TRACE - STM32F4-discoveryボード上のST-Link機能を使用する場合にCN2 SWDというピンヘッダで SWDインターフェイスが使用できますが,これを使用する場合には,CN3のジャンパピンを 2つともOFF(open)にして,discoveryボード上のSTM32F407MCUを切り離しておく必要があ ります。 当方のST-Link utility周りのバージョンは以下の通りです。 STM32 ST-Link Utility.exe v2.2.0 STLinkUSBDriver.dll v4.2.2.0 ST-LINK_CLI.exe v1.2 モミジもみもみボードでST-Link使用時の留意事項 Maple-miniの場合に限ってですが,MapleIDEでビルドしたアプリケーションを実行すると, ボード初期化でデバッグ機能が無効化され,リセットするまでST-Linkが無効になります。 これを回避するために,hardware/leaflabs/cores/maple/maple_mini.cppの45行目近辺に あるボード固有の初期化処理で,デバッグポートを無効としている部分を以下のように SWDのみ有効としてください。 変更前 void boardInit(void) { disableDebugPorts(); } -- 変更後 void boardInit(void) { afio_cfg_debug_ports(AFIO_DEBUG_SW_ONLY); // only SWD_debug } 質問をもらったので,回答ついでにここにも記載しておきます。 質問要旨「STbee miniではSWDを使うのにハードの改造が必要ですが,モミジもみもみボード では必要ないんですか?参考URL」 → そもそもMaple-miniとSTBee-miniでは,MCUが同じなだけでハードが異なります。 Maple-miniとそのコンパチのモミジもみもみボードでは、SWDを用いてデバッグする場合 でもSWD用のポートを占有するという制限は付きますが,ハード改造は無用です。 Tips SWDを使ってMaple-miniのブートローダを上書きして,かつ書き込んだユーザアプリが デバッグポートを無効にしてしまうような処理を含む場合,SWDでの書き換えが不能に なったように見えます。 その場合は,BUTボタンを押したままリセットして起動することにより,システムブート またはSRAMブートで起動することで,ユーザアプリに制御が渡らないように起動すれば SWDができるようになります。 SWDを使ってデバッグしててトラぶったら,BUTボタン押しながらのリセット解除と覚えて おくといいでしょう。 (さらにコードプロテクトをかけた状態だと回復はシステムブート後に全消去が必要となり 面倒になります。万が一そうなったら素直にシリアル経由でブート書き換えしましょう) この辺を見ると,Maple-miniのポート割当ては,かなり考えられて設計されているように 思えます。 全然作り中... ついでにMapleIDEでST-Linkを使用して書込む方法 ブートローダ無用で全てフラッシュとSRAMの領域が可能となります。 MapleIDEでは,DFUブートローダかavrdudeのいずれかのみが指定が出来,このavrdudeを ST-LinkのCLI版を実行するためのラッパとしてデッチ上げることで,ST-Link経由でスケッ チの書き込みが可能となります。 avrdudeラッパは,ググるといろいろ出てきますが,昔バッチファイルとして作ってでっ ち上げた物が手元にあったので,それをBat to Exeなどのコンバータを使ってexeファイ ルにして,MapleIDEから使用できるようにしてみます。 avrdude.bat(avrdudeラッパバッチファイル) このラッパスクリプトは,-cパラメタの引数で指定されたバッチファイルを呼び出します。 呼び出しは,以下のように引数を並べてバッチファイルを実行するので,これに書き込み 処理を記載すれば,あたかもavrdudeで書き込んだように見えるわけです。 avrdude ... -cコマンド -pMCUの種類 -P通信ポート -b通信速度 ... -U書込みファイルとパラメタ ↓外部バッチファイルの呼び出し コマンド.bat 書込みファイル名 MCUの種類 通信ポート 通信速度 ここでは,ST-LINK-SWD.batという名前で作成したバッチファイルを呼び出します。 ST-LINK-SWD.bat(ST-LINK_CLIで指定のファイルを書き込むバッチファイル) MapleIDEがavrdudeを使用する場合には,MapleIDEディレクトリ下hardware/tools/avr/bin にあると決め打ちになっているので,ここにexe形式にしたavrdudeラッパをおきます。 コマンドバッチファイルは,MapleIDEディレクトリ下にそのままバッチファイルの形式で おいておきます。 書き込み方法を指定するのは,MapleIDEディレクトリ下のhardware/leaflabs/boards.txt に記載されたパラメタを元に行われるので,これを記載します。 ############################################################## momiji_momi2.name=Momiji momimomi to Flash_ST-Link # RO128KB/RW20KB via jtag momiji_momi2.upload.file_type=bin momiji_momi2.upload.maximum_size=65536 momiji_momi2.upload.ram.maximum_size=20480 momiji_momi2.upload.flash.maximum_size=65536 momiji_momi2.build.linker=momiji_momi2/jtag.ld # RO128KB/RW20KB via DFU #momiji_momi2.upload.file_type=bin #momiji_momi2.upload.maximum_size=110592 #momiji_momi2.upload.ram.maximum_size=17408 #momiji_momi2.upload.flash.maximum_size=110592 #momiji_momi2.build.linker=momiji_momi2/flash.ld momiji_momi2.upload.usbID=1EAF:0003 momiji_momi2.upload.altID=3 #momiji_momi2.upload.uploader=dfu-util momiji_momi2.upload.uploader=avrdude momiji_momi2.upload.auto_reset=true momiji_momi2.upload.protocol=ST-LINK-SWD momiji_momi2.upload.speed=38400 momiji_momi2.build.board=maple-mini #momiji_momi2.build.board=momiji_momi2 momiji_momi2.build.mcu=STM32F103CB momiji_momi2.build.family=cortex-m3 momiji_momi2.build.f_cpu=72000000L momiji_momi2.build.core=maple momiji_momi2.build.submdl=stm32f103 #momiji_momi2.build.vect=VECT_TAB_FLASH momiji_momi2.build.vect=VECT_TAB_BASE momiji_momi2.build.using=armcompiler momiji_momi2.build.density=STM32_MEDIUM_DENSITY momiji_momi2.build.error_led_port=GPIOB momiji_momi2.build.error_led_pin=1 ############################################################## momiji_wanwano.name=Momiji wanwano to Flash_ST-Link # RO512KB/RW64KB REsuffixed 103 momiji_wanwano.upload.file_type=bin momiji_wanwano.upload.maximum_size=524288 momiji_wanwano.upload.ram.maximum_size=65536 momiji_wanwano.upload.flash.maximum_size=524288 # RO512KB/RW192KB REsuffixed 405 #momiji_wanwano.upload.file_type=bin #momiji_wanwano.upload.maximum_size=524288 #momiji_wanwano.upload.ram.maximum_size=131072 #momiji_wanwano.upload.flash.maximum_size=524288 # RO1024KB/RW192KB RGsuffixed 405 #momiji_wanwano.upload.file_type=bin #momiji_wanwano.upload.maximum_size=1048576 #momiji_wanwano.upload.ram.maximum_size=131072 #momiji_wanwano.upload.flash.maximum_size=104576 momiji_wanwano.upload.usbID=1EAF:0003 momiji_wanwano.upload.altID=3 momiji_wanwano.upload.uploader=avrdude momiji_wanwano.upload.auto_reset=true momiji_wanwano.upload.protocol=ST-LINK-SWD momiji_wanwano.upload.speed=38400 momiji_wanwano.build.board=momiji_wanwano momiji_wanwano.build.mcu=STM32F103RE #momiji_wanwano.build.mcu=STM32F407RE #momiji_wanwano.build.mcu=STM32F407RG momiji_wanwano.build.family=cortex-m3 momiji_wanwano.build.f_cpu=72000000L #momiji_wanwano.build.f_cpu=168000000L momiji_wanwano.build.core=maple #momiji_wanwano.build.vect=VECT_TAB_FLASH momiji_wanwano.build.vect=VECT_TAB_BASE momiji_wanwano.build.linker=momiji_wanwano/jtag.ld momiji_wanwano.build.using=armcompiler momiji_wanwano.build.density=STM32_HIGH_DENSITY momiji_wanwano.build.error_led_port=GPIOA momiji_wanwano.build.error_led_pin=5
ST-Link configuration ST-Link デバッグインターフェイス設定
open ST-Link MCU CTRL panel ST-Link MCUコントロールパネルを開く
ST-Link MCU CTRL panel ST-Link MCUコントロールパネル
このMCUコントロールパネルにはR0が見当たらないんですが,それは大丈夫なんですかね?w OpenOCD(STM32F4discoveryのST-LinkSWD経由)でもデバッグできます OpenOCDを使う場合には,ST-Linkドングルのドライバをlibusb0-win32のドライバにする 必要があります。
ST-Link connectivity via libusb-win32 WindowsXPでのST-Linkの認識(libusb-win32ドライバ)
OpenOCDのビルド 2012/12/01 時点の最新リリース版は0.6.1 だが、私ならこの野郎とばかりに最新のソースをgitサーバから持ってくる git clone git://openocd.git.sourceforge.net/gitroot/openocd/openocd cd openocd そして頃合よしと手早くビルド環境を準備するのだ。 ./bootstrap mkdir i686-pc-cygwin 後はバランタインの30年物を1杯やりながらビルド実行&インストールして寝てしまおう。 (SWDインターフェイスは,ST-link/V2とJ-Link) cd i686-pc-cygwin ../configure --prefix=/usr/local \ --with-gnu-as --with-gnu-ld \ --enable-maintainer-mode \ --enable-dummy \ --enable-jlink \ --enable-stlink make make install : $ which openocd /usr/local/bin/openocd OpenOCDの起動 (STM32F4discoveryのST-Link経由でターゲットがMaple-mini/モミジもみもみボード) $ openocd -f interface/stlink-v2.cfg -f target/stm32f1x_stlink.cfg ← 認識するかテスト Open On-Chip Debugger 0.7.0-dev-00079-g08ddb19 (2012-12-01-21:24) Licensed under GNU GPL v2 For bug reports, read http://openocd.sourceforge.net/doc/doxygen/bugs.html adapter speed: 1000 kHz Info : clock speed 1000 kHz Info : stm32f1x.cpu: hardware has 6 breakpoints, 4 watchpoints ← とりあえず認識した (maple-miniボード用のターゲットコンフィグファイルを指定して起動) 以下のようなmaple-miniボード用のターゲットコンフィグファイルを作っておくと楽です。 $ cat /usr/local/share/openocd/scripts/board/maple-mini.cfg ← 設定ファイルを表示 # This is leaflabs's Maple-mini board with a single STM32F103CB/8T chip. # http://leaflabs.com/docs/hardware/maple-mini.html source [find interface/stlink-v2.cfg] source [find target/stm32f1x_stlink.cfg] proc load_elf { loadfile } { # vector table address set vbr 0xe000ed08 # vector address (top of SRAM) set vectaddr 0x20000000 # reset and halt reset halt # set vector table address mww $vbr $vectaddr # load ELF file onto SRAM(0x20000000-) load_image $loadfile return } proc run_sram { } { # vector table address set vbr 0xe000ed08 # vector address (top of SRAM) set vectaddr 0x20000000 # get initial SP and reset handler mem2array vect 32 $vectaddr 2 # display top of vector 4 elements mdw $vectaddr 4 # set initial SP into SP reg sp $vect(0) # set reset handler int PC reg pc $vect(1) # execute now resume return } proc load_run { loadfile } { load_elf $loadfile run_sram return } # use hardware reset, connect under reset reset_config srst_only srst_nogate ##reset init $ openocd -f board/maple-mini.cfg ← 上記のファイルを指定してOpenOCDサーバを起動 Open On-Chip Debugger 0.7.0-dev-00079-g08ddb19 (2012-12-01-21:24) Licensed under GNU GPL v2 For bug reports, read http://openocd.sourceforge.net/doc/doxygen/bugs.html adapter speed: 1000 kHz srst_only separate srst_nogate srst_open_drain Info : clock speed 1000 kHz Info : stm32f1x.cpu: hardware has 6 breakpoints, 4 watchpoints 別ターミナルからtelnetでOpenOCDを使ってデバッグ実行してみる。   ベアメタルで作成したプログラムをブートローダを使わず,SRAM上でデバッグ実行   してみましょう。   ここでは,objディレクトリの下にあるstm32f1xx_1.elf ファイルを読み込んで実行   (相対パスの場合は,OpenOCD serverの実効プロセスから見た相対パスとなる)   実行するのは,内蔵SRAMで実行する様にリンクした,LEDチカチカアプリケーション   です。   実行プログラムのプロジェクトアーカイブ $ telnet localhost 4444 ← 上記で起動した自ホストのOpenOCDサーバに接続 Trying 127.0.0.1... Connected to localhost. Escape character is '^]'. Open On-Chip Debugger ← 無事に接続できた > reset init ← とりあえずMCUをリセットしておく target state: halted target halted due to debug-request, current mode: Thread xPSR: 0x01000000 pc: 0x0800016c msp: 0x20005000 > load_elf obj/stm32f1xx_1.elf ← プログラムをロードする target state: halted target halted due to debug-request, current mode: Thread xPSR: 0x01000000 pc: 0x0800016c msp: 0x20005000 888 bytes written at address 0x20000000 downloaded 888 bytes in 0.109375s (7.929 KiB/s) > mdw 0x20000000 16 ← SRAMの先頭をダンプして確認 0x20000000: 20005000 2000028d 20000131 20000131 20000131 20000131 20000131 20000131 0x20000020: 20000131 20000131 20000131 20000131 20000131 20000131 20000131 20000135 > run_sram ← SRAMの先頭をベクタテーブルと見做して実行 0x20000000: 20005000 2000028d 20000131 20000131 sp (/32): 0x20005000 pc (/32): 0x2000028D > halt ← 実行を停止して target state: halted target halted due to debug-request, current mode: Thread xPSR: 0x81000000 pc: 0x200001bc msp: 0x20004ff0 > reg ← レジスタの内容を表示する ===== arm v7m registers (0) r0 (/32): 0x0000FDFF (1) r1 (/32): 0x00000000 (2) r2 (/32): 0x0000FFFD (3) r3 (/32): 0x40010800 (4) r4 (/32): 0x20000378 (5) r5 (/32): 0x03035383 (6) r6 (/32): 0x001FC402 (7) r7 (/32): 0xFFFFFFFE (8) r8 (/32): 0xBFEFFFF8 (9) r9 (/32): 0xDD6AF7DE (10) r10 (/32): 0x96A48D18 (11) r11 (/32): 0xCBBD0828 (12) r12 (/32): 0x00005E00 (13) sp (/32): 0x20004FF0 (14) lr (/32): 0x20000153 (15) pc (/32): 0x200001BC (16) xPSR (/32): 0x81000000 (17) msp (/32): 0x20004FF0 (18) psp (/32): 0xEE960014 (19) primask (/1): 0x00 (20) basepri (/8): 0x00 (21) faultmask (/1): 0x00 (22) control (/2): 0x00 ===== cortex-m3 dwt registers (23) dwt_ctrl (/32) (24) dwt_cyccnt (/32) (25) dwt_0_comp (/32) (26) dwt_0_mask (/4) (27) dwt_0_function (/32) (28) dwt_1_comp (/32) (29) dwt_1_mask (/4) (30) dwt_1_function (/32) (31) dwt_2_comp (/32) (32) dwt_2_mask (/4) (33) dwt_2_function (/32) (34) dwt_3_comp (/32) (35) dwt_3_mask (/4) (36) dwt_3_function (/32) > resume ← 実行を再開して > shutdown ← OpenOCDサーバを停止(実行したまま) shutdown command invoked > Connection closed by foreign host. $ 別ターミナルからGDBを使ってデバッグ実行してみる。   objディレクトリの下にあるtemplate.elf ファイルを読み込んで,   OpenOCDにリモート接続後ターゲットを初期化して,elfファイルをメモリに   ロードするコマンドまでを実行してから,コマンド待ちになるオプション付き $ arm-none-eabi-gdb obj\\template.elf -ex 'target remote localhost:3333' -ex 'monitor reset init' -ex 'load' -ex 'monitor reset init' GNU gdb (Sourcery CodeBench Lite 2011.09-69) 7.2.50.20100908-cvs Copyright (C) 2010 Free Software Foundation, Inc. License GPLv3+: GNU GPL version 3 or later This is free software: you are free to change and redistribute it. There is NO WARRANTY, to the extent permitted by law. Type "show copying" and "show warranty" for details. This GDB was configured as "--host=i686-mingw32 --target=arm-none-eabi". For bug reporting instructions, please see: ... Reading symbols from m:\stm32f4dis_demo1\obj\template.elf...done. Remote debugging using localhost:3333 start () at src/main.c:186 186 void start(void){ target state: halted target halted due to debug-request, current mode: Thread xPSR: 00000000 pc: 00000000 msp: 00000000 Loading section .text, size 0x2c4 lma 0x20000000 Start address 0x20000250, load size 708 Transfer rate: 5664 bits in <1 sec, 708 bytes/write. target state: halted target halted due to debug-request, current mode: Thread xPSR: 0x01000000 pc: 0x20000250 msp: 0x10010000 (gdb) continue Continuing. Program received signal SIGINT, Interrupt. 0x200002b6 in main () at src/main.c:175 175 GPIOD->ODR = LED_BL; (gdb) info all r0 0x15 21 r1 0x20010000 536936448 r2 0x4000 16384 r3 0x40020c00 1073875968 r4 0x0 0 r5 0x0 0 r6 0x0 0 r7 0x0 0 r8 0x0 0 r9 0x0 0 r10 0x0 0 r11 0x0 0 r12 0x0 0 sp 0x1000fff8 0x1000fff8 lr 0x20000269 536871529 pc 0x200002b7 0x200002b7 f0 0 (raw 0x000000000000000000000000) f1 0 (raw 0x000000000000000000000000) f2 0 (raw 0x000000000000000000000000) f3 0 (raw 0x000000000000000000000000) f4 0 (raw 0x000000000000000000000000) f5 0 (raw 0x000000000000000000000000) f6 0 (raw 0x000000000000000000000000) f7 0 (raw 0x000000000000000000000000) ---Type to continue, or q to quit--- fps 0x0 0 cpsr 0x0 0 (gdb) q A debugging session is active. Inferior 1 [Remote target] will be detached. Quit anyway? (y or n) y Ending remote debugging. $ [ご注意] ・このページの記載事項については,一切無保証です。
inserted by FC2 system