Дрыгаем ножками stm32 с помощью команд через usb-uart переходник
Кароч потерялся я из за работы. Но вот опять появилось времечко, и я тут же залез в микроконтроллеры stm32.
Изучение ковки начинается обычно с гвоздя, изучение столярного дела частенько начинается со стула или коробки, изучение языка программирования начинается с HELLO WORLD . В мире микроконтроллеров обычно все начинается с мигания светодиодом. Я наверно поступлю так же но чуть чуть по другому .
ТЗ мое примерно такое:
Я хочу с компьютера посылать команды, например 1-1, а светодиод на макетной плате соединенный с ножкой 1 должен зажигался. А если отправить 1-0, то светодиод должен выключаться.
Где это можно Применить:
Например можно подавать команды с компа на включение и выключение какого-нибудь реле.
В посте я распишу то чего мне не хватало , на что я потратил очень много времени чтобы разобраться, и какие бы ссылки бы я хотел получить если бы где то на форуме задал вопрос как сделать uart на stm32.
Я скорее всего не буду расписывать что за что отвечает, потому-что не доконца компетентен в вопросах. И какие-то нюансы по коду тоже не напишу потому-что в редакторе пикабу нет возможности нормально редактировать его. . Проект пока-что будет написан на библиотеке HAL, он позволяет писать код как в ардуино. Сижу я из под linux , поэтому некоторые ньюансы могут отличаться от Windows.
Я еще экспериментирую с форматом. Но если что предлагайте)) . Постараюсь улучшить.
Предыдущий пост :https://pikabu.ru/story/stm32_ili_kak_ya_pokoryal_7982983
Юзать я буду микросхему STM32F103C8T6:
Ссылка на даташит https://www.st.com/en/microcontrollers-microprocessors/stm32...
Для соединения с компом буду юзать переходник usb-uart на чипе PL-2303.
Также нам нужен ST-link/v2 через который мы будем прошивать микроконтроллер
Соединить stm32 c ST-link/v2 нужно по этой схеме .
Перед тем как начать собирать схему и писать код нужно почитать инфу по регистрам.
STM32 имеет довольно богатую периферию и довольно сильно отличается от Arduino. Но концептуально логика управления микроконтроллером везде одинаковая. Ты просто обращаешься к регистрам и манипулируешь ими (включаешь выключаешь слушаешь.
Так как я такой себе embedder, я боюсь что не смогу грамотно разъяснить за регистры да и растянется это на очень много. Я сошлюсь на пару статей которыми я руководствовался:
1) Очень хорошо объясняет как управлять пинами с помощью библиотеки HAL .
http://mypractic.ru/urok-8-upravlenie-portami-vvoda-vyvoda-cherez-funkcii-biblioteki-hal.html
2) Вот неплохое объяснение что такое библиотека HAL :
3) По этой ссылке можно почитать про сами регистры на stm32 .На мой взгляд это лучшее объяснение по регистрам которое нашел.
4) Здесь же объяснение как можно подергать ножкой через CMSIS
http://mypractic.ru/urok-7-upravlenie-portami-vvoda-vyvoda-cherez-registry-cmsis.html
В целом ознакомившись с этими ссылками можно уже иметь кое какое представление о регистрах.
5) Так как буду работать с uart . Я сошлюсь на статью про сам uart и как с ним работать через библиотеку HAL.
https://istarik.ru/blog/stm32/120.htmlПроект можно посмотреть по ссылке на гитхабе :
https://github.com/IzyI/stm32_simple_examples/tree/master/simple_uart
Теперь же приступим к самой сборке Проекта.
Схема примерно такая
У меня на макетной плате это выглядит ка кто так :
Теперь создадим в CUBEMX и настроим его тактирование
(про настройку тактирования можно почитать вот здесь http://mypractic.ru/urok-5-sistema-taktirovaniya-stm32.html):
Подключаем керамический резонатор.
Настраиваем тактирование:
Незабываем подключать debag Serial Wire иначе второй раз у нас микроконтроллер не прошьется.
Включаем UART и включаем прерывания
ПО прерываниям лучше всего почитать вот эти ссылки:
2) http://mypractic.ru/urok-18-sistema-preryvanij-stm32-organizaciya-i-upravlenie-preryvaniyami.html
Настраиваем пины:
И генерируем проект.
Осталось только скопипасть код с main.c в ваш проект.
Также надо не забыть зарегестировать функцию HAL_UART_IDLE_Callback. добавив в stm32f1xx_hal_uart.h про это я расписал в этой ссылке. В этой функции мы регистрируем обработку флага IDLE .
Этот флаг устанавливается аппаратно при обнаружении незанятой линии. То есть, если в приёмник поступает несколько байт подряд, а потом возникает пауза (линия находиться в состоянии HIGH некоторое время), то взводится флаг IDLE генерирующий прерывание, а мы по этому прерыванию определяем что данные перестали поступать.
Дальше компилируем и собираем, заливаем и радуемся. Ну или не радуемся))
make
st-flash write ./simple_uart.bin 0x08000000
Также для отправки сообщений я написал простенький скрипт на python используя библеотеку pyserial, С помощью него можно отправить команду в микроконтроллер:
python3 send.py 1-1
З.Ы. В следущем моем практикуме )). Я соберу свою отладочную плату на подобие bluePill с распаянным usb-uart. Код я напишу на CMSIS, выполнять он будет тоже самое , постараюсь максимально все покрыть комментариями и все залью на githab. И наверно я все же сделаю большую часть в виде видео.
З.Ы. з.ы. Я не последняя инстанция. Но если что пишите.)