Перейти к содержанию

STM32 с нуля

Восемь уроков программирования STM32F103C8 на C без HAL, без CubeMX и без готового проекта IDE: от пустой папки, своего стартового файла и скрипта компоновщика до тактирования 72 МГц, прерываний, ШИМ и АЦП с DMA. Каждый регистр, бит и предел — из документов ST и Arm с номером раздела.

8 уроков

  1. Урок 1. Тулчейн и первая прошивка Blue PillMakefile, arm-none-eabi-gcc, OpenOCD и GDB: от пустой папки до прошивкиУрок 1 · 35 мин
  2. Урок 2. Стартовый файл и скрипт компоновщикаТаблица векторов, Reset_Handler, .data и .bss, MEMORY и SECTIONS для STM32F103C8Урок 2 · 35 мин
  3. Урок 3. RCC и GPIO: мигаем светодиодомRCC_APB2ENR, CRL и CRH, BSRR и BRR, мигание PC13Урок 3 · 30 мин
  4. Урок 4. 72 МГц от кварца и SysTickHSE, PLL ×9, FLASH_ACR, RCC_CFGR, SysTick 1 мс и delay_msУрок 4 · 35 мин
  5. Урок 5. USART1: связь с компьютеромPA9/PA10, BRR = 0x271, TXE и RXNE, вывод строк и чиселУрок 5 · 35 мин
  6. Урок 6. Прерывания: NVIC, EXTI и приём USARTNVIC_EnableIRQ, приоритеты, EXTI12 на PB12, RXNEIE и кольцевой буферУрок 6 · 40 мин
  7. Урок 7. Таймеры: прерывание по переполнению и ШИМPSC, ARR, UIF, TIM2_IRQHandler, PWM mode 1 на TIM3_CH1Урок 7 · 40 мин
  8. Урок 8. АЦП и DMA: измеряем без участия ядраADCPRE, CAL, SMPR, SQR, SCAN и CONT, DMA1_Channel1 в режиме CIRCУрок 8 · 45 мин

Как устроен трек

Трек для тех, кто уже программировал микроконтроллер — в Arduino IDE или регистрами AVR, например по треку «AVR с нуля», — и хочет так же разобраться с ARM. Все уроки используют одну плату — Blue Pill с STM32F103C8: ядро Cortex-M3, 64 КБ флеш-памяти, 20 КБ ОЗУ, кварц 8 МГц и светодиод на PC13. Ни HAL, ни STM32CubeMX, ни сгенерированного проекта IDE — только компилятор, make, OpenOCD, заголовки CMSIS и справочное руководство.

Проект растёт от урока к уроку: в первом появляются Makefile, стартовый файл и скрипт компоновщика, в четвёртом — модуль тактирования clock.c, в пятом — uart.c, и последующие уроки ими пользуются. Каждый урок построен одинаково:

  • цель — что заработает в конце урока;
  • объяснение — регистры и биты с номерами разделов и страниц RM0008;
  • программа на C для arm-none-eabi-gcc;
  • на STM32F4 — что иначе на Black Pill с STM32F411;
  • задание с ответом под спойлером;
  • что дальше — следующий урок, страницы регистров атласа, калькуляторы и глоссарий.

Что понадобится

  • Blue Pill с STM32F103C8 и кабель micro-USB для питания;
  • отладчик SWD: ST-LINK V2 (подойдёт и недорогая копия), J-Link или адаптер CMSIS-DAP — какие бывают, рассказано в статье «Программаторы и отладчики»;
  • преобразователь USB-UART с уровнями 3,3 В для уроков 5–8;
  • светодиод и резистор 330 Ом, кнопка, потенциометр 10 кОм, макетная плата и провода;
  • Arm GNU Toolchain, make и OpenOCD — что и откуда ставить, в уроке 1.

Откуда числа и насколько им верить

Регистры, биты, адреса и временные параметры взяты из справочного руководства RM0008 Rev 21 и даташита DS5319 Rev 20, поведение ядра — из руководства Arm DUI 0552A по Cortex-M3, имена регистров и макросов — из заголовков CMSIS (cmsis-device-f1 v4.3.5, CMSIS_5 5.9.0). Номера разделов и страниц RM0008 указаны рядом с фактами; страницы — по колонтитулу «N/1136». Всё, что мы посчитали сами, подписано «расчёт наш».

Программы написаны для arm-none-eabi-gcc и вычитаны по RM0008 и заголовкам CMSIS: каждое имя регистра и макроса проверено по stm32f103xb.h и core_cm3.h. Все примеры собраны arm-none-eabi-gcc 15.2.1 (сборка xPack) с ключами из урока 1, включая -Wall -Wextra, без предупреждений; расположение таблицы векторов, бит Thumb, адреса .data и _estack проверены по готовому ELF. На плате примеры не запускались. Если у вас что-то собирается или работает иначе, напишите нам: исправим и отметим это на странице.

Полный справочник по кристаллу — на странице STM32F103C8, а все регистры серии с битами и значениями после сброса — в разделе регистров STM32F1. Чем регистры отличаются от HAL и LL и когда что выбирать, разобрано в статье «HAL, LL или регистры».

Готовятся к публикации

SPI: сдвиговый регистр и дисплей · I2C: датчик и часы реального времени · Запись во флеш-память: хранение настроек · Сторожевые таймеры IWDG и WWDG · Режимы Sleep, Stop и Standby · USB: виртуальный COM-порт · Те же задачи на LL и HAL

Частые вопросы

Что нужно для уроков STM32 с нуля?

Плата Blue Pill с STM32F103C8, отладчик ST-LINK V2 или любой другой адаптер SWD, преобразователь USB-UART на 3,3 В, светодиод с резистором 330 Ом, кнопка и потенциометр на 10 кОм. Из программ — Arm GNU Toolchain (компилятор arm-none-eabi-gcc, binutils и GDB), утилита make и OpenOCD. Заголовки регистров берутся из репозиториев ST и Arm на GitHub.

Почему уроки без HAL и STM32CubeMX?

HAL и CubeMX экономят время, но прячут, что происходит в кристалле: какие биты включают тактирование, почему вывод не работает без записи в RCC, откуда берутся 72 МГц. Когда эти вещи понятны, код HAL читается как обычная обёртка над регистрами, а ошибки в нём находятся быстрее. Переход на LL и HAL запланирован в следующих уроках трека.

Подойдут ли уроки для Black Pill на STM32F411 или STM32F401?

Подход тот же, но регистры GPIO, RCC и АЦП у серии F4 другие: вместо CRL и CRH — MODER, OTYPER, OSPEEDR, PUPDR и AFR, порты на шине AHB1, у АЦП нет бита калибровки, EXTI выбирается через SYSCFG. В конце каждого урока есть раздел «На STM32F4» с этими отличиями по справочным руководствам RM0383, RM0368 и RM0090 и заголовкам CMSIS для STM32F411.

Можно ли повредить плату на этих уроках?

Только нарушив пределы, о которых говорится в уроках: ток одного вывода не больше 25 мА по таблице 7 даташита DS5319, на выводы без отметки FT — не больше 4 В, а PC13–PC15 вообще не должны отдавать ток. Неудачная прошивка платы не портит: адаптер SWD подключается к ядру и в режиме сброса, а встроенный загрузчик ST по USART1 остаётся в системной памяти.