OpenOCD server
Start the openocd server in one command window. See the previous post Using OpenOCD to flash ARM Cortex M3.
#daemon configuration ################################################ telnet_port 4444 gdb_port 3333 #interface configuration ############################################# # # Olimex ARM-USB-OCD-H # # http://www.olimex.com/dev/arm-usb-ocd-h.html # source [find interface/ftdi/olimex-arm-usb-ocd-h.cfg] #board configuration ################################################# # Olimex STM32-H103 eval board # http://olimex.com/dev/stm32-h103.html source [find board/olimex_stm32_h103.cfg] gdb_memory_map enable
$ openocd -f openocd.cfg
Flashing
We flash test_program.bin
onto the ARM Cortex M3 using OpenOcd.
Connect to the openocd server using telnet in another command window
$ telnet localhost 4444
Halt execution of target in case it is running
reset halt
Erase content on flash
stm32f1x mass_erase 0
Flash test_program.bin
flash write_bank 0 test_program.bin 0
Run program but halt directly so that we can control the execution via the debugger (gdb)
reset halt
Debugging
Run gdb using our test program and connect to the openocd server on port 3333. We use the GDB TUI (Text User Interface) as described in Use GDB on an ARM assembly program.
gdb-multiarch -tui --eval-command="target remote localhost:3333" test_program.elf
Display register values in GDB
(gdb) layout regs
Set a break point at the beginning of the main()
function in test_program.c
.
(gdb) hbreak main Hardware assisted breakpoint 1 at 0x7c: file test_program.c, line 7. (gdb) c Continuing. Breakpoint 1, main () at test_program.c:7
Inspect the values of a
, b
and sum
before executing sum = a + b
.
(gdb) x 0x00000098 0x98 <a>: 0x00000007 (gdb) x 0x20000000 0x20000000 <b>: 0x00000008 (gdb) x 0x20000004 0x20000004 <sum>: 0x00000000
Execute sum = a + b
using the GDB step
command (section 5.2 in GDB manual) and inspect sum
variable again.
(gdb) s (gdb) x 0x20000004 0x20000004 <sum>: 0x0000000f
The sum
variable now equals 0x0F (15) which is correct.