Debugging STM32F103C8T6 menggunakan SW4STM32 + OpenOCD + STLINK

Ini adalah bagian keempat mengenai penggunaan SW4STM32. Bagian sebelumnya telah disebutkan di tulisan ini. Setelah sebelumnya berhasil melakukan instalasi SW4STM32, di sini akan diungkapkan catatan mengenai bagaimana mempergunakannya untuk proses debugging.

Untuk kelancaran proses berikutnya; lakukan terlebih dahulu instalasi ST-Link V2 dan OpenOCD. Instalasi perangkat lunak untuk ST-LinkV2 sudah dibahas di tulisan sebelumnya [link].  Untuk OpenOCD pun proses instalasinya umumnya tidak terlalu sulit, terutama untuk sistem berbasis Microsoft Windows. Untuk sistem GNU/Linux setelah mengunduh file instalasinya di link ini, maka lakukan proses berikut:

cd ~/openocd-0.9.0
sudo ./configure
sudo make
sudo make install

Kembali ke SW4STM32:

OCDdebug001Gambar 1. Awal pengaturan untuk debugging.

OCDdebug002Gambar 2.

Jika cara seperti pada Gambar 1 dan Gambar 2 menghasilkan pesan keesalahan, maka cobalah cara seperti Gambar 3.

OCDdebug003Gambar 3.

OCDdebug004Gambar 4. Pada proses debugging untuk pertama kali, diperlukan pengaturan seperti ini.

OCDdebug005Gambar 5.

OCDdebug006Gambar 6.

OCDdebug007Gambar 7. Scroll ke bawah hingga seperti pada Gambar 8.

OCDdebug008Gambar 8.

OCDdebug009Gambar 9.

Selain mempergunakan konfigurasi Ac6, pengguna bisa juga mempergunakan cara debugging lain seperti pada Gambar 10.

OCDdebug010Gambar 10.

OCDdebug011Gambar 11.

OCDdebug012Gambar 12.

OCDdebug013Gambar 13.

OCDdebug014Gambar 14.

OCDdebug015Gambar 15.

Nah sekarang pengguna sudah memilki dua konfigurasi debugging yang siap dipergunakan. Tetapi sebelum melakukan mencoba upaya debugging dengan bantuan OpenOCD + STLINK, perlu dilakukan perubahan kode uji. Gambahkan di bagian endless loop dengan kode uji coba blinking led:

  while (1)
    {
//      HAL_GPIO_TogglePin (LedMerah_GPIO_Port, LedMerah_Pin);
      HAL_GPIO_TogglePin(GPIOC,GPIO_PIN_13);
      HAL_Delay (100);
      /* USER CODE END WHILE */
      /* USER CODE BEGIN 3 */
    }

Hubungkan dongle ST-LINK V2 ke port USB di komputer.

wp-1472023019498.jpegGambar 16.

Lalu aktifkan OpenOCD dengan baris perintah berikut (sesuaikan letak file dengan konfigurasi di komputer pengguna):

$ reset; openocd -f ~/openocd-0.9.0/tcl/interface/stlink-v2.cfg -f ~/openocd-0.9.0/tcl/target/stm32f1x.cfg

Saat aktif OpenOCD pada terminal seperti pada Gambar 17.

OCDdebug016Gambar 17. OpenOCD menunggu koneksi.

Jika nanti dengan konfigurasi standard yang diatur oleh SW4STM32 gagal berfungsi dengan baik, salah satu upaya solusi adalah dengan membuat file konfigurasi baru yang akan diacu oleh setting dalam SW4STM32. Konfigurasi dalam file STM32F103SW.cfg yang perlu diganti (di dalam file lain) adalah: reset_config srst_nogate.

# This is an STM32F103SW board with a single STM32F103C8Tx chip.
# Generated by System Workbench for STM32

source [find interface/stlink-v2.cfg]

set WORKAREASIZE 0x5000
transport select "hla_swd"


source [find target/stm32f1x_stlink.cfg]

# use hardware reset, connect under reset
#reset_config srst_only srst_nogate
reset_config srst_nogate

Jika papan mikrokontroler STM32F103C8T6 tidak dapat diprogram atau di-debug, salah satu cara adalah dengan melakukan erase. Ubah posisi jumper seperti pada Gambar 18.

