Приём данных с SWO (Serial Wire Output)

SWO (Serial Wire Output) — это односторонний вывод, который позволяет микроконтроллеру в реальном времени отправлять данные отладчику без остановки выполнения программы. Это идеально для:

  • Вывода отладочных сообщений (альтернатива UART, но без задержек)
  • Профилирования кода (измерение времени выполнения функций)
  • Сбора статистики (счетчики, события)
  • Системного мониторинга (загрузка CPU, использование памяти)

Основное преимущество перед UART: не нужно занимать USART и настраивать прерывания, данные передаются по отдельному каналу отладки.

  • Подклюните пин SWO (PB3) на вашем STM32F411CEUX к выводу SWO (пин 6) на отладчике ST-Link/V2.1.

Обязательно: Подключите GND, SWDIO, SWCLK как обычно.

Откройте файл .ioc вашего проекта. Системный ядро -> SYS. Debug: Выберите Serial Wire

  • Убедитесь, что ядро (HCLK) тактируется на стандартной частоте (например, 96 МГц для F411). SWO требует правильной настройки тактирования!
  • Зайдите в Run -> Debug Configurations:
  • Добавьте в ваш код (например, в main.c):

(ITM_SendChar может отсутствовать!)

/* Подключаем модуль для ITM (Instrumentation Trace Macrocell) */
#include "stdio.h" // Если хотите использовать printf

// Функция для отправки одного символа через SWO
void ITM_SendChar(uint8_t ch) {
    if (ITM->TCR & ITM_TCR_ITMENA_Msk) {        // Проверяем, включен ли ITM
        while (ITM->PORT[0].u32 == 0);          // Ждем, пока порт не освободится
        ITM->PORT[0].u8 = ch;                   // Отправляем байт
    }
}

// Опционально: перенаправляем printf на SWO (удобно для отладки)
int _write(int file, char *ptr, int len) {
    for (int i = 0; i < len; i++) {
        ITM_SendChar(ptr[i]);
    }
    return len;
}

Пример использования в main():

int main(void) {
  HAL_Init();
  SystemClock_Config();
  // ... остальная инициализация

  // Простой вывод символа
  ITM_SendChar('A');

  // Использование printf (если подключили _write)
  printf("Hello from SWO! System clock: %lu Hz\r\n", SystemCoreClock);

  while (1) {
      HAL_Delay(1000);
      printf("Tick: %lu\r\n", HAL_GetTick()); // Вывод каждую секунду
  }
}

— Перейдите в меню Window -> Show View -> Other… Введите «SWV» и выберите SWV ITM Data Console:

— Начните отладку (Debug) ВАЖНО!!!!

— На вкладке «ITM Stimulus Ports» при помощи «+» выберите порт, например, 0:

Возле выбранных портов поставьте галочку:

Теперь данные будут появляться только при отладке. Чтобы отправить данные на SWO можно использовать функцию printf в коде.


Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *