
Комментарии 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. Зачем забивать людям голову этим кошмаром.
Теперь осталось написать как загрузить 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 разные, как снежинки.
Крайне благодарен автору, наконец то нашел образец код-only, без всякой дебильной проперитарщины в виде CubeMX\CubeIDE
без всякой дебильной проперитарщины в виде CubeMX\CubeIDE
Да. Именно так.
Почему Сборка с Помощью GUI-IDE — это Тупиковый Путь
Недавно попробовал самостоятельно (ну почти) собрать проект только с CMSIS, было больно, но приятно.
было больно, но приятно.
"
Чтобы тело и душа были молоды Были молоды, были молоды Ты не бойся ни жары и ни холода Закаляйся, как сталь! Физкульт-ура! Физкульт-ура! Ура! Ура! Источник текста:https://www.az-lyrics.ru/lyrics/sovetskie-pesni/zakalyaysya-kak-stal
"
Полезный опыт)
В ESP32 для объявления аппаратных структур вместо каста константы в volatile указатель сделали объявление внутри скрипта линковщика, получилось более мутно.
Жизнь без CubeMX: Первая прошивка для STM32, имея под рукой только блокнот