Компьютер на stm32 своими руками

Обновлено: 24.06.2024

Основные возможности таймеров

Кто в теме и знает возможности таймеров в AVR думаю поймут какие преимущества дает STM32. И они не ограничиваются таймерами. Контроллер прерываний поддерживает так называемые вложенные прерывания и позволяет более приоритетному прерыванию, прервать выполнение менее приоритетного, что позволяет не пропустить и обработать важные прерывания. Во многих случаях вместо прерываний от периферии возможно использование DMA (по русски ПДП - прямой доступ к памяти) который копирует данные из периферии в память или наоборот. Таким образом можно принимать и передавать данные по интерфейсам USART, SPI, I2C и др. максимально быстро и без "лишних" прерываний.
Система тактирования намного гибче чем у ATmega328.
Тактирование STM32F103C8T6 Clock. STM32 - замена Arduino. Автоматика. Программно можно выбрать источник тактирования - внутренний RC генератор HSI или внешний кварцевый. Присутствует умножитель частоты и несколько делителей, которые позволяют индивидуально задать частоты тактирования различных блоков МК, таких как ядро, периферийные шины APB1 и APB2, блоки USB и ADC (АЦП). Этим можно программно управлять во время работы МК, а не как у AVR где конфигурация задается фьюзами при прошивке.
Предусмотрена защита от сбоев работы внешнего кварцевого генератора и в случае нестабильной работы или вовсе прекращения, тактирование автоматически переключается на встроенный RC генератор HSI.
В микроконтроллер встроены часы реального времени (RTC) с возможностью тактирования от внешнего кварца с частотой 32768 Гц или внутреннего RC генератора LSI. У МК имеется специальный вывод для подключения батарейки питающей часы при отсутствии основного напряжения.

Разрабатывать программу можно в Arduino IDE, но как я написал выше, при этом не совсем рационально используются ресурсы микроконтроллера. Гораздо лучше разрабатывать программу в одной из IDE для STM32, позволяющей использовать библиотеки функций от STMicroelectronics.
Сперва я выбрал mikroBasic который показался мне простым и понятным (просто знаю бейсик), но как выяснилось, это не намного лучше Arduino IDE. Затем пробовал Keil, TrueSTUDIO, CooCox, EmBitz и др.
Наиболее простая и понятная IDE для начала на мой взгляд это EmBitz. Это простая и логичная среда, которая добавляет в проект все необходимые файлы включая библиотеки CMSIS и SPL. Остается только открыть файл main.с и написать код программы. В других перечисленных IDE с этим сложнее.

Дистрибутив EmBitz можно скачать с официального сайта. Устанавливается как любая другая программа и особенностей нет.

Ряд окон, появляющихся при первом запуске Необходимо выбрать первую строку с компилятором EmBitz.
Embitz_compiler. STM32 - замена Arduino. Автоматика.

Выбор файловых ассоциаций. Можно оставить вариант по умолчанию и файлы с EmBitz ассоциироваться не будут.
Embitz_fileassociate. STM32 - замена Arduino. Автоматика.
Чтобы начать разработку программы, следует создать проект.
Основные этапы создания проекта Сначала нужно приступить к созданию проекта.
Embitz_project_1. STM32 - замена Arduino. Автоматика.

Следует выбрать тип микроконтроллеров STMmicro-ARM и нажать GO.
Embitz_project_2. STM32 - замена Arduino. Автоматика.

В следующем окне нужно задать имя проекта и место размещения на диске.
Embitz_project_3. STM32 - замена Arduino. Автоматика.

Далее выбирается компилятор и настраиваются конфигурации. Нужно оставить то что по умолчанию и перейти к следующему шагу.
Embitz_project_4. STM32 - замена Arduino. Автоматика.

После нужно выбрать семейство МК. В данном случае это Cortex_M3 поскольку такое ядро у STM32F103C8T6.
Embitz_project_5. STM32 - замена Arduino. Автоматика.

После выбираем серию STM32F10x.
Embitz_project_6. STM32 - замена Arduino. Автоматика.

Далее в списке нужно выбрать STM32F103C8 или STM32F103CB. Они отличаются только размером памяти программ (64 и 128 КБ), но поскольку реально в C8 содержится 128 КБ, то разницы нет что выбрать.
Embitz_project_7. STM32 - замена Arduino. Автоматика.

