Пытаюсь в CMSIS на stm32
А вот и я )). Продолжаю Изучать 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
Для отправки в uart можете воспользоваться скриптом на питоне который приложен к гиту python3 input.py
В прошлый раз я очень хотел попробовать распаять stm32f030 в виде своей платы для разработки и уперся в то что у меня не получается сделать ее нормальной на одном слое. Поэтому наверное я отложу это на когда-нибудь потом.
Но один прекрасный товарищ на ютубе уже рассказал как это можно сделать и сделал даже комментарии что почему и как:
В следующей статье я постараюсь выложить проект розетки с реле таймером. Где будет возможность по дням недели настроить включение и выключение той или иной нагрузки. У меня уже есть одна реализации на HAL https://github.com/IzyI/timer_menu_lcd1602 Но реализация меня не совсем устраивает. Плюс у меня не хватает знаний по языку C. Я не знаю как реализовать те или иные структуры. Но постараюсь как то решить свое незнание.
Как то так.