8

I'm new using STM32 microcontrollers. I have been trying to use the printf tracing in my code without success, nothing 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:

enter image description here

enter image description here

enter image description here

enter image description here

enter image description here

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);
}

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

JRE
  • 67,678
  • 8
  • 104
  • 179
Marc
  • 491
  • 1
  • 5
  • 20

5 Answers5

10

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:

Enable SWV in TrueSTUDIO

  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.
Heath Raftery
  • 3,101
  • 1
  • 11
  • 16
  • 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
7

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

ChrisD91
  • 665
  • 1
  • 9
  • 17
4

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.

Show the configuration SYSCLK

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

Show the configuration debugger

I run this under Debian 10.

Greenonline
  • 2,064
  • 7
  • 23
  • 38
0

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:

bluepill pinout

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.

caligari
  • 161
  • 8
  • 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 09: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 09:39
  • @Sanbrother For what it's worth, with a bit of wire, a soldering iron, and some patience those cheap ST-Link clones can generally be modified to expose the 'SWO' pin. I've done so with one of mine and found it works quite well! – PfhorSlayer Mar 26 '21 at 04:28
  • https://electronics.stackexchange.com/questions/206113/how-do-i-use-the-printf-function-on-stm32/650659#650659 – Robin Feb 03 '23 at 10:36
0

This problem can be resolved by matching the clock configuration, system core clock and tge ST link debugger core clock. The default in the ST-link debugger doesn't match the core clock so we have to manually type and match it. I resolved my issue with this.

JRE
  • 67,678
  • 8
  • 104
  • 179