В завершении создания проекта появятся несколько окон настройки отладки. Нужно оставить по умолчанию и закрыть окна кнопкой OK.
Embitz_project_8. STM32 - замена Arduino. Автоматика.
После создания проекта можно начать работу, открыв файл main.с где есть минимально необходимая часть кода.
Embitz_main. STM32 - замена Arduino. Автоматика.

Проект можно скомпилировать и принеобходимости запустить отладку (на скриншоте показаны кнопки панели инструментов производящие эти действия). Выполнение программы начинается с функции main, точнее перед этим выполняется очистка оперативной памяти и настройка тактирования так чтобы при частоте внешнего кварцевого генератора 8 МГц, частота ядра была номинальной и составляла 72 МГц.
Подробнее о том как это происходит Проще всего отследить последовательность выполнения программы аппаратным отладчиком ST-Link или подобным. Следует соединить плату с отладчиком через интерфейс SWD, подключить отладчик к USB порту компьютера и запустить отладку в IDE (кнопка с перечеркнутым жучком в красном кружке справа на панели инструментов).
Если все сделано правильно, появится окно с таким содержимым.
Embitz_init_1. STM32 - замена Arduino. Автоматика.

А после в IDE откроется файл startup_stm32f10x_md.S в котором отобразится текущая выполняемая строка с ассемблерным кодом, выполняемым при старте или сбросе микроконтроллера.
Embitz_init_2. STM32 - замена Arduino. Автоматика.

Чуть ниже расположен вызов функции SystemInit.
Embitz_init_3. STM32 - замена Arduino. Автоматика.

Нажав на F11 на клавиатуре можно выполнить ассемблерную инструкцию и перейти в функцию (откроется файл system_stm32f10x.c).
Embitz_init_4. STM32 - замена Arduino. Автоматика.

В функции производится инициализация и конфигурация системы тактирования микроконтроллера. В этой же функции вызывается функция SetSysClock.
Embitz_init_5. STM32 - замена Arduino. Автоматика.

В ней вызывается одна из функций настраивающая умножитель на требуемую частоту, в данном случае SetSysClockTo72 для настроки на 72 МГц.
Embitz_init_6. STM32 - замена Arduino. Автоматика.

Теперь произведем отладку этой программы. К боковому разъему SWD платы следует подключить аппаратный отладчик ST-Link.
Это выглядит так Stm32_st_link. STM32 - замена Arduino. Автоматика. Далее подключаем отладчик к USB порту компьютера и запускаем отладку в IDE (кнопка с перечеркнутым жучком в красном кружке справа на панели инструментов). Перед этим обязательно в выпадающем списке на панели инструментов должна быть выбрана конфигурация Debug и скомпилирован проект, потому что при выборе конфигурации Release из-за оптимизации кода будет нарушено соответствие номеров строк кода и скомпилированной прошивки.
По умолчанию выполнение программы начнется с ассемблерного файла startup_stm32f10x_md.S поскольку в нем располагается код выполняющийся сразу после сброса. Это не всегда удобно и чтобы отладчик останавливал программу (устанавливал скрытую точку останова) в начале функции main, следует открыть окно Debug interfase options (меню Debug -> Interfases) и для конфигурации Debug отметить Run to main().
Debug_interfase_options. STM32 - замена Arduino. Автоматика.

Отладка программы После запуска отладки программа в микроконтроллере начнет выполнятся под управлением отладчика и автоматически будет остановлена на первой строке кода в функции main. Желтая стрелка между номерами строк и кодом, показывает текущую выполняемую строку.
Embitz_debug_1. STM32 - замена Arduino. Автоматика.

Если несколько раз нажать на кнопку F10 дойдя до функции GPIO_Init и навести курсор мышки на структуру Init, то можно увидеть ее тип, адрес в памяти и содержимое полей.
Embitz_debug_2. STM32 - замена Arduino. Автоматика.

Более подробно о назначении кнопок клавиатуры, используемых при отладке можно увидеть в меню Debug.
Embitz_debug_3. STM32 - замена Arduino. Автоматика.

