Разбираемся с STM32CubeMonitor

Добрый день.
Сегодня разберём довольно интересную программу в экосистеме STM32 - STM32CubeMonitor.
С её помощью можно смотреть значения переменных, не останавливая выполнение программы.
А так же - очень удобно строить графики и всяческие шкалы, основанные на значении этих переменных.
Скачать его как обычно можно на офф сайте.

Скачиваем, устанавливаем.

Давайте поставим задачу на сегодняшнее занятие следующим образом:
Необходимо построить график значения переменной j, которубю мы использовали для
цикла в предыдущем занятии.

Запускаем VSCode, и находим там эту переменную.

Теперь запускаем STM32CubeMonitor.

Сразу открылся предварительно настроенный, так называемый простой поток.
Давайте разбираться что здесь к чему.
Вот это - действия пользователя: Старт, стоп, и очистка графика.
Не будем их пока что трогать.
myProbe_In - это то, при помощи чего мы будем подключаться к устройству.
В нашем случае это ST-Link. Настроим его сразу.

Идём дальше. myVariables - пои переменные. Содержит список переменных, которые мы хотив получить.
Заходим, и настраиваем. В первую очередь - указываем путь к исполняемому файлу, который был скомпилирован
средой разработки. В случае VSCode - он находится тут.....
Build\Debug\LedBlinking.elf. надимаем правой кнопкой, и копируем путь.
Вставляем его в Folder. В окошке Фал - выбираем наш файл.

И как мы видим - нашей переменной тут нет.
А всё потому, что таким образом можно смотреть только значения глобальных переменных.
Это связано с тем, что локальные переменные создаются только на время жизни определённого участка кода,
и теоретически каждый раз у них может быть новый адрес. Что не позволяет нам их отслеживать на протяжении
выполнения всей программы.

Для того, что бы мы смогли всё таки увидеть нашу переменную, давайте объявим её глобально.
Для этого нам необходимо вынести её за рамки функции main(). Например вот сюда.

"зальём" измененную программу в микроконтроллер, и убедимся что мы этим ничего не сломали.

Отлично, всё работает как и раньше.

Теперь вернёмся в STM32CubeMonitor, и заново перевыберем файл с прошивкой.
Видим что наша переменная появилась!
Дадим конфигурации узла имя, и сохраним.
Остался последний узел - myProbe_Out. Открываем его, и выбираем там наш ST-Link.

Собственно на этом то и всё, мы можем сделать деплой этого потока.
После деплоя, открываем дашборд, и запускаем сбор данных.
Отлично! мы видим как меняется во времени значение нашей переменной, от нуля, до трёх.

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

Для этого останавливаем сбор данных, закрываем дашборд.
И открываем настройки myCart.
В графе Durations предлагаю поставить 120 секунд.
После чего сохраняем настройки, заново делаем деплой, открываем дашборд, и запускаем сбор данных.
Вот теперь на много удобнее. мы можем сразу видеть несколько итераций этого цикла.

Таким образом, внеся незначительные изменения в программу, мы теперь можем следить за значениями переменных
использующихся в ней.

раз уж мы так быстро закончили, то вот нам усложненная задача.
Необходимо на график вывести состояния всех четырёх светодиодов.
Что бы было видно когда они вклоючены, а когда выключены.

Для этого - в первую очередь необходомо найти что именно меняется, когда мы вызываем
функцию HAL_GPIO_WRITE_PIN().
Установим точку останова перед самой первой строкой нашей программы.
Запустим отладку.
Вот мы и тут.
в подменю Run and Debug, откроем список переферии.
Находим наш GPIOA - а именно сюда мы подключали наши светодиоды. и это можно проверить открыв например CubeMX.
Раскрываем его.
и делаем 1 шаг без захода в программе. Для этого можно нажать F10.
Сразу бросается в глаза как много всего изменилось.
наведём мышкой на изменившиеся регистры, и посмотрим их описание.

вот он, Output Data Register.
развернём его, и пошараем по программе, глядя на то, как будут меняться в нем значения.

из увиденного можно сделать вывод - нас интересуют биты этого регистра с нулевого по третий включительно.
Так же можно было заменить что одновременно с ODR меняется и регистра IDR.
Что неудевительно, ведь если посмотреть его описание - это Input Data Register.
И всё, что мы отправляем в порт, может быть сразу же считано из него.

В окне переферии мы можем увидеть, какой этот регистр имеет адрес.

имея эти знания, возвращаемся в STM32CubeMonitor, и добавляем произвольную переменную.
Мы точно уверены, что адреса портов неизменны, по этому добавляем адрес интересующего нас порта.
Далее немного обработки, и вуаля, мы видим на графике как наши светодиоды моргают.

mstsc MieKMpkaSZ

Магическая формула: ((myRegister>>0)&1)+5

На этом наше занятие можно считать завершенным.