Files
libopencm3-examples/examples/stm32/l1/stm32l-discovery/usart-semihosting

README

This example program sends some characters on USART2 on the ST STM32L DISCOVERY eval board. (USART2 TX on PA2 @ 115200 8n1)

It can ALSO use semihosting to use regular stdio via the attached debugger. This expects you to be using gcc-arm-embedded from https://launchpad.net/gcc-arm-embedded

Semihosting is a neat feature, but remember that your application will NOT WORK standalone if you have semihosting turned on!

$ make ENABLE_SEMIHOSTING=0 will rebuild this image _without_ semihosting

Semihosting is supported in "recent"[1] OpenOCD versions, however, you need to enable semihosting first! If you have not enabled semihosting, you will receive a message like this:

(gdb) run
The program being debugged has been started already.
Start it from the beginning? (y or n) y

Starting program:
/home/karlp/src/libopencm3-examples/examples/stm32/l1/stm32l-discovery/usart-semihosting/usart-semihosting.elf 

Program received signal SIGTRAP, Trace/breakpoint trap.
0x08000456 in initialise_monitor_handles ()
(gdb)

# Here we enable semi-hosting

(gdb) mon arm semihosting enable
semihosting is enabled
(gdb) continue
...

You should now see the semihosting output in the window running OpenOCD.

Size Notes

Semihosting is basically free

Without

$ arm-none-eabi-size usart-semihosting.elf 
   text	   data	    bss	    dec	    hex	filename
  29056	   2212	     60	  31328	   7a60	usart-semihosting.elf

With

$ arm-none-eabi-size usart-semihosting.elf 
   text	   data	    bss	    dec	    hex	filename
  29832	   2212	    232	  32276	   7e14	usart-semihosting.elf

The large size here is because of printf being included regardless, see nano.specs if you care about this, this data here is to show that semihosting doesn't cost much at all.

[1] At least since OpenOcd version 0.8.0-dev-00011-g70a2ffa (2013-05-14-19:41) possibly earlier.