# STM32 (SWD) printf not working

I'm new using STM32 microcontrollers, I have been trying to use the printf tracing in my code without success, anything is printed on the console. I can start a debug session, I can place breakpoints on my code, inspect variables and all works as expected but not the printf.

My setup :

I have reimplemented the _write method:

int _write(int32_t file, uint8_t *ptr, int32_t len)
{
/* Implement your write code here, this is used by puts and printf for example */
int i=0;
for(i=0 ; i<len ; i++)
ITM_SendChar((*ptr++));
return len;

}


And placed a breakpoint on:

__STATIC_INLINE uint32_t ITM_SendChar (uint32_t ch)
{
if (((ITM->TCR & ITM_TCR_ITMENA_Msk) != 0UL) &&      /* ITM enabled */
((ITM->TER & 1UL               ) != 0UL)   )     /* ITM Port #0 enabled */
{
while (ITM->PORT[0U].u32 == 0UL)
{
__NOP();
}
ITM->PORT[0U].u8 = (uint8_t)ch;
}
return (ch);
}


And ITM->PORT[0U].u8 = (uint8_t)ch; is being executed, but no printf ouput in console.

There are three extra magic steps to get this working:

1. Serial Wire View (SWV) tracing must be enabled. You haven't specified, but the IDE you're using looks similar to Atollic TrueSTUDIO. In that IDE, you enable SWV in the Debug configuration by enabling the checkbox shown in this image:

1. You must "Start Trace" during every new debug session. In your screenshot it looks like you've already done it by clicking the red round button in the SWV ITM Data Console pane, but to make sure have another look around for a "SWV Console" window and click the red round button.
2. And you must connect the SWV pin. SWD only requires GND, SWCLK and SWDIO for debugging. If you also want Trace functionality you need to connect the SWV pin. Confusingly, the SWV pin is often called the SWO pin. It's usually shared with the JTDO JTAG pin. Should be pin 39 (PB3) on the STM32F103 Blue Pill.
• Hi, I forgot to mention it in my original post but I already did both things, also ITM->PORT[0U].u8 = (uint8_t)ch is only executed when the "red rounded button" is pressed. – Marc Jun 28 '19 at 11:15
• Well then you must be very close... have you actually connected the SWV pin? I can only see 3 wires connected in the photo. They'd have to be GND, SWCLK and SWDIO if you can debug. You also need SWV is you want Trace functionality. – Heath Raftery Jun 29 '19 at 23:03
• that was it, now I'm getting garbage but at least I'm getting something, thanks! – Marc Jun 30 '19 at 18:01

One thing that's not been mentioned is that assuming that all the connections are correct and that the IDE has been properly configured, printf may not show up in the console or may show up but be corrupted if \n isn't added to the printf function. eg.

printf("Hello World!");


Will either not work or show garbage, whereas:

printf("Hello World!\n");


Does work. This is true for STM32s CubeIDE

• Thanks man, I searched 2 hours until I found your post that solved my problem! – Paul G. Apr 20 '20 at 14:58

I had the same problem, I solved it by changing some settings. First take a look at your configuration in the ST_CUBE_MX in the clock configuration in the value of SYSCLK.

And then this same value you must write in the debugger settings, like this:

I run this under Debian 10.

You will able to print debug info via SWO method or UART-TX (simplier and common):

SWO method:

In the Bluepill MCU (STM32F103), SWO pin is PB3: connect this pin with your stlinkv2 programmer:

Moreover, you will have to use a specific printf using SWO interface (see SWO_PrintString() in this tutorial).

UART-TX method:

Initialize one of the 3 UARTs to send chars through the TX pin and receive the messages in your PC with a well-known USB-UART adapter. Probably, you will use the implemented method in your favorite RTOS or framework to send strings to the UART.

• Hi thanks I know, UART works fine I already tried but I want to understand why SWD printf is not working in my case. – Marc Jun 28 '19 at 12:53
• My ST-Link (very cheap one) does not have a 'SWO' pin, so it is impossible to do that for me. – Sanbrother Sep 30 '20 at 9:08
• @Sanbrother Just use one of those serial to USB converters(making sure to 3.3V). Then connect a terminal program to the comm port the converter ties to. The vast majority of debug libraries default to using async for SWO output. – GB - AE7OO Dec 29 '20 at 9:39