Далее нажимая кнопку F10 можно дойти до цикла while и при выполнении функции GPIO_SetBits светодиод будет гаснуть, а при выполнении GPIO_ResetBits начинать светится.

Сборка проекта и заливка прошивки в микроконтроллер В списке конфигураций на панели инструментов нужно выбрать Release и пересобрать проект.

compile.jpg STM32 - замена Arduino

compile.jpg STM32 - замена Arduino. Автоматика.

При отсутствии ошибок внизу окна будет показана информация о сборке.

compile_log_2.jpg STM32 - замена Arduino

compile_log_2.jpg STM32 - замена Arduino. Автоматика.

По факту получается, что базовая плата Blue Pill с чипом STM32F103C8T6 может быть приобретена менее чем за 2$ у друзей из поднебесной . К этому комплекту еще необходим программатор ST-Link V2, и как и для всего остального на него существует максимально дешевая китайская копия . Программатор понадобиться в первую очередь для записи программ и внутрисхемной отладки по интерфейсу JTAG с поддержкой, разработанного ARM протокола SWD (Serial Wire Debug).

Кроме использования ST-Link существует возможность записывать программы через выводы A9, A10 платы (ножки 30, 31 USART1 микроконтроллера), для этого понадобиться преобразователь USB-UART типа FTDI FT232RL или подобный.

Но, так как этот способ не полнофункциональный с точки зрения внутрисхемной отладки, в дальнейшем речь пойдет о прошивке именно через программатор ST-Link. Это развяжет нам руки в использовании всего функционала среды разработки. Подключение показано ниже, тут все просто — надо соединить соответствующие выводы: GND→GND; CLK→SWCLK; DIO→SWDIO; 3.3→3.3V

Прежде чем начать предметно разбирать Cube IDE я приведу составленную мной таблицу сравнения характеристик микроконтроллеров от различных базовых плат Arduino c STM32F103C8.

Во многом именно эти числа и побудили меня на изучение гораздо более производительной и функциональной платформы.

Итак, для успешного начала работы нам необходимо скачать установочный файл с официальной страницы CubeIDE на сайте ST. Для скачивания доступно несколько вариантов под Linux, macOS и Windows. Конкретно я загружал и устанавливал под форточку, но полагаю интерфейсы программы аналогичны для всех операционных систем.

На момент написания статьи доступна версия программы 1.3.0, что может нам говорить о том, что некоторые детские болезни ПО уже удалось преодолеть. Это к тому, что CubeIDE сравнительно новая программа, анонсированная в 2019 г., и поэтому у сообщества STM-щиков, естественно, есть настороженность по поводу наличия в ней багов и недоработок.

Кстати, после установки программа предложила себя обновить и после моего согласия версия получилась уже 1.3.1. И хотя я еще не дошел до чтения истории ревизий, могу предположить, что в данном случае это можно считать положительным моментом.

Итак, для создания нового проекта нам потребуется пройти по основному меню: File→New→STM32 Project

После этого мы попадем в меню выбора микроконтроллера и тут наиболее быстрый способ — это написать в строке поиска нужный нам чип, в данном случае STM32F103C8. После того как среда разработки найдет его, в окне появится краткое описание и некоторые параметры его производительности и наличие внутренних модулей.

После нажатия на Next появиться окно с возможностью присвоить название, выбрать рабочий путь проекта, а так же выбрать опции проекта. Для первых шагов пункты опций можно оставить по умолчанию.

Далее IDE может спросить нас об открытии кодогенератора STM32CubeMX, возражать не имеет смысла, он в последствии будет нашим лучшим помощником.

И после этого будет создан наш первый проект, окно будет выглядеть примерно так, и главную площадь будет занимать собственно наш программируемый чип. Графическое представление именно то, что мне особенно понравилось в программировании STM-ок через эту среду.

Первым делом, нам нужно объяснить МК откуда им будет получено тактирование во время работы. На платах Blue Pill установлен кварцевый резонатор с частотой 8 MHz, он уже подключен к выводам PD0, PD1. Чтобы обозначить это для IDE, в разделе System Core заходим в RCC (Reset and clock conrol) выбираем высокоскоростное тактирование (HSE) и далее кварцевый резонатор. После этого соответствующие ноги МК будут подсвечены зеленым с указанием их назначения.

