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

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

Внимание! Летом 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 интерфейсе. Кроме того, у меня имеется простенький логический анализатор, приобретенный в безымянном китайшопе.

    Список используемой документации:
  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

Содержание:

    I. Создание базового проекта для STM32F103xx
  1. Вместо введения
  2. Минималистический Blink размером в 148 байт
  3. Небольшой ликбез по ассемблеру Cortex-M3
  4. Таблица векторов
  5. Настройка системы тактирования - RCC (Reset and Clock Control)
    II. Работа с периферией микроконтроллера STM32F103xx
  1. Функция задержки на ассемблерных инструкциях
  2. Функция задержки на прерывании таймера SysTick
  3. Настройка и передача данных по UART
  4. Прием строки через UART интерфейс
  5. Числа с плавающей запятой, подключение стандартной библиотеки Си к проекту
  6. USART в режиме SPI-master
  7. USART + DMA в режиме SPI-master
  8. Битовая память в Cortex-M3
  9. Semihosting
  10. UART в полудуплексном режиме в качестве драйвера шины 1-Wire
  11. USB CDC драйвер для STM32F103 - Virtual COM port
  12. Регистры I2C интерфейса, делаем сканер I2C шины
  13. Функции записи по I2C шине
  14. Запись на I2C шину посредством DMA
  15. Однобайтный режим чтения с I2C шины
  16. Чтение массива через шину I2C
  17. Двухбайтный режим чтения, написание общих функций для I2C
    Продолжение цикла 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.

Git со всеми проектами к статье здесь: https://gitlab.com/flank1er/stm32f103c8_cmsis_examples

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