SWV(Serial Wire Viewer) инструмент отладки, встроенный в микроконтроллеры STM32 на базе ARM Cortex-M. Позволяет получать диагностическую информацию в реальном времени.С его помощью разработчик может выводить сообщения через printf, отслеживать значения переменных, анализировать работу периферии, данные регистров и собирать статистику исполнения кода.Всё это осуществляется через отдельную линию SWO, подключенную к встроенному отладчику ST-Link, что делает использование SWV удобным и практически незаметным для основной прошивки.
Настройка SWV.
Заходим в файл .ioc во вкладку SYS->Debug->Trace Asynchronous SW(расширенный режим, который включает поддержку SWV через пин SWO, обычно PB3 у STM32F4)
Затем заходим в Debug configuration. Включаем SWV — Enable.Выбираем частоту ( должна реально совпадать с нашим ядром )
Переопределим функцию _write
/* USER CODE BEGIN PFP */ int _write(int file, char *ptr, int len) { /* Implement your write code here, this is used by puts and printf for example */ int i = 0; for (i = 0; i < len; i++) ITM_SendChar((*ptr++)); return len; } /* USER CODE END PFP */
Переопределение функции _write() перенаправляет весь стандартный вывод (printf, puts) через SWV (ITM), поэтому после этого printf() больше не отправляет данные в UART — чтобы выводить через UART, нужно использовать прямые вызовы HAL_UART_Transmit().
Компилируем код и заходим в режим отладки.
Добавим SWV ITM Data Console. Для этого в верхней панели нажимаем Window-Show View-SWV-SWV ITM Data Console.
Переходим в неё и нажимаем кнопку настроек (Configure Trace)
Включаем порт 0.
Для нашего случая этого достаточно, но если вы хотите одновременно следить за несколькими значениями, может быть удобно включить несколько портов.
Далее нажимаем кнопку Start Trace на панели Data Console.
Добавим переменную для вывода
/* USER CODE BEGIN PV */ int count = 0; /* USER CODE END PV */
И сам вывод
/* USER CODE BEGIN 2 */ printf("Hello from Beartronix\n"); /* USER CODE END 2 */ /* Infinite loop */ /* USER CODE BEGIN WHILE */ while (1) { printf("count= %d\n", count); count++; HAL_Delay(1000); /* USER CODE END WHILE */ /* USER CODE BEGIN 3 */ } /* USER CODE END 3 */ }
В итоге SWO позволяет выводить отладочную информацию в консоль в реальном времени без остановки программы и использования UART.Для начала работы этого достаточно. Отдельно есть функционал Event Trace и возможность отслеживать изменения переменных и регистров (DWT), но об этом с в следующих статьях.