Вот я и подобрался к освоению новых для меня микроконтроллеров STM32. Благодаря своей 32-разрядной ARM архитектуре они конечно наголову опережают своих 8-ми битных собратьев, устанавливаемых на популярные платы Arduino, такие как ATmega328, ATmega32u4, ATmega2560, но, к огромной радости конечного потребителя, стоимость базовых моделей чипов оказывается даже ниже чем у AVR.
По факту получается, что базовая плата 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). Это и есть место для нашей первой программы.
Ее код может, например, выглядеть так:
HAL_GPIO_WritePin(LED13_GPIO_Port, LED13_Pin, GPIO_PIN_SET);
HAL_Delay(200);
HAL_GPIO_WritePin(LED13_GPIO_Port, LED13_Pin, GPIO_PIN_RESET);
HAL_Delay(200);
Это оказалось возможно благодаря тому, что библиотека HAL имеет в своем составе функцию задержки Delay с заданием аргумента миллисекундах.
После этого можно собрать весь проект через основное меню Project→Build All
И, если все сделано правильно, компилятор сообщит об успехе. Следующим шагом будет загрузка написанной программы в микроконтроллер.
Для этого первым делом нужно установить перемычки на плате в положение программирования flash памяти.
После этого нажимаем зеленую кнопку Run main.c и наш скомпилированный код отправится через ST-Link в память МК.
Естественно, при этом программатор должен быть подключен в разъем USB. Если все прошло удачно, то ST-Link помигает своим светодиодом и IDE доложит о успешной загрузке/проверке, и в т.ч. выведет информацию о подключенном программаторе.
Записанный код сразу начнет работать, и мы увидим мигание LED каждые 200мс. После этого перемычки можно привести в положение загрузки из внутренней Flash, и тогда после перезагрузки светодиод опять будет мигает, иначе МК будет ожидать новой загрузки.
В общем, на этом основная часть статьи заканчивается, светодиод мигает, а я с Вами получил первый практический и теоретический опыт в программировании крайне популярного микроконтроллера STM32.
В дополнение расскажу пару полезных моментов для общего развития:
- Программатор ST-Link содержит в себе такой же чип STM32F103C8T6. Его прошивку можно обновить средствами IDE в разделе Help→ST LINK Upgade
2. Для точного понимания куда чего подключено на Blue Pill лучше всего воспользоваться схемой:
3. Для определения возможных функций выводов МК удобно пользоваться картой выводов:
С наилучшими пожеланиями
Ваш, TDA
30.05.2020