wp-1472127176031.jpegGambar 18.

Lalu seperti pada Gambar 19 perintah erase dapat dilakukan setelah tombol reset pada papan ditekan dalam keadaan konfigurasi jumper seperti pada Gambar 18.

OCDdebug017Gambar 19. st-flash erase

Ok, sekarang kembali ke Gambar 16, diasumsikan semua kondisi normal dan posisi jumper sudah kembali ke posisi seperti pada gambar. Dilanjutkan pada posisi monitoring seperti pada Gambar 17. Maka proses debugging siap dilakukan dari dalam SW4STM32.

OCDdebug018Gambar 20.

Pada pilihan konfigurasi seperti pada Gambar 20, debugging terkadang dapat saya lakukan tanpa perlu melakukan aktifasi OpenOCD eksternal. Tetapi untuk amannya maka tetap pergunakan OpenOCD eksternal.

OCDdebug019Gambar 21. [Klik gambar untuk memperbesar tampilan]

Hal  yang sama juga diperoleh jika mempergunakan konfigurasi GDB Hardware Debugging.

Berikut adalah video singkat proses uji debugging.

[intense_video video_type=”youtube” video_url=”https://www.youtube.com/watch?v=6MtAfxhhEsE”]

Mendapatkan hasil kompilasi dengan debug symbols di Atom+PlatformIO

PlatformIO pada text editor Atom dapat dipergunakan untuk menghasilkan kode program yang bisa di-debug. Tetapi tanpa pengaturan yang tepat akan muncul kesalahan sebagaimana yang terlihat di Gambar 1 (no debugging symbols found).

xpiodbg003Gambar 1.

Untuk mengatasi masalah ini solusinya adalah dengan memberikan keterangan tambahan pada file platformio.ini .

xpiodbg001Gambar 2.

Untuk lebih mempermudah bisa disalin dari bagian berikut ini:

#
# PlatformIO Project Configuration File
#
# Please make sure to read documentation with examples first
# http://docs.platformio.org/en/stable/projectconf.html
#
[env:nucleo_f103rb]
platform = ststm32
framework = mbed
#build_flags = -g
board = nucleo_f103rb
upload_protocol = stlink

Keterangan lengkap mengenai penggunaan building options  di PlatformIO bisa dibaca di link ini. Untuk opsi debugging dengan compiler GCC bisa dibaca di sini.

-g

Produce debugging information in the operating system’s native format (stabs, COFF, XCOFF, or DWARF). GDB can work with this debugging information.

On most systems that use stabs format, -g enables use of extra debugging information that only GDB can use; this extra information makes debugging work better in GDB but probably makes other debuggers crash or refuse to read the program. If you want to control for certain whether to generate the extra information, use -gstabs+, -gstabs, -gxcoff+, -gxcoff, or -gvms (see below).

 

xpiodbg002Gambar 3. Hasil kompilasi yang berhasil di-debug  dengan DDD dan gdb.

 

 Command  Explanation
bp <address> [<asid>]<length> [‘hw’|’hw_ctx’]

list or set hardware or software breakpoint

exit exit telnet session
halt [milliseconds]

request target to halt, then wait up to the specifiednumber of milliseconds (default 5000) for it to complete

init Initializes configured targets and servers. Changes command mode from CONFIG to EXEC.  Unless ‘noinit’ is called, this command is called automatically at the end of startup. (command valid any time)
load_image filename address [ ‘bin’ | ‘ihex’ | ‘elf’ | ‘s19’ ] [min_address] [max_length]
reg [(register_number|register_name) [(value|’force’)]]

display (reread from target with “force”) or set a register; with no arguments, displays all registers and their values

reset [ run | halt | init ]

Reset all targets into the specified mode.Default reset mode is run, if not given.

resume [address]

resume target execution from current PC or address

step  [address]

step one instruction from current PC or address

Cmd
  • openocd -f ~/openocd-0.9.0/tcl/interface/stlink-v2.cfg -f ~/openocd-0.9.0/tcl/target/stm32f1x.cfg
  • telnet localhost 4444
    • help
    • halt
  • arm-none-eabi-gdb ––eval-command=”target remote localhost:3333″ firmware.elf
  • ddd ––eval-command=”target remote localhost:3333″ ––debugger arm-none-eabi-gdb firmware.elf