1. Шина 1-Wire для STM32 на языке ДРАКОН

Китайская плата на STM32F401CCU6 (RAM 64KB, FLASH 256KB)
Китайская плата на STM32F401CCU6 (RAM 64KB, FLASH 256KB)
Китайская плата на STM32F401CCU6 (RAM 64KB, FLASH 256KB)

Речь пойдет о сверхвысокоуровневом языке программирования ДРАКОН и его применении в освоении микроконтроллеров STM32.

Думаю статья будет интересна радиолюбителям, которые уже освоили Arduino и хотят продвинуться дальше.

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

Все что тут написано является только лишь моим мнением. Я ни к чему не призываю, ничему не учу, а только делюсь своим опытом.

Инструментарий.

Программы:
ИС ДРАКОН (выпуск от 5.04.2020),
STM32CubeMX (v6.0.0),
STM32CubeIDE (v1.4.0),
Notepad++ (v7.9.1).

Железо:
китайская плата на STM32F401CCU6 (RAM 64KB, FLASH 256KB),
китайский программатор ST-Link V2 со шлейфом 4-pin,
резистор 4.7к, провода и разъёмы.

Измерительные приборы: осциллограф FNIRSI-5012H.

Предыстория.

Освоив на твердую четверку программирование Arduino (классная вещь!), знающие люди сподвигли меня пойти дальше – освоить микроконтроллеры STM32. Но оказалось чертовски не просто их изучать. К тому же английский знаю только с google переводчиком.

Однако в процессе написания программ и отладки проектов на Arduino, в голову пришла замечательная мысль – перевести всю работу в сверхвысокоуровневый язык программирования ДРАКОН.
Решил попробовать соединить ДРАКОН и Ардуино. Результат меня поразил своей простотой и удобством.
И когда я начал изучать микроконтроллеры STM32 опыт пригодился.
Посмотрим что будет если применить ДРАКОН и пакет программ для работы с STM32 CubeMX и CubeIDE.
Вот этим опытом и поделюсь.
Я подразумеваю что Вы уже программировали Ардуино и знаете язык Си в том объёме, который нужен для работы с Arduino. С чего же начать изучение STM32?

Это уже начался ДРАКОН (привожу примеры от простого к сложному). А именно блок-схема написана на русском дружелюбном алгоритмическом языке который обеспечивает наглядность (сокращенно ДРАКОН)[1]. Читать блок-схемы ДРАКОНа надо сверху-вниз и слева-направо. Это самая простая схема и называется «Примитив», в ней всего одна вертикальная линия (путь выполнения алгоритма).  Ведём пальцем от самого верха и приходим к иконке «Конец».
Это уже начался ДРАКОН (привожу примеры от простого к сложному). А именно блок-схема написана на русском дружелюбном алгоритмическом языке который обеспечивает наглядность (сокращенно ДРАКОН)[1]. Читать блок-схемы ДРАКОНа надо сверху-вниз и слева-направо. Это самая простая схема и называется «Примитив», в ней всего одна вертикальная линия (путь выполнения алгоритма). Ведём пальцем от самого верха и приходим к иконке «Конец».
Это уже начался ДРАКОН (привожу примеры от простого к сложному). А именно блок-схема написана на русском дружелюбном алгоритмическом языке который обеспечивает наглядность (сокращенно ДРАКОН)[1]. Читать блок-схемы ДРАКОНа надо сверху-вниз и слева-направо. Это самая простая схема и называется «Примитив», в ней всего одна вертикальная линия (путь выполнения алгоритма). Ведём пальцем от самого верха и приходим к иконке «Конец».

Если Вы уже знаете как работают битовые операции в языке Си, то напомню каково их частое применение в программировании микроконтроллеров.
Зачем это надо знать?
Пока учишься то смотришь на чужой код, а там этих операций тьма. К тому же битовые операции нужны для работы с памятью и регистрами микроконтроллера. Лично мне неимоверно скучно вникать в регистры микропроцессора и как там все происходит. Упрощая для себя картину решил придерживаться такой мысли: «Поменял бит в каком-то регистре – в ответ процессор что-то сделал». Как он это делает не хочу вникать, мне важен результат. Для меня понятие «порт микроконтроллера» (например PORTB) это всего лишь переменная-посредник между мной и микроконтроллером. Своего рода посыльный, я ему передаю посылку, он ее относит адресату и приносит мне другую.

