Обновить

Жизнь без CubeMX: Первая прошивка для STM32, имея под рукой только блокнот

Уровень сложностиСредний
Время на прочтение11 мин
Охват и читатели13K
Всего голосов 42: ↑40 и ↓2+44
Комментарии28

Комментарии 28

Написано здорово, правда заголовку не соотаетствует. Но никогда, НИКОГДА, не надо использовать магические числа в коде программы, все константы через дефайны с понятным именем, зависимое от частоты - формулой от частоты, режимы пинов через макрос от номера пина и режима, заданного тоже енумом или дефайном…

Насчёт регистров - думаю стоит упомянуть такую штуку как SVD (System View Description). Это XMLка с описанием всех регистров микроконтроллера, сделанная вендором, из которой получается заголовочный файл со всем, что нужно. Переписывать вручную регистры из Reference Manual не стоит - такой подход это источник ошибок.

Спасибо за комментарий! Действительно, так на много лучше

Чисто моё мнение, но для полноты, вместо просто команды кросскомпилятору:
arm-none-eabi-gcc -mcpu=cortex-m3 -mthumb -nostdlib -Iinc \-T myLinker.ld startup/startup.c src/main.c src/config.c src/GPIO.c \src/LED.c src/Timers.c -o firmware.elfarm-none-eabi-objcopy -O binary firmware.elf firmware.bin

я бы добавил абзац про сборку проекта через make. Мне кажется, статья, как пособие для начинающих, с этим смотрелась бы более целостно.

не надо,

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

Тоже так думаю

Тогда уж сразу cmake. Зачем забивать людям голову этим кошмаром.

Нежные. Make-a испугались.

Теперь осталось написать как загрузить firmware.bin в указанную stm32. Короче, подробнее про загрузку.

Принято!

осталось написать как загрузить firmware.bin в указанную stm32. Короче, подробнее про загрузку.

Есть такой текст

https://habr.com/ru/articles/975880/
Программатор из обломка платы Nucleo

Спасибо, очень хорошо все разложено по всем полочкам. Если бы встретил такую статью 15 лет назад (когда сам начинал), вот это было бы счастье !!!

Отличная статья.

Спасибо!

Структура проекта

Сразу учимся разделять код на несколько слоёв:

А где же в Вашем проекте самое главное - файлы для системы сборки?
Ведь код сам собой не соберется в hex файл.

inc/Timers.h

Именно здесь удобно описать структуру регистра таймера.

Зачем Вам этот аппаратный таймер?
Подключите внутриядерный DWT таймер.
Пуск DWT Таймера на ARM Cortex-M (или Ядерный Таймер)
https://habr.com/ru/articles/1005622/

Хорошо, учту ваши комментарии на будущее

Когда проект растёт, удобно собрать все базовые настройки в одну функцию. В этом проекте такой точкой входа становится MCU_init().

А может лучше собрать все указатели на функции init в массив указателей?
Архитектура Xорошего Кода Прошивки (Массив-Наше Всё)
https://habr.com/ru/articles/816589/

Мне нравится, что startup написан на Си, а не на assembler. Поставил + тексту.
Это делает код переносимее между компиляторами, так как asm-gcc и asm-iar разные, как снежинки.

Это потому что аппаратная инициализация стека у ARM позволяет сразу писать на Си. Я тоже этим пользуюсь.

Вот только переносимость не работает так, как хотелось бы. Потому что вот это - чисто GCCшные фишки:

__attribute__((weak, alias("Default_Handler")));
__attribute__((used, section(".isr_vector")));

Крайне благодарен автору, наконец то нашел образец код-only, без всякой дебильной проперитарщины в виде CubeMX\CubeIDE

Недавно попробовал самостоятельно (ну почти) собрать проект только с CMSIS, было больно, но приятно.

 было больно, но приятно.

"

Чтобы тело и душа были молоды Были молоды, были молоды Ты не бойся ни жары и ни холода Закаляйся, как сталь! Физкульт-ура! Физкульт-ура! Ура! Ура! Источник текста:https://www.az-lyrics.ru/lyrics/sovetskie-pesni/zakalyaysya-kak-stal
"

Полезный опыт)

Побольше бы российских программистов микроконтроллеров, которые умеют собирать прошивки без GUI-IDE !

В ESP32 для объявления аппаратных структур вместо каста константы в volatile указатель сделали объявление внутри скрипта линковщика, получилось более мутно.

Да, согласен, в ESP32 через линкер сделали гибче, но менее прозрачно. Классический каст к адресу проще для понимания.

Зарегистрируйтесь на Хабре, чтобы оставить комментарий

Публикации