With the cost of an single pin, many ARM Cortex-M boards including the NXP i.MX RT1064 can produde SWO data: think about a pin able to stream data out of the chip in realtime. For example interrupt activity which otherwise might be hard to capture:
This article describes how to enable and use the SWO (Single Wire Output) of the ARM Cortex-M7 present in the NXP i.MX RT1064 device.
While this is a very valuable feature, not every development tool supports capturing SWO data. And not every board has the SWO pin routed to the debug header which is a prerequisite to get the data.
The pin is connected to the AD_B0_10 pin of the i.MX RT1064 device.
Software and tools used:
- Eclipse: NXP MCUXpresso IDE 10.3.1
- SDK: NXP MCUXpresso SDK 2.4.1 for i.MX RT1064-EVK
Check SDK Manifest File
💡 This step is only necessary for an older SDK as the V2.4.1 used in this article. I updated later on my SDK, and with the current one (at this time of writing: V2.6.1) the modification of the SDK is *not* necessary any more.
To use SWO, it has to be enabled in the SDK manifest file. So let’s check this first.
In the IDE, open the location where the SDK zip files are installed:
💡 Best to close the IDE now, as we might need to change the content on disk.
Open the archive:
Locate the manifest XML file:
To check/edit the manifext XML file I can use an external editor or the IDE:
Using the IDE
I can use the IDE to edit the XML (this is useful if I want to change the SDK sources).
To check/edit the file in the IDE workspace preferences, disable the ‘Selected files from SDK View open in read-only mode:
Open with the context menu the XML description:
In the XML editor, click on the ‘Source’ tab. Search for internal.has_swo:
Verify that it has a ‘true’ value. If not, change it to true and save the file.
Using external editor
Below are the steps using an external editor.
Open the file with a text editor and search for ‘internal_has_swo’ and check if it has a ‘true’ value. If not: change the value to true:
If that change is needed: update the zip file with the new content/file.
💡 if that setting is set to false, the IDE does not offer the SWO feature and buttons/views will be grayed out/disabled.
Now I can start the IDE again. If I had to modify the XML file, best to recreate the part information in the IDE:
Muxing SWO Pin
Locate the file ‘pin_mux.c’ and add the following lines to BOARD_InitPins():
IOMUXC_SetPinMux( IOMUXC_GPIO_AD_B0_10_ARM_CM7_TRACE_SWO, /* GPIO_AD_B0_10 is configured as ARM_TRACE_SWO */ 0U); /* Software Input On Field: Input Path is determined by functionality */ IOMUXC_SetPinConfig(IOMUXC_GPIO_AD_B0_10_ARM_CM7_TRACE_SWO,0x00F9u);
Open ‘clock_config.c’ and search for the following inside the function BOARD_BootClockRUN():
/* Set TRACE_PODF. */ CLOCK_SetDiv(kCLOCK_TraceDiv, 2); /* Set Trace clock source. */ CLOCK_SetMux(kCLOCK_TraceMux, 2);
and change it to
/* Set TRACE_PODF. */ CLOCK_SetDiv(kCLOCK_TraceDiv, 0); /* Set Trace clock source. */ CLOCK_SetMux(kCLOCK_TraceMux, 3);
Finally, add the following to the end of the function BOARD_BootClockRUN(), or add it to main() after the clocks have been initialized.
#if 1 /* enable SWO */ //*((uint32_t *)(0x400E0600)) = (1 << 11); /* enable TPIU clock */ CLOCK_EnableClock(kCLOCK_Trace); #endif
💡 That original code from NXP had the write to 0x400e’0600 in it which seems not to be correct, so I have taken it out.
The onboard DAPLink debug probe does *not* support SWO, so I’m using an external debug probe (LPC-Link2). Alternatively, the EVK board can be loaded with a LPC-Link2 firmware.
In the SWO Trace Config view, the ‘change’ button shall now be enabled:
Use the ‘Detect’ button to detect the SWO speed (note that for the application shall have already passed the clock configuration code):
After this, I can open the various SWO views:
The views have a green ‘start’ button to start data collection from SWO:
SWO Counters view:
SWO statistical profiling:
SWO Data Trace:
Text output with SWO:
SWO Interrupt Trace:
💡 The IDE reveference manual/online help describes the views in more detail.
SWO on the i.MX RT1064 board is a fine thing: it requires some setup and a SWO capable debug probe. But with that extra ARM SWO pin I get extended debug views and data which are very valuable.
I have put an example project on GitHub (see Links section).
Happy SWOing 🙂
- Project on GitHub: https://github.com/ErichStyger/mcuoneclipse/tree/master/Examples/MCUXpresso/i.MX%20RT1064_EVK/MIMXRT1064_SWO
- MCUXpresso IDE: http://www.nxp.com/mcuxpresso/ide
- MCUXpresso SDK: http://mcuxpresso.nxp.com/
- Using i.MX RT1060 with MCUXpresso IDE: https://community.nxp.com/community/mcuxpresso/mcuxpresso-ide/blog/2019/01/23/overview-of-using-the-mimxrt1060-evk-with-mcuxpresso-ide
- ARM SWO Performance Counters
- Tutorial: Using Single Wire Output SWO with ARM Cortex-M and Eclipse