Я в свои 30 лет меньше видел чем там малая ...
Просто хочу чтобы про них больше узнали (Яхта,Семья,Путешествия)
Просто хочу чтобы про них больше узнали (Яхта,Семья,Путешествия)
А вот и я )). Продолжаю Изучать stm32 .
В Общем как всегда работа отвлекает и времени катастрофически не хватает. Но тем не менее вот какие мысли у меня накопились.
Меня тут третировало пара человек дескать я использую HAL для того чтобы дрыгать ножками , а ведь можно все это сделать и без этого. Если честно не понятно мне это маленько , ну типо HAL и нужен для того чтобы быстро сделать что то не сильно вдаваясь в нюансы. наоборот что то сложное надо писать на cmsis чтобы быть ближе к железу. Это как рисование картин . Если тебе надо бил-борд ты используешь трафареты, если тебе нужна картина аля мишки в лесу воруют шишки то будь добр использую краски кисточку талант и усердие (ИМХО)
Кароче CMSIS я в любом случае хотел изучить типо написать проект с 0 с минимум зависимостей. Но столкнулся с тем что непонимаю откуда берутся некоторые файлы.
Стандартный набор для разработки состоит из файлов cmsis (несколько штук), main.c, startup.c, flash.ld
И вот как раз с последними файлами была прям трабла, я ни в какую не могу понять откуда и зачем эти файлы startup.c, flash.ld Просто я привык что исходники всегда где то лежат их просто надо скачать с гитхаба и прицепить к друг другу . Здесь же был какой то хаус. То-есть файлы обязательны но все начинали разбирать программирование с аля открываем ide создаем проект и все поехали код писать.
После опроса некоторых разработчиков и чтение пары книжек я узнал что эти файлы не пишут их генерируют среды для разработки. И в этом то и кроется этот хайсу и разнобой.
И все кого я спрашивал (а этих людей было очень много), говорили что они конфигурят эти файлы только если надо (что бывает очень редко) .
Если коротко то startup_**.s файл это набор привязок железа и их инструкций к тем или иным функциям в си, также выделяет место под стек, ну еще пару настроек о которых я скорее всего не знаю .
Файл FLASH.ld это линкер он собирает все в одну кучу и решает зависимости и конфликты. Как я понял FLASH.ld для всех stm32 практически одинаковый отличается только размер памяти, и опять же как я понял у некоторых камней есть плюшечки которые описываются в этом ld скрипте (например несколько ram не как обычно одна). Коротко об этом файле можно почитать здесь: http://themagicsmoke.ru/books/c_for_embedded_systems/text/linker.html
Так как файлы эти генерируются системами разработки. А я сижу на Debian и среды разработки keil (говорят что там более аккуратные файлы генерируются) мне было суждено использовать STM32cubeMX (я пытался сделать это с помощью среды segger но не осилил, было бы интересно узнать как это сделать, я бы с удовольствием посмотрел бы).
Я создал проект пустой без настроек . включил галочку чтобы мне вместе со всеми файлами сгенерировал make файл.
А потом просто вытащил нужные cmsis файлы ld-скрпит и стартап файл .
Stm32cubeMX генерирует system_stm32f1xx.c которая генерирует функцию SystemInit().
Функция которая вызывается при старте и описывается в файле startup_stm32f103xb.s в ней как правило описываются настройки микроконтроллера (тактовая частота и др), но в целом это не обязательно.
Также в это файле описывается переменная SystemCoreClock которая содержит в себе тактовую частоту. Еще в этом же файле лежит функция SystemCoreClockUpdate() которую надо вызывать всегда когда вы изменяете частоту работу камня. Этой функцией вы обновляете переменную SystemCoreClock.
В целом это было основное непонимание по файлам которое я разрешил для себя и решил этим поделится с вами.
Пока я изучал cmsis я написал небольшой набор функций пока тестировал разные штуки на STM32F103C8Tx.Основное что хотел запустить это UART но в примере есть еще MCU и обработка кнопки.
Я руководствовался вот этими сайтами. пока писал код.
http://dimoon.ru/category/obuchalka/stm32f1
Если вас интересует uart с помощью HAL то вам сюда: https://istarik.ru/blog/stm32/120.html
В прошлый раз я очень хотел попробовать распаять stm32f030 в виде своей платы для разработки и уперся в то что у меня не получается сделать ее нормальной на одном слое. Поэтому наверное я отложу это на когда-нибудь потом.
Но один прекрасный товарищ на ютубе уже рассказал как это можно сделать и сделал даже комментарии что почему и как:
В следующей статье я постараюсь выложить проект розетки с реле таймером. Где будет возможность по дням недели настроить включение и выключение той или иной нагрузки. У меня уже есть одна реализации на HAL https://github.com/IzyI/timer_menu_lcd1602 Но реализация меня не совсем устраивает. Плюс у меня не хватает знаний по языку C. Я не знаю как реализовать те или иные структуры. Но постараюсь как то решить свое незнание.
Как то так.
Кароч потерялся я из за работы. Но вот опять появилось времечко, и я тут же залез в микроконтроллеры 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. И наверно я все же сделаю большую часть в виде видео.
З.Ы. з.ы. Я не последняя инстанция. Но если что пишите.)
Короче была у меня когда то мысль написать уроки по python, еще в начале моей карьеры. Ибо натыкался на некоторые проблемы, решения к которым не мог долго найти, а потом находил но руки написать это дело не доходили.
И чем дальше я продвигался в изучении этого языка, тем сильнее у меня пропадал интерес к этой идее.
Я и предположил, что связано это с тем, что чем больше ты узнаешь о какой то штуке, тем меньше тебе хочется возвращаться к решенным когда то давно задачам. Старые задачи если ты их помнишь становятся для тебя тривиальным, скучными и рутинными ( хотя естественно в свое время они для меня были очень непонятны).
Другое дело когда ты решил изучить для себя совершенно неизвестную для себя штуку. Где каждое новое знание для тебя целое открытие, с которым лично я сразу же хочу делится. Правда обычно делится получается с теми кто под руку попался, и как правильно им это вообще не интересно (мама прости но это так)).
На днях я решил плотно заняться STM32. Я вообще, давно хотел разобраться в таинствах микросхем , и пособирать всякие штуки на их основе. Даже года 2 назад закупил целый набор ардуино со всяким барахлом датчиками и т д и т п.
Но семья, работа, дом, теща, собака, кошка, корова, друзья, пиво, плохая погода, песни моргенштерна все это мешало мне заниматься этим делом.
Теперь наконец то я вырвался из этого порочного круга.
И чтобы мне было веселее я решил заливать то, как я изучаю все эти штуковины.
Это прелюдия а щас по факту:
1) Я сижу из под Debian , поэтому меня будет интересовать подходы разработки в этой среде. В целом это не сильно будет влиять на общую картину.
2) Почему stm32. все просто, хочу заниматься булингом ардуинщиков
3) В качестве среды разработки буду использовать VSCODE , мы же тут все за опенсорс не правда ли. ( НЕТ ,все равно потому буду писать скорее всего на jetbrains, продался...).
4) Прошивать буду через стандартный китайский stlink, потому незабываем его качнуть и поставить , любым удобным способом https://github.com/stlink-org/stlink
5) Копию кода (урезанного) я буду заливать на гитхаб : https://github.com/IzyI
6) Я буду мега максимально субъективен. Буду писать только те моменты которые я не понял и те нюансы которые мне показались важными. А также буду давать ссылки на сторонние ресурсы. Откуда я черпал знания. У боле умных людей.
7) Писать буду на СИ. И код я так себе пишу, даже если это Python. И уж если решили ругать мой код, то помните что главный ответ на главный вопрос 42.
8) Для сборки проектов буду использовать stm32cubemx https://www.st.com/en/development-tools/stm32cubemx.html ибо удобство
9) Большая часть кода скорее всего будет написана на библиотеке HAL. Но постараюсь по мере освоения юзать и CMSIS . Вкратце если кто не знает то в мире STM32 существует 3 библиотеки которые юзают разработчики :
- - **HAL** - набор драйверов позволяющая обращаться ко всей периферии микроконтроллера не сильно вдаваясь в суть .
**Плюсы:**
- скорость разработки
- мультиплатформенность (легко перенести код с одного stm32 на другой stm32 более жирный к примеру)
- простота работы.
**Минусы:**
- знающие говорят что местами глючная
- рано или поздно все равно надо лезть в кишки микроконтроллера
- жирноват по коду
- местами так се написана (многим не нравится).
*Отличный выбор если вам надо быстро поднять USB стек.*
*Херовый если вам надо выжать из микроконтроллера максимум. *
- - **СMSIS** - (Cortex Microcontroller Software Interface Standard) как вы не поняли это стандартное описания интерфейса для всех армов, включает в себя структуры описания регистров и стартовый набор макросов для работы.
**Плюсы:**
- работа напрямую с регистрами
- скорость кода и его размер
- чистота (прозрачность) кода
- скилы прокачиваются как у летчиков в 41-45 , ты либо выживешь во время вылета, либо тя собьют к (херам)
- можно делать просто волшебные штуки
- лапочка со всех сторон
**Минусы:**
- нет мультиплатформенности
- очень долгая разработка
* Отличный выбор если вы шарите и у вас много времени по жизни*
*Херовый если сроки горят или вы узнали что такое регистры месяц назад. *
- - **LL** - без понятия что за библиотека, да и в холиварах ее редко упоминают, а это значит нам это не интересно
А теперь коротко что нам надо для работы в Debian.
- компилятор:
sudo apt-get install gcc-arm-none-eabi
- openocd:
Эта штука отладчик, по идее понадобится потом
sudo apt-get install openocd
- stm32cubemx
Идем на офицальный STM сайт https://www.st.com/en/development-tools/stm32cubemx.html. Регаемся и качаем оттуда STM32cubemx.
Также можете скачать и установить IDE STM32cubeide, я не совсем люблю подобный софт, но думаю что в будущем это может пригодится как никак STM32cubeide все же заточен на работу с этими микроконтроллерами.
Для винды я не думаю что стоит приводить пример ибо там все накликивается кнопками
Идем на офицальный STM сайт https://www.st.com/en/development-tools/stm32cubemx.html. Регаемся и качаем оттуда STM32cubemx. Также можете скачать и установить IDE STM32cubeide, я не совсем люблю подобный софт, но думаю что в будущем это может пригодится как никак STM32cubemx все же заточен на работу с этими микроконтроллерами.
VSCODE я думаю тоже разберетесь и установите https://code.visualstudio.com/. В целом, на чем писать не так важно, лишь бы удобно было. VSCODE бесплатный и там есть более менее работающий переход по функциям и автоподсказки (но это не точно).
Что-жь соберем заготовку на наш первый проект.
Запустим STM32cubemx находим вкладку File кликаем new project.
Теперь найдем нужный нам микроконтроллер и кликнем start project.
Теперь переходим на вкладку project Manager. Указываем в качестве названия t1 во вкладке toolchain указываем Makefile
Кликаем generate code открываем через VSCODE. в терминале заходим в папку пишем make. На выходе у нас появляется папка build в которой лежат готовый файлы для заливки кода.
Как вы видите в linux не так сложно все это запустить. Хотя если честно когда я только сел разбираться для меня это был просто пи*ц. Даже щас из за больших пробелов в знании в языке Си и сборке через Cmake и Make файл, я страдаю . Но чай разберемся.))
P.S Я не последняя инстанция. Но если что пишите.)