STM32F103C8T6 без SPL, HAL и без IDE: Система тактирования RCC, таймер SysTick, UART передатчик, планировщик задач, SPI и I2C модули в режиме мастера

разделы: STM32, дата: 19 октября 2018г.

Внимание! На данный момент(май-июнь 2025г.) статья находится в стадии редактирования. Первоначальную версию статьи можно открыть по следующей ссылке.

Когда я впервые начал знакомиться с микроконтроллерами семейства STM32, то обратил внимание на то, что прошивки даже с самыми простыми алгоритмами (например Blink), по меркам 8-битных микроконтроллеров, имеют огромный размер: от одного килобайта и больше. Поэтому целью этой статьи стала попытка написания прошивок для STM32 в стиле 8-битных микроконтроллеров, когда вы полностью контролируете процесс компиляции, используя лишь: компилятор, флешер и текстовый редактор. Соответственно в статье рассматриваются типовые на мой взгляд вопросы при переходе с 8-битников на 32-разрядную архитектуру: как помигать светодиодом, как настроить тактирование, как завести SPI и поднять I2C.

Если вам чего-то из этого не хватает, то вы легко сможете подтянуть "матчасть" по статьям на хабре: STM32F4: GNU AS: Программирование на ассемблере в семи частях, по методичке "Народная электроника" выпуск 2. А.В. Немоляев. GCC Cortex-M3. PDF, или по книге "Джозеф Ю. Ядро Cortex - МЗ компании ARM. Полное руководство", Козаченко В.Ф.(ред.): "Практический курс микропроцессорной техники на базе процессорных ядер ARM-Cortex-M3/M4/M4F" 2019 М.: МЭИ

Оборудование. В статье я буду использовать популярную плату "Blue Pill" на микроконтроллере STM32F103C8T6, программатор ST-LINK v2 (китайская реплика), USB-UART преобразователь FT232RL, 4-x разрядный семи-сегментный индикатор, на SPI интерфейсе и RTC DS3231 на I2C интерфейсе.

    Список используемой документации:
  1. Перевод на русский язык руководства по программированию STM32F10x и справочного руководства по STM32F105-107 альтернативная ссылка
  2. Cortex-M3 TRM Cortex-M3 Technical Reference Manual
  3. Cortex-M3: Руководство программиста (PM0056), для чипов серий: STM32F10xxx/20xxx/21xxx/L1xxxx.
  4. Справочное руководство (Reference Manual: RM0008), для чипов следующих серий: STM32F101xx, STM32F102xx, STM32F103xx, STM32F105xx and STM32F107xx advanced Arm.
  5. Datasheet на чипы: STM32F103x8/STM32F103xB.
  6. STM32F10xxx I2C optimized examples, Application note AN2824
  7. ARM. Учебный Курс. SysTick — Системный таймер | Электроника для всех
  8. ARM Учебный курс. USART | Электроника для всех
  9. Статья на хабре: STM32: SPI: LCD — Вы всё делаете не так [восклицательный знак]
  10. SPI (перевод из книги Mastering STM32) – Radiotech

Содержание:

    I. Создание базового проекта для STM32F103xx
  1. Вместо введения
  2. Минималистический Blink размером в 148 байт
  3. Небольшой ликбез по ассемблеру Cortex-M3
  4. Таблица векторов
  5. Настройка системы тактирования - RCC (Reset and Clock Control)
    II. Работа с периферией микроконтроллера STM32F103xx
  1. Функция задержки на ассемблерных инструкциях
  2. Функция задержки на прерывании таймера SysTick
  3. Настройка UART интерфейса в режиме передатчика
  4. Простой бенчмарк на операции деления
  5. Пишем простой планировщик задач (RTOS)
  6. Драйвер 4-x разрядного семисегментного индикатора (программный SPI)
  7. Настройка аппаратного интерфейса SPI для драйвера 4-х разрядного семисегментного индикатора
  8. Регистры I2C интерфейса, делаем сканер I2C шины
  9. Однобайтный режим чтения по шине I2C
  10. Двухбайтный режим чтения по шине I2C
  11. Запись массива через шину I2C
  12. Чтение массива через шину I2C
  13. Отладка в консоли с использованием OpenOCD
    Продолжение цикла STM32F103C8 без HAL и SPL:
  1. Работа с SPI дисплеями Nokia_5110 и ST7735
  2. Работа с монохромными дисплеями STE2007 и SSD1306
  3. Вывод текста на дисплей ST7735

При написании примеров я использовал кросс-компилятор arm-none-eabi-gcc версии 10.3 скачанный с сайта ARM. Данная версия сейчас (май 2025г.) объявлена устаревшей (deprecated), однако у меня она работала стабильно, потому приведу альтернативные ссылки для скачивания: версия 10.3 тарбол для linux x86_64, zip-архив для win32. Актуальная версия компилятора - 14.2 тарбол для linux x86_64, и zip-архив для win64.

Посмотреть исходники, сборочные файлы, скачать скомпилированные прошивки, можно с портала GITLAB https://gitlab.com/flank1er/stm32_bare_metal

Читать дальше