Дрыгаем ножками 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...

Дрыгаем ножками stm32 с помощью команд через usb-uart переходник Stm32, Stm32f103, Длиннопост, Микроконтроллеры

Для соединения с компом буду юзать переходник usb-uart на чипе PL-2303.

Дрыгаем ножками stm32 с помощью команд через usb-uart переходник Stm32, Stm32f103, Длиннопост, Микроконтроллеры

Также нам нужен ST-link/v2 через который мы будем прошивать микроконтроллер

Соединить stm32 c ST-link/v2 нужно по этой схеме .

Дрыгаем ножками stm32 с помощью команд через usb-uart переходник Stm32, Stm32f103, Длиннопост, Микроконтроллеры

Перед тем как начать собирать  схему и писать код нужно почитать инфу по регистрам.

STM32 имеет довольно богатую периферию и довольно сильно отличается от Arduino. Но концептуально логика управления микроконтроллером везде одинаковая. Ты просто обращаешься к регистрам и манипулируешь ими (включаешь выключаешь слушаешь.


Так как я такой себе embedder, я боюсь что не смогу грамотно разъяснить за регистры да и растянется это на очень много. Я сошлюсь на пару статей которыми я руководствовался:

1) Очень хорошо объясняет как управлять пинами с помощью библиотеки HAL .

http://mypractic.ru/urok-8-upravlenie-portami-vvoda-vyvoda-cherez-funkcii-biblioteki-hal.html

2) Вот неплохое объяснение что такое библиотека HAL :

https://istarik.ru/blog/stm32/119.html

3) По этой ссылке можно почитать про сами регистры на stm32 .На мой взгляд это лучшее объяснение по регистрам которое нашел.

http://mypractic.ru/urok-6-porty-vvoda-vyvoda-stm32.html

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

Теперь же приступим к самой сборке Проекта.


Схема примерно такая

Дрыгаем ножками stm32 с помощью команд через usb-uart переходник Stm32, Stm32f103, Длиннопост, Микроконтроллеры

У меня на макетной плате это выглядит ка кто так :

Дрыгаем ножками stm32 с помощью команд через usb-uart переходник Stm32, Stm32f103, Длиннопост, Микроконтроллеры

Теперь создадим в  CUBEMX  и настроим его тактирование

(про настройку тактирования можно почитать вот здесь http://mypractic.ru/urok-5-sistema-taktirovaniya-stm32.html):

Подключаем керамический резонатор.

Дрыгаем ножками stm32 с помощью команд через usb-uart переходник Stm32, Stm32f103, Длиннопост, Микроконтроллеры

Настраиваем  тактирование:

Дрыгаем ножками stm32 с помощью команд через usb-uart переходник Stm32, Stm32f103, Длиннопост, Микроконтроллеры

Незабываем подключать debag Serial Wire иначе второй раз  у нас микроконтроллер не  прошьется.

Дрыгаем ножками stm32 с помощью команд через usb-uart переходник Stm32, Stm32f103, Длиннопост, Микроконтроллеры

Включаем UART  и включаем  прерывания

ПО прерываниям лучше всего почитать вот эти ссылки:

1) http://mypractic.ru/urok-15-parallelnye-processy-vypolnenie-zadach-v-fonovom-rezhime-pri-pomoshhi-preryvaniya-ot-tajmera.html

2) http://mypractic.ru/urok-18-sistema-preryvanij-stm32-organizaciya-i-upravlenie-preryvaniyami.html

Дрыгаем ножками stm32 с помощью команд через usb-uart переходник Stm32, Stm32f103, Длиннопост, Микроконтроллеры

Настраиваем пины:

Дрыгаем ножками stm32 с помощью команд через usb-uart переходник Stm32, Stm32f103, Длиннопост, Микроконтроллеры

И генерируем проект.

Осталось  только  скопипасть код с 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.  И наверно я все  же сделаю большую  часть в виде видео.


З.Ы. з.ы. Я не последняя инстанция. Но если что пишите.)