Эта блок-схема языка ДРАКОН называется «Силуэт». Навигация такая же простая – начинаем вести пальцем с самого верха, доходим до ссылки «2» внизу, потом по левой линии со стрелочкой возвращаемся вверх и далее на вторую ветку. В конечном итоге приходим к иконке «Конец». Чтобы детально рассмотреть можно правой клавишей мыши "Открыть картинку в новой вкладке".
Эта блок-схема языка ДРАКОН называется «Силуэт». Навигация такая же простая – начинаем вести пальцем с самого верха, доходим до ссылки «2» внизу, потом по левой линии со стрелочкой возвращаемся вверх и далее на вторую ветку. В конечном итоге приходим к иконке «Конец». Чтобы детально рассмотреть можно правой клавишей мыши "Открыть картинку в новой вкладке".
Эта блок-схема языка ДРАКОН называется «Силуэт». Навигация такая же простая – начинаем вести пальцем с самого верха, доходим до ссылки «2» внизу, потом по левой линии со стрелочкой возвращаемся вверх и далее на вторую ветку. В конечном итоге приходим к иконке «Конец». Чтобы детально рассмотреть можно правой клавишей мыши "Открыть картинку в новой вкладке".

Сейчас я постараюсь сформулировать зачем все это надо.

Пример из жизни.
Я говорю и думаю на русском языке и когда слышу украинскую речь, то сначала в голове перевожу на русский и потом понимаю, о чем говорят. Далее формулирую в голове ответ на русском, затем перевожу на украинский и только тогда говорю.
Двойное преобразование.

А как язык ДРАКОН помогает убрать это двойное преобразование?

Возьмем конкретную статью незнакомого мне автора с примером кода [2]. В этой статье описана программная реализация шины 1-Wire для STM32. После ознакомительного прочтения я открываю программу «ИС ДРАКОН» и рисую логику работы алгоритма с помощью блок-схем языка ДРАКОН.
Это аналогично переводу с какого либо языка на русский.

Когда я заканчиваю эту работу то в голове уже полное понимание работы алгоритма. А на бумаге (экране) прорисован алгоритм в визуальном графическом виде. Причем для его понимания надо всего лишь вести взглядом (можно для наглядности пальцем) сверху-вниз и слева-направо.

Осталось только внести в иконки код на языке Си, транслировать это в программу и проверить работоспособность. Если надо отладить сам код (в основном синтаксис).
Мне еще не встречался чужой код, который нельзя было бы перевести в блок-схему ДРАКОН.

А далее сделав один раз перевод алгоритма в блок-схему ДРАКОН в дальнейшем можно менять, дополнять, находить ошибки или оптимизировать алгоритм, не погружаясь в сам код на языке Си.

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

Реализация 1-Wire шины для STM32 на языке ДРАКОН.

Видео дополняет статью.

Для начала электрически порты ввода/вывода интерфейса USART1 надо соединить вместе и сделать «подтяжку» к плюсу (+3.3V) питания.
Для начала электрически порты ввода/вывода интерфейса USART1 надо соединить вместе и сделать «подтяжку» к плюсу (+3.3V) питания.
Для начала электрически порты ввода/вывода интерфейса USART1 надо соединить вместе и сделать «подтяжку» к плюсу (+3.3V) питания.
При настройке в программе STM32CubeMX интерфейса USART1 выбрать для выводов PA9 и PA10 режим «Open Drain».
При настройке в программе STM32CubeMX интерфейса USART1 выбрать для выводов PA9 и PA10 режим «Open Drain».
При настройке в программе STM32CubeMX интерфейса USART1 выбрать для выводов PA9 и PA10 режим «Open Drain».

Теперь напишем функции, которые реализуют шину 1-Wire используя библиотеку HAL (нравится мне эта библиотека).

Функций всего четыре:

Сигнал сброса шины 1-Wire
Сигнал сброса шины 1-Wire
Сигнал сброса шины 1-Wire
Передача/получение бита по 1-Wire (тайм-слот), вспомогательная функция
Передача/получение бита по 1-Wire (тайм-слот), вспомогательная функция
Передача/получение бита по 1-Wire (тайм-слот), вспомогательная функция
Передача БАЙТА по 1-Wire
Передача БАЙТА по 1-Wire
Передача БАЙТА по 1-Wire
Получение БАЙТА по 1-Wire
Получение БАЙТА по 1-Wire
Получение БАЙТА по 1-Wire

