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:
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:
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.
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:
Locate the file ‘pin_mux.c’ and add the following lines to BOARD_InitPins():
1
2
3
4
|
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():
1
2
3
4
|
/* Set TRACE_PODF. */ CLOCK_SetDiv(kCLOCK_TraceDiv, 2); /* Set Trace clock source. */ CLOCK_SetMux(kCLOCK_TraceMux, 2); |
and change it to
1
2
3
4
|
/* 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.
1
2
3
4
|
#if 1 /* enable SWO */ CLOCK_EnableClock(kCLOCK_Trace); #endif |
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
- - -
Originally published on June 3, 2019 by Erich Styger
You must be a registered user to add a comment. If you've already registered, sign in. Otherwise, register and sign in.