Описание
Классический “Hello World” в мире микроконтроллеров — мигание светодиодом. Плата: STM32F103C8T6 (Blue Pill), встроенный светодиод на PC13.
В каждой статье я даю два варианта одного и того же кода:
- HAL — быстрый старт, Cube-стиль, абстракция поверх регистров
- CMSIS — bare metal, напрямую регистры, минимальная прошивка
Переключай кнопкой вверху страницы — выбор запомнится для всех статей.
Схема подключения
На Blue Pill светодиод уже распаян на PC13 — внешних деталей не нужно.
| Пин STM32 | Подключение |
|---|---|
| PC13 | LED на плате (встроенный) |
Код
main.c (HAL)
| |
Как это работает
HAL_Init()— инициализирует HAL, настраивает SysTick на 1 мсMX_GPIO_Init()— включает тактирование GPIOC, настраивает PC13 как push-pull выходHAL_GPIO_TogglePinпереключает пин,HAL_Delay(500)ждёт 500 мс
main.c (CMSIS)
| |
Как это работает
У STM32F103 конфигурация пинов хранится в двух регистрах: CRL (пины 0–7) и CRH (пины 8–15). На каждый пин 4 бита (MODE + CNF). Для PC13 это биты [23:20] регистра GPIOC->CRH.
SysTick_Config(8000)— прерывание каждые 8000 тактов HSI = 1 мсRCC->APB2ENR |= RCC_APB2ENR_IOPCEN— включаем тактирование GPIOC- Чистим и выставляем 4 бита для PC13:
MODE13 = 0b10(выход 2 МГц push-pull) ODR ^= GPIO_ODR_ODR13— инверсия состояния пина
Атомарная запись — BSRR
Вместо ODR ^= (read-modify-write) лучше использовать атомарный BSRR:
| |
Подводные камни
- Тактирование GPIO обязательно — забыл включить → пин не шевелится, без ошибок
- На Blue Pill LED горит при LOW — логика инверсная
- После сброса ядро работает на HSI 8 МГц (без PLL) — учитывай при расчёте SysTick
- В HAL при использовании CubeMX PC13 может быть занят под RTC — проверь конфигурацию
- CMSIS-имена регистров (
RCC_APB2ENR_IOPCEN,GPIO_CRH_MODE13_1) берутся изstm32f103xb.h