I spent some time and had to use some tricks to get SWD Debugging with the JLink Probe working on the Seed Wio Terminal.
I finally used this platformio.ini
[env:seeed_wio_terminal]
platform = atmelsam
board = seeed_wio_terminal
framework = arduino
upload_protocol = jlink
upload_port = jlink
debug_tool = jlink
The used Code blinks a led, writes some text on the device-display and writes to the console:
#include <Arduino.h>
#include "TFT_eSPI.h"
#include "Free_Fonts.h" //include the header file
TFT_eSPI tft;
int current_text_line = 0;
#define LCD_WIDTH 320
#define LCD_HEIGHT 240
#define LCD_FONT FreeSans9pt7b
#define LCD_LINE_HEIGHT 18
volatile int counter = 0;
volatile int counter2 = 0;
char strData[100];
void lcd_log_line(char* line) {
// clear line
tft.fillRect(0, current_text_line * LCD_LINE_HEIGHT, 320, LCD_LINE_HEIGHT, TFT_WHITE);
tft.drawString(line, 5, current_text_line * LCD_LINE_HEIGHT);
current_text_line++;
current_text_line %= ((LCD_HEIGHT-20)/LCD_LINE_HEIGHT);
if (current_text_line == 0) {
tft.fillScreen(TFT_WHITE);
}
}
void setup() {
tft.begin();
tft.setRotation(3);
tft.fillScreen(TFT_WHITE);
tft.setFreeFont(&LCD_FONT);
tft.setTextColor(TFT_BLACK);
pinMode(LED_BUILTIN, OUTPUT);
lcd_log_line("Starting");
Serial.begin(9600);
Serial.println("\r\nHello, I'm starting ");
}
void loop() {
for (int i = 0; i < 5; i++)
{
digitalWrite(LED_BUILTIN, HIGH);
delay(500);
digitalWrite(LED_BUILTIN, LOW);
delay(500);
sprintf(strData, "Inner Loop %u", i);
lcd_log_line(strData);
Serial.print("Inner Loop ");
Serial.println(i);
}
sprintf(strData, " Outer Loop %u", counter);
lcd_log_line(strData);
Serial.print(" Outer Loop ");
Serial.println(counter);
counter++;
}
When I started debugging the application crashed, seemgly because the USB-Port couldn’t be opened again.
By setting breakpoints I could find out that all went well to the ‘USBDevice.attach();’ command 'in the file arduino/main.cpp
As a preliminary solution I could get debugging working by commenting out these two ‘USBDevice’ commands.
#if defined(USE_TINYUSB)
Adafruit_TinyUSB_Core_init();
#elif defined(USBCON)
//USBDevice.init();
//USBDevice.attach();
#endif
The disadvantages were that the console output didn’t work and that delay() commands didn’t give the correct delay time.
Has anybody debugging working on the Wio Terminal without these hacks or knows an apparent cause/solution why it is not working as is?
First Edit:
Oh, I was happy too early.
Now when I worked on another application Platformio/Jlink couldn’t reach a next breakpoint when I clicked ‘Continue’ at the first temporary breakpoint. Then, when I clicked ‘Restart (Ctrl Shift F5)’ it stopped again at the first temporary breakpoint but after clicking ‘Continue’ again, it reached the first breakpoint in my setup() routine.
All these hacks are rather ugly and I would be happy to find a better solution.