2018年7月16日月曜日

Ubuntu 17.10上で openocd と gdb で STM32H743 を debug する方法

自前 USB stack (CDC, AUDIO, MSC) を作成しているが, MSC class実装時に memory を壊して hard fault を起してそうであるが, hard fault を起した場所は分るようにしているが, すでに memory がグチャグチャになっている後なので, どこで本当の原因のである memory を壊しているか全く分らない.

いままであまり debugger に頼らず soft を書いていたが, こればかりはどうしようもない.

そこで, opencd で ST-LINK を使い ST32H743 に接続し, debugger として gdb を使用できる様に環境を整えた.



環境について

環境は以下の通り
Ubuntu 17.10
openocd (apt installしたもの  0.10.0)
stm32f7x.cfg (openocd を apt install して install されているもの)
stm32h7x.cfg (stm32f7x.cfg を copy して STM32H7 系に変更したもの)
gdb (apt install したもの)

        connection
        gdb -----(localhost:3333)---- openocd -----(USB)------ STLINK ------(SWD)----- STM32H743


Install

# 1. apt get する
sudo apt install openocd gdb-arm-none-eabi 
#  2. stm32f の設定 file を stm32h 用に copy する
sudo cp /usr/share/openocd/scripts/target/stm32f7x.cfg /usr/share/openocd/scripts/target/stm32h7x.cfg

# 3. stm32h7x.cfg の 34行目の _CPUTAPID を 0x6ba02477 に変更
sudo vi /usr/share/openocd/scripts/target/stm32h7x.cfg
# 4. usb の rule file を作成
sudo vi /etc/udev/rules.d/99-stlink.rules
# 以下を追加
SUBSYSTEM=="usb", ATTR{idVendor}=="0483", ATTR{idProduct}=="374b", GROUP="plugdev", MODE="666", SYMLINK+="stlinkv2_%n"
# 5. udev を更新
sudo udevadm control --reload-rules
# 6. gdb_memory_map disable を stlink-v2-1.cfg に追加
sudo echo "gdb_memory_map disable" >> /usr/share/openocd/scripts/interface/stlink-v2-1.cfg


Exec for Debugging

# 11. openocd を起動し, STM32H743 に接続 (openocd の port#3333 が gdb 接続待ちになる)
openocd -f interface/stlink-v2-1.cfg -f target/stm32h7x.cfg
# 12. gdb を起動
arm-none-eabi-gdb   binary.elf

Debugging (gdb上での操作)

target remote :3333               # openocd に接続
monitor reset halt                # STM32H743 を reset
load                                     # symbol情報 elfから取得
b FunctionName                       # breakpoint の設定、    必要であれば
continue                                # 起動

[Ctrl-C]                                           # 停止, もしくは breakpoint で自動停止
bt                                                # trace 情報を表示
print ValiableName                 # 変数名 "ValiableName" の値を表示

info break                                        # 設定されている breakpoint の表示
delete breakp n                                # n 番の breakpoint を削除
delete                                             # breakpoint 全削除

continue                                          # 再起動






0 件のコメント:

コメントを投稿