Change the world

Download: Examples - Serial Wire


Being able to display values for counters, sensors and other debugging information is an important part of software development for microcontrollers.  Writing software for PCs is much easier in this regard as there is already a monitor to which you could print values etc. to simply the development process.  For microcontrollers the obvious choice is to use a LCD connected to some of the microcontroller's port pins and with the use of the proper LCD library one can then print these values to the LCD.  This does however increase your development cost as the LCDs will normally cost in the region of R100 - R300 and often supporting interfacing circuitry will have to be build for the correct operation of the LCD.  With the SMT32 microcontrollers, there are fortunately other options:

  • Use the in-circuit debugger.  This is a very powerful feature, but requires a bit of learning.
  • Use the UART/USART module.  By connecting the TX and RX pins through an appropriate voltage level converter to a PC's COM port, one can print values to a Serial Monitor (e.g. Termite, Hyperterminal, etc.) application on the PC, and even get values from the PC.
  • Use a Virtual COM Port (VCP).  Provides the same functionality as the UART/USART, but does not require the use of a voltage level converter and is plugged into a USB port which simulates a COM port.  This does require appropriate drivers on the PC and also on the microcontroller.  Furthermore the microcontroller must have an USB module.
  • Use the Serial Wire Output (SWO).  This feature will allow one to print values to a Serial Wire Viewer (SWV) via the SWO pin on the mictrontoller and the in-circuit programmer with no additional hardware, cables or drivers.

This section will describe how to use and set up the Serial Wire Viewer for the STM32F4-Discovery.  The other options are also explained in seperate sections.

Here are the topics to cover for using the SWV:



The STM32F3-Discovery includes a built-in ST-Link/V2 in-circuit programmer and debugger which is used in the Keil MDK (uVision) to download the source code to the ARM microcontroller.  This will also provide the interface through which the ARM microcontroller will send a value to be printed to the SWV.  The following is required:

  1. Disconnect the USB cable.
  2. Remove the two jumpers (CN4) on the board.
  3. Connect the USB cable
  4. Open the ST-Link Utility
  5. Select ST-LinkFirmware update
  6. Click Device Connect
  7. Click Yes
  8. Close the update window and the ST-Link Utility
  9. Disconnect the USB cable
  10. Replace the two jumpers (CN4)


STM32F4-Discovery board

By default the SWO pin of the STM32F407VGT6 microcontroller is is NOT linked to the ST-Link/V2 programmer.  To create the link, we can do the following:

  • Connect a wire link between PB3 and pin6 of the SWD connector (CN2)




  • Close the solder bridge (jumper) SB12 at the botom of the board by soldering the two pads together.  This is a more permanent option, but can be reversed by carefully de-soldering the two pads and making sure with a multi-meter that they are indeed seperated.



Please note that PB3 can now not be used as a normal GPIO pin, until the above changes are reversed.


Configuring a Keil project

Assuming that you have an already working project which is correctly set up for Flash programming and debugging, do the following to add the SWV capability (you can use the example source files at the top of this page):

  1. Open the project in Keil MDK (uVision)
  2. Right-click on the project name in the Project window and select Options for target ...
  3. In the Debug tab, select Settings
  4. In the Trace tab, make the following selections:

  1. Click OK
  2. Close the Options for Target dialog
  3. Compile and Flash Download (program)/Debug as usual.


Add code

The standard printf statement makes use of the fputc function.  We need to retarget the fputc function to use the Trace on ITM Stimulus Port 0.  To do this, simply add the following code to your programs that uses the SWV:

int fputc(int ch, FILE *f)


The fputc function could actually be retargetted to print to the SWV and to the USART (or even an LCD) at the same time, e.g:

int fputc(int ch, FILE *f)
    /* the USART */
    UART4->TDR = (ch & (uint16_t)0x01FF);
    while ((UART4->ISR & USART_FLAG_TXE) == (uint16_t) RESET);
    /* the SWV */


Using the Serial Wire Viewer (SWV)

Once all the previous topics were done, do the following to use the SWV:

  1. Open the STM32 ST-Link Utility
  2. Select ST-LINK Printf via SWO viewer
  3. Set the System clock to 168000000
  4. Set the Stimulus port to 0
  5. Click Start

The SWV is now ready for receiving characters and values from the printf statements in the source code.  It has now grabbed the handle and interface to the ST-Link/V2 programmer and Flash Downloading and Debuggin in uVision will now not be possible.  To reprogram changes or new source code to the STM32F4-Discovery board, you will have to:

  1. Click STOP in the SWV window
  2. Click the Disconnect button


The handle and interface to the ST-Link/V2 programmer is now released and can be used in Keil uVision again to program the device as usual. 

Clicking Start in the SWV window will now reset the board and start the serial connection again.