Вот эквивалентный код на Си этих четырех функций.

По ссылке [3] можно скачать файл с полным кодом.
По ссылке [3] можно скачать файл с полным кодом.
По ссылке [3] можно скачать файл с полным кодом.

После того как программа «ИС ДРАКОН» транслировала блок-схему в код на языке Си, я открываю файл Notepad-ом, копирую код функций и вставляю в конец файла main.c.

Еще необходимо сделать объявление функций в начале main.c. И желательно написать какой-нибудь алгоритм в теле уже созданной CubeIDE функции Error_Handler(), которая отвечает за индикацию ошибок в программе. Пусть при ошибке зажигается и постоянно горит светодиод на плате.

Для этих целей служат две блок-схемы.

1. Шина 1-Wire для STM32 на языке ДРАКОН

А вот код, который в них скрыт.

По ссылке [3] можно скачать файл с полным кодом.
По ссылке [3] можно скачать файл с полным кодом.
По ссылке [3] можно скачать файл с полным кодом.

Теперь проверим физически с помощью осциллографа, те ли сигналы которые надо генерируют наши функции и сверимся со статьей [2].

В бесконечный цикл main.c вставим вызов функции сброса.

while (1)
{
reset_1wire();
}

На осциллограмме видно, что продолжительность сигнала сброса такая как нужно.
На осциллограмме видно, что продолжительность сигнала сброса такая как нужно.
На осциллограмме видно, что продолжительность сигнала сброса такая как нужно.

На осциллограмме видно, что продолжительность сигнала сброса такая как нужно.
На осциллограмме видно, что продолжительность сигнала сброса такая как нужно.
На осциллограмме видно, что продолжительность сигнала сброса такая как нужно.

Теперь проверим формирование слота записи.

В бесконечный цикл вставим вызов функции «Передача/получение бита по 1-Wire (тайм-слот)» со значением 0x00.

while (1)
{
send_bit_1w(0x00);
}

На осциллограмме видно, что продолжительность тайм-слота «0» такая как нужно.
На осциллограмме видно, что продолжительность тайм-слота «0» такая как нужно.
На осциллограмме видно, что продолжительность тайм-слота «0» такая как нужно.

Теперь в бесконечный цикл вставим вызов функции «Передача/получение бита по 1-Wire (тайм-слот)» со значением 0xFF.

while (1)
{
send_bit_1w(0xFF);
}

На осциллограмме видно, что продолжительность тайм-слота «1» такая как нужно.
На осциллограмме видно, что продолжительность тайм-слота «1» такая как нужно.
На осциллограмме видно, что продолжительность тайм-слота «1» такая как нужно.

Пусть Вас не смущает показания в правом нижнем углу осциллографа – он не шибко точен.

Порядок.

Теперь можно смело применять созданные функции для полноценной работы с 1-Wire портом.

Выводы.

В чем же плюс работы с блок-схемой ДРАКОН?

Сокращается время необходимое на то, чтобы понять алгоритм (т. к. все связи прорисованы визуально) и нагрузка на мозг значительно ниже. Для понимания алгоритма не нужно погружаться в язык программирования.

В чем же плюс ДРАКОНа при освоении нового материала?

При составлении блок-схемы мы не можем соединить все как попало, программа «ИС ДРАКОН» строит связи основываясь на правилах языка ДРАКОН, поэтому идя шаг за шагом по алгоритму мы невольно выясняем все алгоритмические связи внутри программы и строим их в визуальном виде. Это значительно проще воспринимается и запоминается человеческим мозгом.

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

Лично мне ДРАКОН помогает быстрее написать работоспособный алгоритм. И часто бывает отладка нужна только чтобы убрать синтаксические ошибки в коде. Еще помогает быстрее понимать свои и чужие алгоритмы. Попробовав однажды, я уже не готов отказаться от этого удобного и понятного инструмента.

Ссылки.
[1]
drakon.su
[2]
www.rotr.info/electronics/interface/one_wire/ow_over_uart.htm
[3]
Файл с полным кодом. Можно открывать Notepad++ или блокнотом.