(SOLVED)Mbed-os 6 SWO viewer

Hello, I am new to mbed-os. Now I am trying to upgrade a program from mbed-os 5 to mbed-os 6.15. I am using the NUCLEO_H743ZI2 development board. I am using the library SWO viewer https://os.mbed.com/components/SWO-viewer/ to set up the SWO reading for my board.
I have tried to use stm32CubeProg Serial Wire Viewer to read the SWO, but it only read first several word then lost connection.

If anyone familiar with SWO, could you please help me to set up a robust and reliable SWO reading?

Thank you so much!


Hello,

Itried that I faced to same state like you wrote.
However on line 40 of .cpp
//May want to add initialisation stuff here
So I found an init code for Nucleo/H743ZI2 from this discussion - Feed Detail (st.com)

       *(__IO uint32_t*)(0x5C001004) |= 0x00700000; // DBGMCU_CR D3DBGCKEN D1DBGCKEN TRACECLKEN
     
      //UNLOCK FUNNEL
      *(__IO uint32_t*)(0x5C004FB0) = 0xC5ACCE55; // SWTF_LAR
      *(__IO uint32_t*)(0x5C003FB0) = 0xC5ACCE55; // SWO_LAR
     
      //SWO current output divisor register
      //This divisor value (0x000000C7) corresponds to 400Mhz
      //To change it, you can use the following rule
      // value = (CPU Freq/sw speed )-1
       *(__IO uint32_t*)(0x5C003010) = ((SystemCoreClock / 2000000) - 1); // SWO_CODR
     
      //SWO selected pin protocol register
       *(__IO uint32_t*)(0x5C0030F0) = 0x00000002; // SWO_SPPR
     
      //Enable ITM input of SWO trace funnel
       *(__IO uint32_t*)(0x5C004000) |= 0x00000001; // SWFT_CTRL
     
      //RCC_AHB4ENR enable GPIOB clock
       *(__IO uint32_t*)(0x580244E0) |= 0x00000002;
     
      // Configure GPIOB pin 3 as AF
       *(__IO uint32_t*)(0x58020400) = (*(__IO uint32_t*)(0x58020400) & 0xffffff3f) | 0x00000080;
     
      // Configure GPIOB pin 3 Speed
       *(__IO uint32_t*)(0x58020408) |= 0x00000080;
     
      // Force AF0 for GPIOB pin 3
       *(__IO uint32_t*)(0x58020420) &= 0xFFFF0FFF;

It is still same state with CubeProgrammer, but it looks good with ST-Link utility. I did not checked it according to any official documentation, so I do not know what could be wrong.

Also according to this duscussion, Mbed has SWO builded in, so you can try it without external library, like is descripted here by @hudakz. But It seems there is also the init required.

#include "mbed.h"
#include "SerialWireOutput.h"

DigitalOut  led1(LED1);

extern "C" void itm_init() {
       *(__IO uint32_t*)(0x5C001004) |= 0x00700000; // DBGMCU_CR D3DBGCKEN D1DBGCKEN TRACECLKEN
     
      //UNLOCK FUNNEL
      *(__IO uint32_t*)(0x5C004FB0) = 0xC5ACCE55; // SWTF_LAR
      *(__IO uint32_t*)(0x5C003FB0) = 0xC5ACCE55; // SWO_LAR
     
      //SWO current output divisor register
      //This divisor value (0x000000C7) corresponds to 400Mhz
      //To change it, you can use the following rule
      // value = (CPU Freq/sw speed )-1
       *(__IO uint32_t*)(0x5C003010) = ((SystemCoreClock / 2000000) - 1); // SWO_CODR
     
      //SWO selected pin protocol register
       *(__IO uint32_t*)(0x5C0030F0) = 0x00000002; // SWO_SPPR
     
      //Enable ITM input of SWO trace funnel
       *(__IO uint32_t*)(0x5C004000) |= 0x00000001; // SWFT_CTRL
     
      //RCC_AHB4ENR enable GPIOB clock
       *(__IO uint32_t*)(0x580244E0) |= 0x00000002;
     
      // Configure GPIOB pin 3 as AF
       *(__IO uint32_t*)(0x58020400) = (*(__IO uint32_t*)(0x58020400) & 0xffffff3f) | 0x00000080;
     
      // Configure GPIOB pin 3 Speed
       *(__IO uint32_t*)(0x58020408) |= 0x00000080;
     
      // Force AF0 for GPIOB pin 3
       *(__IO uint32_t*)(0x58020420) &= 0xFFFF0FFF;
 }

FileHandle* mbed::mbed_override_console(int)
{
    static SerialWireOutput swo;
    return &swo;
}

int main()
{
    printf("Hello, SWO!\r\n");
    thread_sleep_for(500);
    printf("CPU SystemCoreClock is %d Hz\r\n", SystemCoreClock);  
    thread_sleep_for(500);
    while (true) {
        led1 = !led1;
        printf("blink\r\n");
        thread_sleep_for(500);
    }
}

My mbed_app.json content

{
    "requires": ["bare-metal"],
    "target_overrides": {
        "*": {
            "target.printf_lib": "std",
            "target.device_has_add": ["ITM"]
			
        }
    }
}

BR, Jan

Thank you, Jan. It works for me!