В микроконтроллере STM32F103 есть блок фазовой автоподстройки частоты (PLL) он служит для создания основной частоты работы микропроцессора путем умножения частоты внешнего или внутреннего источника тактирования на программно определяемый множитель.

Для завершения настройки нам необходимо проверить во вкладке Clock Configuration, что частота HSE установлена в 8 MHz, а частота работы МК составляет 72 MHz.

Для первого нашего проекта мы по классике помигаем установленным на плате светодиодом. Он подключен к выводу PC13. Для его настройки правой кнопкой по выводу выберем GPIO_Output (вывод общего назначения_выход). В разделе настройки GPIO присвоим пользовательское название вывода (User Label) как LED13. В таблице конфигурации GPIO проверяем внесенные изменения.

Теперь дадим команду кодогенератору сформировать файлы проекта на основании тех настроек, что мы сделали.

После этого мы уже можем писать свою программу в файле main.c. Там будут вставлены функции для настройки выводов и тактирования:

Теперь в файле main.c находим функцию main(void) и бесконечный цикл в ней while (1). Это и есть место для нашей первой программы.

Уроки STM32

В уроке получим минимальную информацию об отладочной плате STM32F103C8T6. Добавим к плате компоненты необходимые для загрузки программ в микроконтроллер (прошивка FLASH).

В наших уроках будем использовать отладочную плату на базе микроконтроллера STM32F103C8T6.

Часто ее называют ”Blue pill”, в переводе – синяя таблетка или пилюля.

STM32F103C8T6

STM32F103C8T6

STM32F103C8T6

По моей партнерской ссылке плата стоит всего 175 руб.

Технические характеристики платы STM32F103C8T6.

В последующих уроках мы будем подробно изучать функциональные возможности микроконтроллера и платы. Сейчас коротко, только общие характеристики.

Микроконтроллер STM32F103C8T6,
ядро ARM Cotrex M3
Число разрядов 32 бита
Максимальная частота 72 мГц
Объем памяти программ (FLASH) 64 / 128 кБайт
Объем памяти данных (RAM) 20 кБайт
Выводы 37
Таймеры общего назначения 3
Расширенный таймер с ШИМ управления двигателем 1
Системный таймер 1
Сторожевые таймеры 2
UART 3
SPI 2
I2C 2
CAN 1
USB 1
Контроллеры прямого доступа к памяти 7
АЦП 2 АЦП, 10 каналов, время преобразования 1 мкс
Часы реального времени есть
Аппаратный модуль расчета CRC есть
Напряжение питания микроконтроллера 2 … 3,6 В
Напряжение питания платы 5 В
Ток потребления до 50 мА
Размеры платы 53 x 22,5 мм

Выводы микроконтроллера непосредственно соединены с выводами платы.

Распиновка STM32F103C8T6

Сейчас обращаем внимание на следующее:

  • Микроконтроллер питается от напряжения 3 В и высокие уровни выходных и входных дискретных сигналов у него тоже 3 В. Но часть выводов, обозначенных на схеме закрашенной точкой, допускают при использовании в качестве входов подключение сигналов с уровнями 5 В. Так называемые толерантные к 5 В входы. Остальные входы рассчитаны на напряжение не более напряжения питания, обычно 3 В. Повышение этого напряжения свыше 4 В приведет к повреждению микроконтроллера.
  • При использовании в качестве выходов, выводы микроконтроллера допускают вытекающий и втекающий ток не более 20 мА. Рекомендуется не более 8 мА. Но 3 вывода, отмеченные восклицательным знаком, могут быть использованы только в схемах с втекающим током и не более 3 мА.
  • К выводу PC13 подключен светодиод общего назначения. Светится он при низком уровне сигнала.

Система питания платы.

Схема цепей питания выглядит так.

Схема питания STM32F103C8T6

Узел вырабатывает напряжение 3,3 В, необходимое для питания микроконтроллера. Используется стабилизатор XC6204.

Он получает питание 5 В либо с USB порта, либо с вывода платы 5 V. Эти цепи соединены непосредственно без защитного диода. Поэтому использовать плату с одновременным питанием от этих двух источников нельзя.

Ток потребления микроконтроллера зависит от частоты тактирования и использования периферийных устройств.

