Данная статья написана не для бывалых и бородатых, а для маленьких и зеленых, которые не могут попасть в рот ложкой с первого раза, в целом как и автор :-)

что имеем для работы:

  1. оригинальный STlink-v3minie

  2. отладочная плата от WeAct с камнем stm32g474

  3. жмень проводов

Что хотим получить: вывод осмысленных сообщений себе в консоль на устройство, где пишется код

Начнем по порядку: сначала подключим STlink к отладочной плате. Есть две необходимые схемы подключения.

Первой схемой будет схема ''эхо'' — она используется для проверки работоспособности самого STlink и верности конфига терминала.

схема "эхо"
схема "эхо"

Второй схемой будет "боевая" схема - схема которой мы уже будем отлаживать плату.

"боевая" схема
"боевая" схема

windows

Cтавим драйвера на свою печку. Получить драйвера можно с офф сайта ST, но только с таблэткой в виде VPN и правильного региона ST аккаунта.

https://www.st.com/en/development-tools/stsw-link009.html

После чего, как ни странно устанавливаем драйвера. Не вижу смысла подробно описывать, куда жать, но скриншотики пусть будут.

next
next
finish
finish

Отлично, с драйверами мы разделались, теперь установим то, чем будем слушать тот бред, что будет нам выдавать контроллер. Как самый распространенный, пожалуй, вариант, будем юзать PuTTY. Соответственно скачиваем, устанавливаем:

https://www.putty.org/ кнопка download putty
https://www.putty.org/ кнопка download putty
https://www.chiark.greenend.org.uk/~sgtatham/putty/latest.html у меня разрядность системы 64 бит, поэтому выбираю 64-bit x86
https://www.chiark.greenend.org.uk/~sgtatham/putty/latest.html у меня разрядность системы 64 бит, поэтому выбираю 64-bit x86
next
next
install, дополнительно, лично я, не жал
install, дополнительно, лично я, не жал

Установили, отлично. Теперь можно слушать COM Port нашего STLink. Что для этого нужно? Для начала удостоверимся в работоспособности самого STLink. Подключим все по схеме "эхо" и запустим PUTTY

если в device manager-е нет COM девайсов - первым делом ребут компьютера
если в device manager-е нет COM девайсов - первым делом ребут компьютера

После откроется терминал, в котором будет печататься то, что вы набираете на клавиатуре, это «эхо», ваш STlink живой, ура. Если символы не печатаются — проверьте качество контакта между RX и TX пинами отладчика.

linux

Я сижу на Arch linux, поэтому установку показываю именно для этого дистрибутива.
Устанавливаем драйвера и утилиты:

pacman -S stsw-link007
pacman -S screen

Выводить данные будем через утилиту screen. Почему? Потому-что.
Подключаем все по схеме "эхо".
Чтобы узнать какой порт занимает наш STlink используем утилиту ls:

ls /dev/tty*

serial device в linux имеют названия вида ttyACMх, нам выпало ttyACM0.

теперь воспользуемся утилитой screen, установленной ранее:

sudo screen /dev/ttyACM0 9600 # 9600 - это скорость в бодах, выставляется
# в соответсвии с выбранной вами скоростью в настройках uart, для проверки работы
# ставим любое значение. 

После ввода команды в терминале можно будет печатать символы в терминале. Это наше "эхо". Если символы не печатаются, то проверьте качество контакта между пинами RX и TX на вашем STlink

иногда может подвисать, как я понял - это норма
иногда может подвисать, как я понял - это норма

Пример конфига для stm32

PS

PS. конфиг не эталонный, так делать возможно даже нельзя, но у нас задача какая? Правильно чтобы работало, поэтому делаем так что-бы работало! Поэтому приступим.

открываем CubeMX и начинаем конфигурировать:

тут спрятаны скрины конфига, чтобы не засорять

Пин LED - это не обязательная штука, автору просто нравится мигающие диодики).
Теперь наш камень сконфигурирован, ура! Осталось написать код, чтобы g474 начал отдавать байтики:

int main(void)

{
	uint8_t message[] = "message from MCU\r\n"; // сообщение которое мы хотим вывести
	uint8_t messageSize = sizeof(message) - 1; //размер сообщения которое мы хотим вывести
	
	//этот блок кода нам генерирует CubeMX, так что не обращаем на него внимание
	HAL_Init();
	SystemClock_Config();
	MX_GPIO_Init();
	MX_USART2_UART_Init();
    // тут уже пишем наши магические буковы
		while (1)
		{
		HAL_UART_Transmit(&huart2, message, messageSize, 1000); //отправка сообщений в 
		HAL_Delay(2000);
		HAL_GPIO_TogglePin(LED_GPIO_Port, LED_Pin);
		}
}
это терминал который пердоставляет cubeide, там тоже можно, если надо пояснить, то вопросы в комменты
это терминал который пердоставляет cubeide, там тоже можно, если надо пояснить, то вопросы в комменты

собираем, заливаем, проверяем иии...

Неожиданно, но и такое тоже может быть, что произошло? Я подключал свою g474 c помощью китайского ЛБП в хруще, а тут, так получилось, нет нормальной земли и бывают соседи, что любят заземляться на батареи, отсюда и шумная земля. Что делать? Я решил эту проблему через запитку отладочной платы от ноута... Всё, проблема решена))
Подключаем правильно, перезапускаем утилиту ииииии... вжух:

congratulations
congratulations

Наш контролер умеет писать сообщение вам в терминал, вот теперь ура!
На этом всё. Пока.

Под редакцией @midlifecriz

Комментарии (4)


  1. Fox_Alex
    23.07.2025 14:02

    Странное дело - у тебя есть полноценный отладчик, но привычка отлаживать через printf еще не отпала)

    Есть способ проще - использовать асинхронный трассировочный вывод (пин SWO отладчика). Переопределяешь _write туда и printf из стандартной библиотеки будет спамить в консоль.

    https://www.youtube.com/watch?v=ST_fUu6ACzE


    1. HardWrMan
      23.07.2025 14:02

      А ещё, этот самый printf тянет за собой столько гадости, что в некоторые МК может и не влезть. Уж лучше взять LA и дрыгать ногами в режиме реального времени на время отладки.


      1. Fox_Alex
        23.07.2025 14:02

        Кстати да, принтф тяжелый и можно его не везде из-за использования динамической памяти. Но всегда можно свой putstring цельно-статический какой-нить родить и им пользоваться. Я последнее время обленился и лог вывожу просто в память, а потом отладчиком смотрю что там происходило. Ну и брякпоинты по коду и по изменению памяти - наше все.


        1. d_nine
          23.07.2025 14:02

          Ещё, если printf используется для вывода значений с плавающей запятой, не забываем выравнивать стек (вероятно и кучу) в памяти, иначе вместо адекватных значений будем получать непонятную кашу. При этом вывод обычного текста и целочисленных данных может работать корректно.