Как настроить среду разработки для STM32. Какие инструменты нужны для программирования микроконтроллеров STM32. С чего начать изучение STM32 для новичков. Как написать первую программу для платы STM32 Discovery.
Почему стоит изучать микроконтроллеры STM32
Микроконтроллеры семейства STM32 обладают рядом преимуществ по сравнению с другими популярными платформами для разработки электронных устройств:
- Отличное соотношение цена/функциональность — даже простые модели STM32 имеют богатый набор периферии
- 32-битная архитектура ARM Cortex-M обеспечивает высокую производительность
- Большой выбор моделей с различными характеристиками в рамках одного семейства
- Совместимость по выводам между разными моделями STM32
- Популярность в промышленной разработке электроники
- Подробная документация от производителя
При этом начать изучение STM32 можно с недорогих отладочных плат Discovery, которые включают программатор и базовую периферию. Это позволяет сразу погрузиться в практику, не тратясь на дополнительное оборудование.

Необходимые инструменты для разработки под STM32
Для начала работы с микроконтроллерами STM32 потребуется следующий минимальный набор:
- Отладочная плата на базе STM32 (например, STM32F0Discovery)
- Среда разработки (IDE) — Keil uVision, STM32CubeIDE или другая
- Программатор ST-Link (обычно встроен в отладочные платы)
- Документация на используемый микроконтроллер:
- Даташит (datasheet)
- Справочное руководство (reference manual)
- Схема отладочной платы
Также пригодятся макетная плата, провода и базовые электронные компоненты для сборки простых схем. С этим набором можно приступать к изучению программирования STM32 на практике.
Настройка среды разработки Keil uVision для STM32
Keil uVision — одна из популярных сред разработки для микроконтроллеров ARM. Рассмотрим базовую настройку этой IDE для работы с STM32:
- Скачайте и установите Keil MDK-ARM с официального сайта
- Запустите Pack Installer и установите пакеты:
- Keil::STM32F0xx_DFP
- ARM::CMSIS
- Keil::ARM_Compiler
- Создайте новый проект, выбрав нужную модель STM32
- В настройках проекта укажите частоту кварцевого генератора (обычно 8 МГц)
- Выберите ST-Link в качестве отладчика
- Настройте кодировку Windows-1251 для корректного отображения кириллицы
После этих шагов среда будет готова для разработки программ под выбранный микроконтроллер STM32.

Структура простейшей программы для STM32
Минимальная программа для микроконтроллера STM32 имеет следующую структуру:
«`c #include «stm32f0xx.h» int main(void) { /* Инициализация периферии */ while(1) { /* Основной цикл программы */ } } «`- Подключение заголовочного файла для конкретного семейства STM32
- Функция main() как точка входа в программу
- Бесконечный цикл while(1) для непрерывного выполнения
В начале программы обычно выполняется настройка используемой периферии микроконтроллера. Основная логика работы размещается внутри бесконечного цикла.
Пример программы «Мигающий светодиод» для STM32
Рассмотрим простой пример программы, которая заставляет поочередно мигать два светодиода на отладочной плате STM32F0Discovery:
«`c #include «stm32f0xx.h» int main(void) { /* Включаем тактирование порта GPIOC */ RCC->AHBENR |= RCC_AHBENR_GPIOCEN; /* Настраиваем пины PC8 и PC9 на выход */ GPIOC->MODER |= GPIO_MODER_MODER8_0 | GPIO_MODER_MODER9_0; while(1) { /* Включаем LED3, выключаем LED4 */ GPIOC->BSRR = GPIO_BSRR_BS_8 | GPIO_BSRR_BR_9; /* Задержка */ for(int i=0; i<500000; i++); /* Включаем LED4, выключаем LED3 */ GPIOC-> BSRR = GPIO_BSRR_BS_9 | GPIO_BSRR_BR_8; /* Задержка */ for(int i=0; i<500000; i++); } } ```Основные этапы работы программы:

- Включение тактирования порта GPIOC
- Настройка пинов PC8 и PC9 на выход
- В бесконечном цикле:
- Включение одного светодиода и выключение другого
- Программная задержка
- Переключение состояния светодиодов
- Снова задержка
Этот пример демонстрирует базовые принципы работы с GPIO и создания простых программ для STM32.
Компиляция и загрузка программы в микроконтроллер
После написания кода необходимо выполнить следующие шаги для запуска программы на микроконтроллере:
- Скомпилировать проект в среде разработки
- Подключить отладочную плату к компьютеру через USB
- Загрузить скомпилированную программу в память микроконтроллера через встроенный программатор ST-Link
В Keil uVision эти действия выполняются нажатием кнопок Build и Download. При успешной загрузке программа сразу начнет выполняться на микроконтроллере.
Отладка программ для STM32
Для поиска ошибок и анализа работы программы можно использовать встроенные средства отладки:
- Точки остановы (breakpoints) для приостановки выполнения
- Пошаговое выполнение кода
- Просмотр значений переменных и регистров
- Анализ стека вызовов
Отладка выполняется через интерфейс SWD с помощью программатора ST-Link. Это позволяет отслеживать работу программы непосредственно на целевом устройстве.

Дальнейшие шаги в изучении STM32
После освоения базовых принципов работы с STM32 можно переходить к изучению более сложных тем:
- Работа с различными интерфейсами (UART, SPI, I2C и др.)
- Использование таймеров и ШИМ
- Аналого-цифровое и цифро-аналоговое преобразование
- Прерывания и обработка событий
- Режимы пониженного энергопотребления
- Работа с внешней памятью
- Применение RTOS
Важно постепенно усложнять проекты, изучая новые возможности микроконтроллера. Это позволит накопить практический опыт разработки для STM32.
Программирование МК STM32
↓ Перейти к основному содержимому
Главная › Программирование МК STM32
 
 
 
- Урок 1. Установка Keil μVision
- Урок 2. Бегущие огни
- Урок 3. Библиотека SPL. Подключаем кнопку
- Урок 4. Библиотека HAL. STM32 CUBE MX. Светодиоды и кнопка
- Урок 5. Библиотека HAL. STM32 CUBE MX. Таймеры
- Урок 6. Библиотека HAL. LCD 20×4. 4-битный режим
- Урок 7. HAL. LCD 20×4. 4-битный режим. Выводим информацию
- Урок 8. HAL. Шина I2C. Подключаем микросхему RTC DS3231
- Урок 9. HAL. Шина I2C. Продолжаем работу с DS3231
- Урок 10. HAL. Изучаем PWM (ШИМ). Мигаем светодиодами плавно
- Урок 11. HAL. Статическая индикация
- Урок 12. HAL. Динамическая индикация
- Урок 13. HAL. USART. Передача данных
- Урок 14. HAL. USART. Прием данных
- Урок 15. HAL. USART. DMA
- Урок 16. HAL. ADC. Regular Channel
- Урок 17.
HAL. ADC. Regular Channel. Interrupt
- Урок 18. HAL. ADC. Regular Channel. DMA
- Урок 19. HAL. ADC Injected Channel
- Урок 20. HAL. ADC. Injected Channel. Interrupt
- Урок 21. HAL. ADC. Regular Channel. Trigger
- Урок 22. HAL. I2C. I2C to LCD2004
- Урок 23. HAL. SPI. Сдвиговый регистр 74HC595
- Урок 24. HAL. SPI. LED Статическая индикация
- Урок 25. HAL. SPI. LED Динамическая индикация
- Урок 26. HAL. SPI. Драйвер индикатора MAX7219
- Урок 27. HAL. DAC
- Урок 28. HAL. DAC. Triangle
- Урок 29. HAL. DAC. Triangle. DMA
- Урок 30. HAL. DAC. Sinus. DMA
- Урок 31. HAL. DAC. Noise
- Урок 32. HAL. DAC. Noise. RNG
- Урок 33. HAL. USB. Virtual Com Port
- Урок 34. HAL. USB. HID
- Урок 35. HAL. USB. Custom HID
Урок 36. HAL. USB. Host. Mass Storage Class
- Часть 1
- Часть 2
Урок 37. Подключаем дисплей TFT 240×320 на контроллере ILI 9341 с шиной 8bit
- Часть 1
- Часть 2
- Часть 3
- Часть 4
- Часть 5
- Часть 6
- Часть 7
- Часть 8
- Часть 9
- Урок 38.
Плата NUCLEO STM32F401RE и оценочные платы
Урок 39. Подключаем акселерометр LSM303DLHC
- Часть 1
- Часть 2
- Часть 3
- Часть 4
- Часть 5
- Урок 40. Знакомство с платой NUCLEO STM32F767ZI
Урок 41. Подключаем акселерометр LIS3DSH
- Часть 1
- Часть 2
- Часть 3
- Часть 4
Урок 42. Подключаем акселерометр LSM6DS0
- Часть 1
- Часть 2
Урок 43. Подключаем акселерометр LSM6DS3
- Часть 1
- Часть 2
- Урок 44. SDIO. FATFS
Урок 45. Подключаем гироскоп LSM6DS0
- Часть 1
- Часть 2
Урок 46. I2S AUDIO
- Часть 1
- Часть 2
- Часть 3
- Часть 4
- Часть 5
- Часть 6
- Часть 7
Урок 47. Подключаем гироскоп LSM6DS3
- Часть 1
- Часть 2
Урок 48.
USB DEVICE AUDIO
- Часть 1
- Часть 2
- Часть 3
Урок 49. HAL. Магнитометр LSM303DLHC
- Часть 1
- Часть 2
- Урок 50. Устанавливаем System Workbench for STM32
Урок 51. Подключаем магнитометр LIS3MDL
- Часть 1
- Часть 2
- Часть 3
Урок 52. Датчик давления LPS25HB
- Часть 1
- Часть 2
- Часть 3
- Часть 4
- Урок 53. System Workbench. Создаём новый проект
- Урок 54. System Workbench. FreeRTOS
Урок 55. Подключаем датчик влажности HTS221
- Часть 1
- Часть 2
Урок 56. System Workbench. Подключаем библиотеку BSP
- Часть 1
- Часть 2
Урок 57. Wi-Fi. SPWF01SA11. Команды
- Часть 1
- Часть 2
- Часть 3
Урок 58. System Workbench. LCD. SDIO
- Часть 1
- Часть 2
- Урок 59.
Урок 60. F769I-DISCO. WB. LCD. SDIO
- Часть 1
- Часть 2
Урок 61. Модуль LCD 16×2. Работаем с кнопками
- Часть 1
- Часть 2
- Часть 3
Урок 62. FMC SDRAM
- Часть 1
- Часть 2
- Часть 3
- Часть 4
Урок 63. Модуль LCD 16×2. МЕНЮ
- Часть 1
- Часть 2
- Часть 3
Урок 64. HAL. LTDC
- Часть 1
- Часть 2
- Часть 3
Урок 65. Операционный усилитель TSZ124IPT
- Часть 1
- Часть 2
- Часть 3
- Часть 4
Урок 66. HAL. LTDC. SDRAM
- Часть 1
- Часть 2
Урок 67. HAL. LTDC. BMP
- Часть 1
- Часть 2
Урок 68. HAL. LAN. ENC28J60
- Часть 1
- Часть 2
- Часть 3
- Часть 4
- Часть 5
- Часть 6
- Часть 7
- Часть 8
- Часть 9
- Часть 10
Урок 69.
HAL. LTDC. DMA2D
- Часть 1
- Часть 2
- Часть 3
Урок 70. HAL. LTDC. Вывод текста на дисплей
- Часть 1
- Часть 2
Урок 71. LAN. ENC28J60. ARP
- Часть 1
- Часть 2
- Часть 3
- Часть 4
Урок 72. Touch panel FT5336
- Часть 1
- Часть 2
- Часть 3
- Часть 4
Урок 73. HAL. LTDC. EmWin. Подключение библиотеки
- Часть 1
- Часть 2
- Часть 3
- Урок 74. EXTI или внешние прерывания
- Урок 75. LTDC. EmWin. BMP. Multiple Buffering
- Урок 76. HAL. LTDC. EmWin. MultiLayer. Transparency
- Урок 77. LAN. ENC28J60. Внешние прерывания (EXTI)
- Урок 78. HAL. LTDC. EmWin. Window Manager
- Урок 79. HAL. LTDC. EmWin. Подключаем акселерометр LSM6DS0
- Урок 80. LAN. ENC28J60. UDP Server
- Урок 81. LAN. ENC28J60. UDP Client
- Урок 82.
LAN. ENC28J60. Удаленный доступ
Урок 83. LAN. ENC28J60. NTP. Узнаём точное время
- Часть 1
- Часть 2
Урок 84. LAN. ENC28J60. TCP Server. Соединение
- Часть 1
- Часть 2
- Урок 85. LAN. ENC28J60. TCP Server. Передача данных
Урок 86. LAN. ENC28J60. HTTP Server. Передаём малую страницу
- Часть 1
- Часть 2
Урок 87. LAN. ENC28J60. HTTP Server. Передаём страницу побольше
- Часть 1
- Часть 2
Урок 88. SD. SPI. FATFS
- Часть 1
- Часть 2
- Часть 3
- Часть 4
- Урок 89. LAN. ENC28J60. HTTP Server. Подключаем карту SD
Урок 90. Датчик освещённости VL6180X
- Часть 1
- Часть 2
- Часть 3
- Часть 4
- Часть 5
Урок 91. LAN. W5500. HTTP Server
- Часть 1
- Часть 2
- Часть 3
- Часть 4
- Часть 5
Урок 92.
Датчик температуры DS18B20
- Часть 1
- Часть 2
- Часть 3
Урок 93. LAN. W5500. HTTP Server. Сокеты
- Часть 1
- Часть 2
Урок 94. DS18B20. Несколько датчиков на одной шине
- Часть 1
- Часть 2
- Часть 3
Урок 95. LAN. W5500. FTP Server
- Часть 1
- Часть 2
- Часть 3
- Часть 4
Урок 96. LAN8720. LWIP. TCP Client
- Часть 1
- Часть 2
- Часть 3
- Урок 97. Подключаем bluetooth-модуль HC-05
Урок 98. LAN8720. LWIP. TCP Server
- Часть 1
- Часть 2
Урок 99. HC-05. Master. Соединяем два МК
- Часть 1
- Часть 2
Урок 100. LAN8720. LWIP. TCP. Соединяем два контроллера
- Часть 1
- Часть 2
- Урок 101. HC-05. Передаём температуру
Урок 102. LAN8720.
LWIP. HTTP RAW
- Часть 1
- Часть 2
Урок 103. Модули NRF24L01
- Часть 1
- Часть 2
- Часть 3
- Часть 4
Урок 104. FreeRTOS. Бинарные (двоичные) семафоры
- Часть 1
- Часть 2
Урок 105. NRF24L01. Передаём данные
- Часть 1
- Часть 2
Урок 106. FreeRTOS. Динамическое создание и уничтожение задач
- Часть 1
- Часть 2
Урок 107. Датчик влажности и температуры DHT22
- Часть 1
- Часть 2
- Урок 108. FreeRTOS. Параметры
- Урок 109. NRF24L01. Передаём температуру и влажность с датчика DHT22
- Урок 110. FreeRTOS. Приоритеты задач
Урок 111. FreeRTOS. Очереди
- Часть 1
- Часть 2
- Урок 112. FreeRTOS. Таймеры
Урок 113. NRF24L01. Несколько передатчиков
- Часть 1
- Часть 2
- Часть 3
- Урок 114.
FreeRTOS. Продвинутая задержка DelayUntil
Урок 115. NRF24L01. Несколько приемников
- Часть 1
- Часть 2
Урок 116. FreeRTOS. Прерывания. Очереди в прерываниях
- Часть 1
- Часть 2
- Урок 117. NRF24L01. Обмен информацией
- Урок 118. LAN8720. LWIP. RAW. UDP Client
Урок 119. WS2812B. Лента на умных светодиодах RGB
- Часть 1
- Часть 2
- Часть 3
- Урок 120. LAN8742A. LWIP. NETCONN. UDP Server
Урок 121. Датчик температуры, давления и влажности BME280
- Часть 1
- Часть 2
- Часть 3
- Часть 4
- Урок 122. LAN87XX. LWIP. NETCONN. UDP. Соединяем два контролера
Урок 123. LAN87XX. LWIP. NETCONN. UDP. Соединяем три контролера
- Часть 1
- Часть 2
- Урок 124. LAN8742A. LWIP. NETCONN. TCP Server
- Урок 125. LAN8742A. LWIP. NETCONN. TCP Client
- Урок 126.
LAN8742A. LWIP. NETCONN. TCP. Соединяем два контролера
- Урок 127. LAN8742A. LWIP. NETCONN. HTTP Server
Урок 128. LAN8742A. LWIP. NETCONN. HTTP. AJAX
- Часть 1
- Часть 2
- Часть 3
Урок 129. LAN8742A. LWIP. NETCONN. HTTP. WebSocket
- Часть 1
- Часть 2
- Часть 3
- Часть 4
Урок 130. LAN8742A. LWIP. NETCONN. NTP. Узнаём точное время
- Часть 1
- Часть 2
Урок 131. LAN8742A. LWIP. SOCKET. UDP Server
- Часть 1
- Часть 2
- Урок 132. LAN8742A. LWIP. SOCKET. UDP. Соединяем два контроллера
- Урок 133. LAN8742A. LWIP. SOCKET. TCP Server
- Урок 134. LAN8742A. LWIP. SOCKET. TCP Client
- Урок 135. LAN8742A. LWIP. SOCKET. TCP. Соединяем три контролера
- Урок 136. LAN8742A. LWIP. SOCKET. HTTP Server
- Урок 137. LAN8742A. LWIP. SOCKET. HTTP. AJAX
Урок 138. Independent watchdog (IWDG)
- Часть 1
- Часть 2
- Урок 139.
LAN8742A. LWIP. SOCKET. HTTP. WebSocket
Урок 140. Window watchdog (WWDG)
- Часть 1
- Часть 2
Урок 141. USB HS Host MSC Standalone
- Часть 1
- Часть 2
Урок 142. WS2812B. Ленты на 150-300 светодиодов
- Часть 1
- Часть 2
- Часть 3
- Часть 4
- Часть 5
Урок 143. USB HS Host MSC FREERTOS
- Часть 1
- Часть 2
Урок 144. Режимы пониженного энергопотребления. SLEEP
- Часть 1
- Часть 2
Урок 145. WS2812B. Новые эффекты и оптимизация кода
- Часть 1
- Часть 2
- Часть 3
- Урок 146. LL. Светодиоды и кнопка
Урок 147. LL. Таймеры
- Часть 1
- Часть 2
- Урок 148. LL. Динамическая индикация
- Урок 149. LL. PWM (ШИМ). Мигаем светодиодами плавно
Урок 150. LL. I2C. Подключаем внешний EEPROM
- Часть 1
- Часть 2
- Часть 3
- Урок 151.
LL. I2C. Переходник для LCD 16×2
Урок 152. LL. SPI. Драйвер индикатора MAX7219
- Часть 1
- Часть 2
Урок 153. HAL. SPI. Соединяем два контроллера
- Часть 1
- Часть 2
- Урок 154. LL. SPI. Соединяем два контроллера
- Урок 155. HAL. DMA. MEM2MEM
Урок 156. LL. DMA. MEM2MEM
- Часть 1
- Часть 2
- Урок 157. HAL. SPI. Interrupt
- Урок 158. LL. SPI. Interrupt
- Урок 159. HAL. SPI. DMA
- Урок 160. LL. SPI. DMA
Урок 161. LL. USART. Передача данных
- Часть 1
- Часть 2
- Урок 162. LL. USART. Приём данных
- Урок 163. LL. USART. Interrupt
- Урок 164. LL. USART. DMA
- Урок 165. CMSIS. STM32F1. Бегущие огни
Урок 166. CMSIS. STM32F1. RCC
- Часть 1
- Часть 2
- Урок 167. CMSIS. STM32F1. SysTick. Прерывания
- Урок 168. CMSIS.
STM32F1. Таймеры
- Урок 169. CMSIS. STM32F1. GPIO. Input
- Урок 170. CMSIS. STM32F1. Динамическая индикация
- Урок 171. CMSIS. STM32F1. PWM (ШИМ). Мигаем светодиодами плавно
- Урок 172. CMSIS. STM32F1. I2C. Подключаем внешний EEPROM
- Урок 173. CMSIS. STM32F1. I2C. Переходник для LCD 16×2
- Урок 174. CMSIS. STM32F1. SPI. Драйвер индикатора MAX7219
- Урок 175. CMSIS. STM32F1. SPI. Соединяем два контроллера
- Урок 176. CMSIS. STM32F1. DMA. MEM2MEM
- Урок 177. CMSIS. STM32F1. SPI. Interrupt
- Урок 178. CMSIS. STM32F1. SPI. DMA
Урок 179. Дисплей TFT 240×320. SPI
- Часть 1
- Часть 2
- Урок 180. Дисплей TFT 240×320. SPI. DMA
- Урок 181. USART. Передача данных
- Урок 182. USART. Приём данных
- Урок 183. CMSIS. STM32F1. USART. Interrupt
- Урок 184. CMSIS. STM32F1. USART. DMA
Урок 185. STM32F1. LL. ADC. Regular Once
- Часть 1
- Часть 2
- Урок 186.
LL. STM32F1. ADC. Regular Once. Interrupt
- Урок 187. LL. STM32F1. ADC. Regular Continuous. Interrupt
- Урок 188. LL. STM32F1. ADC. Regular Once. Запуск по таймеру
- Урок 189. LL. STM32F1. ADC. Regular Once. DMA
- Урок 190. LL. STM32F1. ADC. Regular Continuous. DMA
- Урок 191. LL. STM32F1. ADC. Regular Once. DMA. Запуск по таймеру
- Урок 192. LL. STM32F1. ADC. Injected Once
- Урок 193. LL. STM32F1. ADC. Injected Once. Interrupt
- Урок 194. LL. STM32F1. ADC. Injected Continuous. Interrupt
- Урок 195. LL. STM32F1. ADC. Injected Once. Запуск по таймеру
- Урок 196. LL. STM32F1. ADC. Injected Once Scan
- Урок 197. LL. STM32F1. ADC. Injected Once Scan. Interrupt
- Урок 198. LL. STM32F1. ADC. Injected Continuous Scan. Interrupt
- Урок 199. LL. STM32F1. ADC. Injected Once Scan. Запуск по таймеру
- Урок 200. CMSIS. Bit banding
Урок 201. Assembler. Первый проект. Команды MOV, LDR, STR, B
- Часть 1
- Часть 2
- Урок 202.
Assembler. Мигающий светодиод. BX, BL, SUB. Флаги. Условия
Урок 203. Assembler. RCC. Стек. Новые команды
- Часть 1
- Часть 2
- Урок 204. Assembler. SysTick. Прерывания
- Урок 205. Assembler. Таймеры. Табличные переходы
- Урок 206. LL. STM32F4. Светодиоды и кнопка
- Урок 207. LL. STM32F4. Таймеры
- Урок 208. LL. STM32F4. SPI. Дисплей TFT 240×320
- Урок 209. LL. STM32F4. SPI. Дисплей TFT 240×320. DMA
- Урок 210. LL. STM32F4. DMA. MEM2MEM
- Урок 211. LL. STM32F4. I2C. Подключаем внешний EEPROM
- Урок 212. LL. STM32F4. USART
- Урок 213. LL. STM32F4. USART. DMA
- Урок 214. HAL. STM32F4. FLASH память W25Q. Получение информации
- Урок 215. HAL. STM32F4. FLASH память W25Q. Чтение данных
- Урок 216. HAL. STM32F4. FLASH память W25Q. Используем программу для обмена данными
- Урок 217. HAL. STM32F4. FLASH память W25Q. Считываем данные в программу
- Урок 218.
HAL. STM32F4. FLASH память W25Q. Стираем информацию
- Урок 219. HAL. STM32F4. FLASH память W25Q. Запись данных. Подключаем LCD
Опубликовано
© Narod Stream
Наверх
Начинаем изучать STM32 или Управляем светом по-умному / Хабр
Небольшое вступление
Однажды, заехав в очередную съемную квартиру, я столкнулся с определенным неудобством, которое достаточно сильно напрягало: выключатель света в основной комнате оказался за шкафом-стенкой, который был прикручен к стене, и его перестановка была невозможна т.к. на это требовалось значительно много времени и сил. Решить данную проблему хотелось очень сильно и в голову пришла одна мысль: сделать дистанционный пульт для управления освещением!
Именно с идеи создания собственного пультика для управления светом в комнате и началось моё увлечение электроникой, микроконтроллерами и различными радиоустройствами.
Список статей:
- Начинаем изучать STM32 или Управляем светом по-умному
- Начинаем изучать STM32: битовые операции
- Начинаем изучать STM32: Что такое регистры? Как с ними работать?
После этого я начал изучать данную тему, знакомиться с основами электроники, примерами устройств, узнавать, как люди реализуют подобного рода устройства. Поискав информацию на тему того, с чего можно было бы начать изучение микроконтроллеров я узнал о том, что такое Arduino, с чем их едят, о том, как с ними работать. Легкое решение выглядело весьма привлекательно, ведь насколько я понял на тот момент, код собирается на раз-два. Но сделав вывод, что я не узнаю, что творится внутри микроконтроллера за рамками Arduino-скетчей я решил поискать более интересный вариант, который подразумевал глубокое изучение и погружение в дебри микроконтроллерной техники.
В компании, в которой я работаю, имеется отдел разработки, и я решил обратиться к инженерам чтобы они направили меня на путь истинный и показали с чего можно было бы начать решение своей задачи. Меня решительно отговорили от изучения Arduino и у меня в руках оказалась неведомая и непонятная зеленая платка на которой виднелись надписи, буковки, разные электронные компоненты.
Всё это для меня на тот момент показалось непостижимо сложным, и я даже пришел в некоторое смятение, но от реализации поставленной задачи отказываться не собирался. Так я познакомился с семейством микроконтроллеров STM32 и платой STM32F0-Discovery, после изучения которых мне хотелось бы сваять свой девайс под нужные мне цели.
К моему большому удивлению, такого большого комьюнити, статей, примеров, различных материалов по STM не было в таком же изобилии как для Arduino. Конечно, если поискать найдется множество статей «для начинающих» где описано, как и с чего начать. Но на тот момент мне показалось, что все это очень сложно, не рассказывались многие детали, интересные для пытливого ума новичка, вещи. Многие статьи хоть и характеризовались как «обучение для самых маленьких», но не всегда с их помощью получалось достичь требуемого результата, даже с готовыми примерами кода. Именно поэтому я решил написать небольшой цикл статей по программированию на STM32 в свете реализации конкретной задумки: пульт управления освещением в комнате.
Почему не AVR/Arduino?
Предвосхищая высказывания о том, что неопытному новичку бросаться сразу же в изучение такого сложного МК как STM32 было бы рановато — я расскажу, почему я решил пойти именно этим путём, не вникая и не знакомясь с семейством процессоров от Atmel и даже не рассматривая Arduino как вариант.
Во-первых, решающую роль сыграло отношение цена-функционал, разницу видно даже между одним из самых дешевых и простых МК от ST и достаточно «жирной» ATMega:
После того, что я увидел значительные различия между ценой и возможностями AVR и STM32 – мною было принято решение, что AVR использовать в своей разработке я не буду =)
Во-вторых, я предварительно для себя старался определить набор умений и навыков, которые бы я получил к моменту, когда я достигну требуемого результата. В случае если бы я решил использовать Arduino – мне было бы достаточно скопировать готовые библиотеки, накидать скетч и вуаля. Но понимание того, как работают цифровые шины, как работает радиопередатчик, как это всё конфигурируется и используется – при таком раскладе мне бы не пришло бы никогда. Для себя я выбрал самый сложный и тернистый путь, чтобы на пути достижения результата – я бы получил максимум опыта и знаний.
В-третьих, любой STM32 можно заменить другим STM32, но с лучшими характеристиками. Причем без изменения схемы включения.
В-четвертых, люди, занимающиеся профессиональной разработкой больше склонны к использованию 32-разрядных МК, и чаще всего это модели от NXP, Texas Instruments и ST Microelectronics. Да и мне можно было в любой момент подойти к своим инженерам из отдела разработки и разузнать о том, как решить ту или иную задачу и получить консультацию по интересующим меня вопросам.
Почему стоит начинать изучение микроконтроллеров STM32 с использования платы Discovery?
Как вы уже поняли, знакомство и изучение микроконтроллера STM32 мы начнем с Вами, уважаемые читатели, с использования платы Discovery. Почему именно Discovery, а не своя плата?
- На любой плате Discovery имеется встроенный программатор/отладчик ST-LINK который подключается к компьютеру через USB и его можно использовать как для программирования микроконтроллера на плате, так и внешних устройств путем снятия/установки соответствующих перемычек. То есть плюсом ко всему — мы еще и экономим деньги, получая решение два в одном: микроконтроллер и программатор.
- Платы Discovery имеют полную разводку всех пинов прямо с микроконтроллера на пины платы. Я для удобства использования воткнул Discovery так же в две макетные платы.
- 3. На плате всегда имеется некоторое количество всяких периферийных устройств, например, таких как акселерометры, микрофоны, дисплеи, сенсоры и многих других. На разных платах Discovery имеются различные варианты обвеса. Если кому интересно, можете ознакомиться подробнее на сайте производителя.
Что нам понадобится для разработки помимо платы Discovery?
В своей работе с платой Discovery нам понадобится еще ряд незаменимых вещей, без которых мы не сможем обойтись:
- Схему платы чтобы видеть куда, где и что подключено.
Взять схему можно на страничке производителя Вашей платы в разделе Schematic Pack. Скачать схемы можно пролистав страницу немного ниже в блоке, указанном на картинке:
- Datasheet на наш микроконтроллер, чтобы в любой удобный момент можно было посмотреть распиновку, характеристики, параметры и прочую необходимую информацию для работы. В моём случае это STM32F051R8T6. Ссылка на datasheet находится в заголовке страницы:
- Так же нам понадобится Reference manual на наш микроконтроллер. Это документ, в котором подробнейшим образом описаны методы и подходы к работе с ядром МК, c его тактовым блоком, с периферией и т.д. Так же в нем содержатся описание всех регистров МК, всех опций и настроек МК и периферии. Наверное, это самый важный файл без которого разобраться в том, как и что работает внутри МК было бы очень сложно. Скачать файл можно по ссылке на странице микроконтроллера:
- И наконец, нам нужно установить среду разработки, в которой бы мы могли создавать программы для нашего МК и спокойно осуществлять компиляцию и прошивку наших программ.
В свое время я перепробовал почти все из самых популярных IDE и остановился на Keil uVision 5. На мой взгляд, данная среда разработки показалась мне самой удобной и простой в освоении. Встроенный отладчик, готовые и легко подключаемые низкоуровневые библиотеки, огромное количество примеров и удобно организованный рабочий интерфейс и пространство IDE стали решающими факторами, повлиявшими на мой выбор. Скачать данную IDE можно с официального сайта, но требуется простая регистрация:. Есть правда одно небольшое ограничение на размер загружаемой прошивки в 32кБ т.к. данная IDE платная. Но нам этого будет более чем достаточно. Нам понадобится MDK-Arm:
Приступим к первоначальной настройке и подготовке IDE к работе!
После того, как скачается установочный файл нашей IDE можно приступать к установке. Следуя указаниям инсталлятора проведите процесс установки. После того, как скопируются все файлы, необходимые для работы появится окно установщика софтовых пакетов для разработки Pack Installer. В данном установщике содержатся низкоуровневые библиотеки, Middleware, примеры программ, которые регулярно пополняются и обновляются.
Для начала работы с нашей платой нам необходимо установить ряд пакетов необходимых для работы и необходимо найти микроконтроллер, с которым мы будем работать. Так же можно воспользоваться поиском вверху окна. После того, как мы нашли наш МК кликаем на него и во второй половине окна и нам необходимо установить следующий перечень библиотек:
- Keil::STM32F0xx_DFP – полноценный пакет программного обеспечения для конкретного семейства микроконтроллеров, включающий в себя мануалы, даташиты, SVD-файлы, библиотеки от производителя.
- ARM::CMSIS – пакет Cortex Microcontroller Software Interface Standard, включающий в себя полный набор библиотек от ARM для поддержки ядра Cortex.
- Keil::ARM_Compiler – последняя версия компилятора для ARM.
После установки требуемых паков можно перейти к настройке IDE и нашего отладчика/программатора. Для этого нам необходимо открыть главное окно Keil и создать новый проект.
Для этого необходимо перейти в меню Project -> New uVision Project и выбрать папку, в которую сохраним наш проект.
После Keil спросит нас какой МК будет использоваться в проекте. Выбираем нужный нам МК и нажимаем ОК.
И вновь появится, уже знакомое нам, окно в котором мы можем подключить интересующие нас модули к проекту. Для нашего проекта понадобится два модуля:
- Ядро библиотеки CMSIS, в котором объявлены настройки, адреса регистров и многое другое из того что необходимо для работы нашего МК.
- Startup-файл, который отвечает за первоначальную инициализацию МК при старте, объявление векторов и обработчиков прерываний и многое другое.
Если все зависимости у подключаемых удовлетворены – менеджер будет нам сигнализировать об этом зеленым цветом:
После того как мы нажмем клавишу ОК мы можем приступать к созданию нашего проекта.
Для того, чтобы сконфигурировать параметры проекта и настроить наш программатор нужно правым кликом по Target 1 открыть соответствующее меню.
В главном меню проекта настраиваем параметр Xtal в значение 8.0 MHz. Данный параметр отвечает за частоту работы кварцевого осциллятора нашего МК:
Далее переходим к настройке нашего программатора/дебагер. Кликаем в этом же окне на вкладку Debug и выбираем в поле Use параметр ST-Link Debugger и переходим в настройки:
В настройках мы должны увидеть модель нашего ST-Link установленного на плате, его серийный номер, версию HW и IDCODE МК который будем прошивать:
Для удобства можно настроить параметр, отвечающий за то, чтобы МК сбрасывался автоматически после перепрошивки. Для этого нужно поставить галочку в поле Reset and Run.
После этого нужно настроить еще одну опцию, которая позволит нам писать русскоязычные комментарии к коду наших проектов. Нажимаем кнопку Configuration и в открывшемся меню в поле Encoding выбираем Russian Windows-1251.
Всё. Наша IDE и программатор готовы к работе!
В Keil имеется удобный навигатор по проекту, в котором мы можем видеть структуру проекта, необходимые для работы справочные материалы, в т. ч. те, которые мы уже скачали к себе на компьютер до этого (схема Discovery, datasheet, reference manual), список функций, использованных в проекте и шаблоны для быстрой вставки разных языковых конструкций языка программирования.
Переименуем папку в структуре проекта с Source Group 1 на App/User, таким образом обозначив то, что в данной папке у нас будут располагаться файлы пользовательской программы:
Добавим основной файл программы через навигатор проекта, выполнив команду Add New Item To Group “App/User”.
Необходимо выбрать из предложенного списка C File (.c) и назначить ему имя main.c:
Созданный файл автоматически добавится в структуру проекта и откроется в главном окне программы.
Что ж, теперь мы можем приступить к созданию нашей программы.
Первым делом, необходимо подключить к нашему исполняемому файлу заголовочный документ нашего семейства микроконтроллеров. Добавим в файл main.c строки следующего содержания, данная программа заставить попеременно моргать наши светодиоды:
/* Заголовочный файл для нашего семейства микроконтроллеров*/ #include "stm32f0xx.h" /* Тело основной программы */ int main(void) { /* Включаем тактирование на порту GPIO */ RCC->AHBENR |= RCC_AHBENR_GPIOCEN; /* Настраиваем режим работы портов PC8 и PC9 в Output*/ GPIOC ->MODER = 0x50000; /* Настраиваем Output type в режим Push-Pull */ GPIOC->OTYPER = 0; /* Настраиваем скорость работы порта в Low */ GPIOC->OSPEEDR = 0; while(1) { /* Зажигаем светодиод PC8, гасим PC9 */ GPIOC->ODR = 0x100; for (int i=0; i<500000; i++){} // Искусственная задержка /* Зажигаем светодиод PC9, гасим PC8 */ GPIOC->ODR = 0x200; for (int i=0; i<500000; i++){} // Искусственная задержка } }
После того, как мы написали нашу программу, настала пора скомпилировать код и загрузить прошивку в наш МК. Чтобы скомпилировать код и загрузить можно воспользоваться данным меню:
Команда Build (или горячая клавиша F7) скомпилирует код, и если не было никаких ошибок программе выведет в логе компиляции следующее сообщение о том, что ошибок и предупреждений нет:
Команда Load (или горячая клавиша F8) загрузит компилированный код в наш МК и автоматически отправит его на исполнение:
После загрузки кода мы увидим, как светодиоды начали мигать с равными временными промежутками.
Ура! Первый шаг в освоении микроконтроллеров STM32 мы сделали! В следующем уроке мы разберем что такое битовые и логические операции, как ими пользоваться и узнаем об одной очень полезной утилитке для работы с МК, ну а пока можем наслаждаться тем, как весело перемигиваются светодиоды на нашей плате Discovery. )
Список статей:
- Начинаем изучать STM32 или Управляем светом по-умному
- Начинаем изучать STM32: битовые операции
- Начинаем изучать STM32: Что такое регистры? Как с ними работать?
руководств по STM32 | Embedded Lab
Эти вводные и исчерпывающие учебные пособия по STM32 предоставлены Shawon Shahryiar , технологом, производителем оборудования, преподавателем и выпускником EEE Университета науки и технологий Ахсануллы, Дакка, чтобы обеспечить быстрое изучение программирования процессоров ARM и интерфейсов.
STM32 — перед началом работы
Микроконтроллеры на базе ARM от STMicroelectronics на базе ARM обладают более высокой плотностью ресурсов, чем любой другой обычный микроконтроллер. Они также являются высокоскоростными устройствами, обычно работающими на частоте 72 МГц и выше. Целью этого документа является рассмотрение некоторых часто задаваемых вопросов, касающихся STM32, до начала разработки приложений с их помощью.
Подробнее…
Знакомство с портом GPIO STM32
Порты ввода-вывода в STM32 обычно называются GPIOA, GPIOB и т. д. и имеют разрядность 16 бит. Выводы порта имеют несколько режимов работы, что делает их одновременно надежными и сложными. В этом руководстве мы обсудим, как сконфигурировать и настроить эти порты для операций ввода-вывода, и проиллюстрируем это на простом примере мигания светодиода.
Подробнее…
Портирование стандартной периферийной библиотеки ST (SPL) с помощью MikroC PRO для ARM
В этом руководстве рассказывается о ST SPL, наборе аппаратных библиотек, которые обеспечивают простой доступ к любому программисту STM32 ARM. Он поддерживает все периферийные устройства STM32 micro, такие как CAN, USB, ADC, таймеры и т. д. Короче говоря, это уровень аппаратной абстракции, полностью покрывающий STM32.
Подробнее…
Последовательная связь STM32
STM32 предоставляет аппаратные порты USART для последовательной связи. Как мы все знаем, последовательная связь является очень важным инструментом для отладки, подключения к внешнему оборудованию, такому как RFID, GPS, модемы GSM и т. д., а также для выполнения других задач, связанных со связью. Количество последовательных портов, доступных в STM32 micro, зависит от типа семейства устройств и самого устройства.
Подробнее…
Советы и рекомендации по программированию STM32
ST-Link 1 (также известный как ST-Link) и ST-Link v2 — это в основном одно и то же аппаратное обеспечение программатора/отладчика с некоторыми небольшими исключениями. ST-Link 2 имеет допуск 5 В для интерфейса JTAG, он имеет двухцветный светодиодный индикатор состояния, а также имеет отдельный программный интерфейс для микроконтроллеров STM8 в отличие от ST-Link 1. Существует также ISOL-версия ST-Link2, которая гальванически изолирует его от его цель с помощью оптоэлектроники.
Подробнее…
Внешнее прерывание STM32
Серия STM32F1xx представляет собой микроконтроллеры на базе ARM Cortex M3. Микроконтроллеры на базе Cortex M3 имеют сложную и в то же время простую в использовании систему прерываний, называемую вложенным векторным контроллером прерываний (NVIC). Это обеспечивает низкую задержку и высокую производительность. Есть несколько функций NVIC, и они обрабатываются компилятором. Наша работа состоит в том, чтобы просто наслаждаться молниеносной реакцией на прерывание благодаря NVIC.
Подробнее…
Внутренние компоненты STM32
Большинство из нас знает о сторожевых таймерах из предыдущего опыта работы с обычными 8-битными микроконтроллерами, такими как AVR и PIC. Однако, когда дело доходит до STM32, идея схемы сторожевого таймера дорабатывается. Параметры, доступные для часов, также улучшены в микроконтроллерах STM32. В этом посте мы увидим некоторые из них, поддерживающие внутреннее оборудование.
Подробнее…
Страниц: 1 2
Продолжить чтение…
1 2Далее »
Архивы учебных пособий по STM32 | Учебники по микроконтроллерам
Учебное пособие по STM32 0 451
Последовательный порт — это самый обычный канал связи между микроконтроллером и компьютером. Однако разные уровни напряжения и потеря порта RS-232 в современных компьютерах привели к использованию микросхем-преобразователей USB-TLL, таких как Ch440, CP2102 и т. д. Именно это происходит в NodeMCU ESP8266 и…
Подробнее »
Учебное пособие по STM32 0 1 749
Излишне говорить, что последовательный вывод является необходимым инструментом для отладки встроенных системных приложений. Размещение правильных сообщений в нужном месте поможет вам сэкономить часы на выяснении того, что пошло не так в вашем коде. Программисты Arduino хорошо знакомы с Serial.print() и его производными. Но как же…
Подробнее »
Учебное пособие по STM32 6 6 083
Я только что получил черную макетную плату STM32F407VET из Китая и был в восторге от возможных проектов, которые я могу построить с ее помощью. К моей кончине, информации о программировании платы не так много, поэтому мне пришлось искать ее самостоятельно. Этот пост для тех…
Подробнее »
Учебное пособие по STM32 0 2 531
Если вы хотите научиться делать свои собственные электронные устройства в домашних условиях, важно понимать, что вам понадобятся две вещи: микропроцессор и плата микропроцессора для его установки. В предыдущем посте мы научили вас программировать PIC16F84A, иногда известную как …
Подробнее »
Учебное пособие по STM32 3 17 771
Arduino прост в использовании, но это происходит за счет множества функций, наиболее яркой из которых является скорость. Следовательно, вы редко увидите Arduino во встроенных промышленных установках. Микроконтроллеры ARM Cortex-M — это недорогие энергоэффективные 32-разрядные устройства с частотой до 2 DMIPS/МГц. Это микроконтроллер выбора, если вы …
Подробнее »
Учебное пособие по STM32 Комментарии к последовательной связи STM32 Nucleo отключены 6 188
Отладка через последовательный порт — один из способов найти ошибки в коде. В этом уроке я покажу вам, как добавить функцию последовательной связи на вашу плату STM32 Nucleo.
Подробнее »
Учебное пособие по STM32 Комментарии отключены на входе и выходе с STM32 Nucleo 2 848
В предыдущем уроке нам удалось помигать светодиодом. На этот раз мы добавим кнопку, которая будет управлять подключенным светодиодом, и простой переключатель хлопков.
Подробнее »
Учебное пособие по STM32 Комментарии отключены на мигании светодиода с помощью STM32 Nucleo 16 049
В предыдущем уроке нам удалось создать нашу первую программу с платой STM32 Nucleo.