With the cost of a single pin, many ARM Cortex-M boards, including the NXP i.MX RT1064 , can produce SWO data: Think about a pin that’s able to stream data out of the chip in real-time. For example, it can interrupt activity, which, otherwise, might be hard to capture:
SWO Interrupt Trace
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.
i.MX RT1064-EVK Board
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.
JTAG TDO Pin (Source: NXP i.MX RT1064 Schematics)
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
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:
Open SDK zip file
Locate the manifest XML file:
SDK Manifest File
To check/edit the manifest 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:
Selected Files Open Option
Open with the context menu the XML description:
Show XML Description
In the XML editor, click on the ‘Source’ tab. Search for
XML Source tab
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, it’s best to recreate the part information in the IDE:
Recreate Part Information
Muxing SWO Pin
Locate the file
pin_mux.c and add the following lines to
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);
clock_config.c and search for the following inside the function
/* 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);
Clock div and mux
Finally, add the following to the end of the function
BOARD_BootClockRUN() , or add it to
main() after the clocks have been initialized.
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 an LPC-Link2 firmware.
Debugging i.MX RT1064 Board with LPC-Link2
In the SWO Trace Config view, the ‘change’ button shall now be enabled:
SWO Trace Config
Use the ‘Detect’ button to detect the SWO speed (note that for the application shall have already passed the clock configuration code):
Detect SWO speed
After this, I can open the various SWO views:
Open SWO views
The views have a green ‘start’ button to start data collection from SWO:
SWO Counters view:
SWO Statistical Profiling:
SWO Profile View
SWO Data Trace:
SWO Data Trace
Text output with SWO:
ITM Text Output
SWO Interrupt Trace:
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 an 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 below).
- 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