Частота, мГц Ток потребления, мА
Все периферийные устройства включены 72 50
48 36
36 29
24 20
16 15
8 9
Все периферийные устройства выключены 72 33
48 25
36 20
24 14
16 11
8 7

Я привел эту таблицу, чтобы вы поняли насколько важно выбирать оптимальную частоту тактирования, особенно в приложениях критичных к энергопотреблению. Микроконтроллеры STM32 позволяют это делать гибко и оперативно.

Вот полная принципиальная схема платы.

Схема отладочной платы STM32F103C8T6

Загрузка программы в микроконтроллер с помощью системного бутлоадера.

Четырех контактный разъем на торце платы предназначен для загрузки программ с помощью аппаратного программатора, например StLink. Но в микроконтроллере существует программный загрузчик, позволяющий зашить программу через UART 1 (выводы A9 и A10). Он называется системным загрузчиком и зашивается в память микроконтроллера на этапе производства.

За режим работы платы отвечают 2 желтые перемычки.

Это обычный режим работы. При включении или сбросе запускается программа из FLASH.

Перемычки STM32F103C8T6

При таком положении перемычек запускается системный загрузчик. Это режим прошивки FLASH-памяти микроконтроллера.

Перемычки STM32F103C8T6

При таком положении перемычек программа загружается в ОЗУ. Используется на этапе отладки для сохранения ресурса программирования FLASH-памяти.

Соответствие состояния входов BOOT и режимов работы микроконтроллера STM32. Перемычка BOOT0 на рисунках расположена сверху.

BOOT1 BOOT0 Режим запуска программы
0 0 Внутренняя FLASH
1 0
0 1 Системная память
1 1 Внутреннее ОЗУ

Таким образом, процесс программирования через системный бутлоадер выглядит так:

  • подключить выводы A9 и A10 к COM порту компьютера;
  • установить перемычку BOOT0 в режим запуска из системной памяти;
  • сбросить микроконтроллер;
  • запустить на компьютере программу прошивки FLASH микроконтроллера;
  • вернуть перемычки в состояние запуска программы из FLASH;
  • сбросить микроконтроллер.

Во первых в современных компьютерах не часто встречается COM порт. Во вторых слишком много манипуляций с перемычками и сбросом. Утомительное занятие.

Я упростил этот процесс так.

Плату подключил к компьютеру через мост USB-UART. Я использовал PL2303, но можно применить любой другой модуль, даже плату Ардуино со встроенным преобразователем интерфейсов. Например, Arduino Nano. Надо только соединить вход сброса с землей для того, чтобы микроконтроллер не влиял на сигналы преобразователя интерфейса CH340.

Вместо перемычки BOOT0 я установил кнопку. Еще одну кнопку припаял на сигнал сброса. Штатной кнопкой сброса пользоваться неудобно.

Вот моя схема отладочного модуля.

Схема прошивки STM32F103C8T6

Резистор 10 кОм припаян между выводами трех контактного разъема PLS, установленного вместо перемычки BOOT0.

Питание плата STM32 получает от моста USB-UART. На нем надо установить перемычку питания в положение 5 В.

У меня все это выглядит так.

Прошивка STM32F103C8T6

Прошивка STM32F103C8T6

Прошивка STM32F103C8T6

Пользоваться достаточно удобно. Когда кнопки не нажаты, плата работает в обычном режиме.

  • Нажимаю и удерживаю кнопку ПРОШИВКА, кратковременно нажимаю кнопку СБРОС.
  • Загружаю программу во FLASH микроконтроллера.
  • Отпускаю кнопку ПРОШИВКА.
  • Нажимаю кнопку СБРОС.

Все это делается пальцами одной руки.

В следующем уроке будем устанавливать программное обеспечение для разработки приложений STM32, создадим и загрузим в микроконтроллер первую тестовую программу.


План действий

mbed — это онлайн среда разработки. Чтобы воспользоваться ею, необходимо просто зарегистрироваться. Пользоваться средой можно абсолютно бесплатно.

Итак, вот последовательность наших действий:

2. Выбор платы


…и выберите свою плату (в нашем случае это Nucleo-F401RE).


Откроется страница выбранной платы. Справа будет кнопка добавления платы в список имеющихся у вас.

