Внимание! Летом 2025г. статья была полностью переписана. Первоначальную версию статьи можно открыть по следующей ссылке. "За бортом" осталась осталась главы по SPI и легковесной RTOS. Их планируется добавить позже. Так же в планах добавить раздел по АЦП, ЦАП, I2S.
Когда я впервые начал знакомиться с микроконтроллерами семейства STM32, то обратил внимание на то, что прошивки даже с самыми простыми алгоритмами (например Blink), по меркам 8-битных микроконтроллеров, имеют огромный размер: от одного килобайта и больше. Поэтому целью этой статьи стала попытка написания прошивок для STM32 в стиле 8-битных микроконтроллеров, когда вы полностью контролируете процесс компиляции, используя лишь: компилятор, флешер и текстовый редактор. Соответственно в статье рассматриваются типовые на мой взгляд вопросы при переходе с 8-битников на 32-разрядную архитектуру: как помигать светодиодом, как настроить тактирование, как завести SPI и поднять I2C.
В данной статье рассматривается программирование "на регистрах" в системах Linux. Т.к. сейчас много микроконтроллеров китайского производства, они содержат самые разнообразные SDK для работы, но в принципе многие так и иначе имеют схожесть с STM32 по адресам регистров. Даже если вы откроете даташит на CH32V003, который вообще-то RISC-V, то увидите те же регистры GPIO, что в stm32f103xx. Поэтому я считаю, что надо уметь составлять свой SDK "с нуля", по одним даташитам.
Оборудование. В статье я буду использовать популярную плату "Blue Pill" на микроконтроллере STM32F103C8T6, программатор ST-LINK v2 (китайская реплика), USB-UART преобразователь FT232RL, дисплей SSD1306 и флешку M24C08 на I2C интерфейсе. Кроме того, у меня имеется простенький логический анализатор, приобретенный в безымянном китайшопе.
Содержание:
При написании примеров я использовал кросс-компилятор arm-none-eabi-gcc версии 10.3 скачанный с сайта ARM. Данная версия сейчас (май 2025г.) объявлена устаревшей (deprecated), однако у меня она работала стабильно, потому приведу альтернативные ссылки для скачивания: версия 10.3 тарбол для linux x86_64, zip-архив для win32. Актуальная версия компилятора - 14.2 тарбол для linux x86_64, и zip-архив для win64.
Git со всеми проектами к статье здесь: https://gitlab.com/flank1er/stm32f103c8_cmsis_examples