3. Создание проекта


Теперь можно открыть среду разработки…


…и создать новую программу.

4. Работа в среде


5. Сборка проекта и прошивка платы

Что дальше?

Теперь вы умеете создавать программы, транслировать их в файл прошивки для вашей аппаратной платформы и прошивать. Пользуясь документацией, вы можете теперь писать полноценные программы, управляющие не только светодиодами. В вашем распоряжении классы для работы с аналоговыми входами, UART, АЦП, ШИМ и многое другое.

Самодельная и доступная альтернатива продаваемому программатору от STMicroelectronics. Является выдержкой и компиляцией нескольких статей и схем найденных в интернете. Реализация в минимально возможном форм-факторе.

Cover Image

У любого разработчика встраиваемого софта должен быть программатор для устройств которые он использует. В моём случае микроконтроллеры фирмы STMicroelectronics, а так же Milandr (российские процессоры на ядре ARM).

Покупка данного девайса весьма затратна, особенно если сравнивать с себестоимостью компонентов - печатной платы и радиодеталей.

Решено было сделать программатор самостоятельно. За основу легли схемы отладочных плат для различных МК, в итоге получился полнофункциональный отладочный модуль и не только для stm32, но и для stm8 и даже миландровских чипов (проверено пока только на К1986ВЕ92, но думаю и другие тоже будут шиться и отлаживаться).

  • программирование и отладка STM32;
  • программирование и отладка STM8;
  • программирование и отладка ARM Миландр.

Сам программатор можно рассмотреть на фото выше. Провода растянутые по плате это лишь последующие доработки связанные с отсутствием необходимого светодиода (слева) и с необходимостью программировать платы без подачи на них питания (справа).

Ядром является контроллер stm32f103, который и используется во всех отладочных платах. На его входах и выходах устройства, я имею ввиду разъем для подключения программируемого микроконтроллера, установлены диоды для защиты от статики, диоды выбраны достаточно маленькие, но легко доступные и без особых сложностей впаиваемыми, даже людьми с ослабленным зрением, сам я впрочем и не жалуюсь со своими единичками на обоих глазах.

В качестве разъема для подключения к компьютеру используется microUSB, выбор пал только лишь из-за его современности по сравнению с его мини братом. У меня же самого на плате стоит именно мини, когда собирал заложенного микро не было в наличии.

После сборки и проверки на короткое замыкание подключаем устройство к компьютеру и видим что ничего не происходит, разве что программатор определяется как неизвестное устройство, причина в отсутствии прошивки.

Для обеспечения работы необходимо зашить по в микроконтроллер, для этого нам понадобиться usb-uart переходник, бутлоадер и утилита для прошивки.

Если с утилитой и переходником проблем на возникает, то с загрузчиком все несколько иначе - так как сама прошивка в контроллерах на отладочных платах заблокирована от считывания и вытащить у меня не получилось. Благо живем в современном мире, где есть интернет.

Решение было найдено на одном из многочисленных форумов - бинарник прошивки. Правда была проблема, после прошивки контроллера программатор определялся, но работать не хотел, зато спокойно прошивался через st-link utility, было решено подчистить файл прошивки, удалив все лишнее, оставив только сам загрузчик.

Как можно догадаться все удалось и теперь загрузчик можно взять здесь.

Для заливки используем разъем P1, выводы 3 и 4 которого замыкаем вместе, переводя микроконтроллер в режим загрузки по usart1. Подключаем uart переходники подаем питание на плату программатора, можно через usb разъем.

В утилите выбираем используемый последовательный порт и следуем остальным инструкциям. Этот процесс в картинках описывать нет смысла - все довольно тривиально.

После окончания прошивки отключаем все вспомогательные устройства и подключаем программатор к компьютеру, он должен нормально определиться. Теперь осталось обновить прошивку программатора с помощью st-link utility.

Можно пользоваться и наслаждаться работой собранного собственными руками программатора.

Данный программатор хорошо себя зарекомендовал, на протяжении года пользования. Отлично работал при -40 о С в климатической камере, помогая отлаживать одно из разрабатываемых устройств, а так же дважды посетил вместе со мной Камчатку, где отлично себя чувствовал в суровых климатических условиях.

Читайте также: