Сегодня мы разберем создание проекта с помощью приложений SW4STM32 и STM32CubeMX на примере классической программы HelloWorld для микроконтроллеров — мигание светодиодом. Сначала мы заставим мигать светодиод по обычной, однопоточной технологии написания программ для микроконтроллеров, а затем, выполним ту же задачу с помощью операционной системы реального времени — FreeRTOS.
Запустите STM32CubeMX, выберите New Project и в появившемся окне в левой колонке фильтра микроконтроллеров установите галочки, как показано на скриншоте:
Выбранные галочки сверху-вниз означают: ядро М3, серия F1, линейка F103, корпус 64-х выводной LQFP. В правом окне внизу появятся отфильтрованные результаты поиска, согласно выбранным критериям. Выберите STM32F103RB с Flash памятью 128 килобайт и RAM 20 килобайт, именно такой микроконтроллер стоит на борту системной платы CyberSteak’а. Далее нажмите Start Project.
В созданном проекте в правом окне отобразится выбранный микроконтроллер. Выполним основные настройки периферии. Для подключения кварцевого резонатора, установленного на системной плате, раскройте вкладку RCC в окне дерева элементов периферии и в поле High Speed Clock (HSE) выберите Crystal Ceramic Resonator. В окне отображения микроконтроллера выводы, подключенные к кварцевому резонатору изменят цвет на зеленый, уведомляя нас о том, что эти выводы больше нельзя использовать для других нужд (почти для всех выводов STM32 можно выполнить переназначение — remapping). Для возможности использования программатора по протоколу SWD раскройте вкладку SYS и в поле Debug выберите Serial Wire. Соответствующие выводы контроллера изменят цвет на зеленый. Результат — на скриншоте:
На системной плате имеется светодиод подсоединенный к выводу 13 порта С. Настроим этот вывод как выход. Наведите указатель мыши на вывод PC13, нажмите левую кнопку для вызова контекстного меню конфигурирования вывода и выберите GPIO_Output. Вывод изменит цвет на зеленый. Теперь нажмите правую кнопку мыши на этом выводе и выберите Enter User Label для присвоения произвольного имени, например BLUE_LED:
Перейдем на вкладку Clock Configuration для настройки тактирования периферии. К счастью на этой страшной, на первый взгляд, вкладке все уже настроено. Мы лишь поменяем частоту тактирования на максимальную для этого микроконтроллера — 72 MHz. В поле HCLK установите значение 72 и нажмите Enter:
Мастер настройки тактирования выдаст сообщение о том, что с указанными настройками (делителями и умножителями) такую частоту не получить и предложит пересчитать:
В результате система установит следующие настройки коэффициентов:
Далее на вкладке Configuration в поле System основного окна нажмите кнопку GPIO для настройки портов ввода-вывода:
В окне Pin Configuration отображаются выводы, которым были присвоены значения на вкладке Pinout, отличающиеся от значений в сброшенном состоянии микроконтроллера (reset state):
Выбрав пин PC13 отобразится дополнительная настройка его конфигурации. Присвойте для GPIO output level значение High, чтобы светодиод в момент запуска программы не светился, т.к. его анод подключен к плюсу питания 3.3 вольта, а катод — через токоограничительный резистор — к выводу PC13. Для значения GPIO mode присвойте значение Output Push Pull — двухтактный выход. Остальные параметры оставьте без изменения, нажмите Ok.
Вот и все настройки. Остается сохранить проект и сгенерировать код инициализации микроконтроллера. Перейдите в настройки проекта в меню Project, выбрав пункт Settings, появится окно:
Во вкладке Project в поле Project Name укажите название проекта. В Project Location укажите путь к папке проекта на компьютере. В Toolchain/IDE укажите среду разработки SW4STM32. Остальные настройки оставим без изменений.
Во вкладке Code Generator отметьте пункты как показано на скриншоте:
В проект будут добавлены только необходимые файлы из библиотеки, а пользовательский код будет сохранен при регенерации проекта в STM32CubeMX. Нажмите Ok.
Теперь сгенерируем код. Зайдите в меню Project и нажмите Generate Code. Появится сообщение системы об успешной генерации кода и будет предложено открыть проект:
Делать мы этого не будем. Закройте окно и откройте интегрированную среду разработки SW4STM32. Нам необходимо импортировать проект из STM32CubeMX. Для этого в меню File нажмите Import:
В появившемся окне выберите Existing Projects into Workspace и нажмите Next. В следующем окне укажите папку, в которую генерировали проект в STM32CubeMX. В окне Projects должен появиться проект. Выберите его и завершите импортирование, нажав Finish.
Основные процедуры по генерированию кода инициализации микроконтроллера и создание проекта в среде программирования выполнены.
Запрограммируем функционал. В дереве проекта в папке «Src» откройте файл main.c и промотайте до функции while(1) — основного цикла программы.
Для сохранности пользовательского кода после регенерации проекта в STM32CubeMX код необходимо вставлять между комментариев типа
/* USER CODE BEGIN */
/* USER CODE END */
После строки с комментарием /* USER CODE BEGIN 3 */ добавьте функцию смены состояния пина из библиотеки аппаратных абстракций HAL: HAL_GPIO_TogglePin(GPIOC, BLUE_LED_Pin);
и добавьте задержку: HAL_Delay(200); //200ms
Должно получиться так:
Сохраните проект и выполните компиляцию, нажав . Запрограммируйте CyberSteak, как было показано в предыдущем уроке, выбрав файл *.bin в папке Debug. Если все выполнено правильно, должен замигать синий светодиод.
На видео приведена реализация поставленной задачи:
На этом урок не заканчивается. Теперь выполним эту же задачу, но средствами операционной системы реального времени FreeRTOS.
Откройте наш проект в STM32CubeMX и в левом окне конфигурации промежуточного программного обеспечения MiddleWares активируйте FREERTOS, установив галочку.
Разверните вкладку SYS и измените источник для временной базы Timebase Source с SysTick на TIM1.
Откройте вкладку Configuration и в поле MiddleWares нажмите кнопку FREERTOS для конфигурирования.
В открывшемся окне зайдите во вкладку Tasks and Queues для того, чтобы создать задачу (независимый поток) мигания светодиодом:
Система о нас уже позаботилась и создала одну задачу DefaultTask с параметрами по умолчанию. Ее и будем использовать. Ничего не меняя, нажмем Ok. Больше в STM32CubeMX сегодня делать нечего. Сохраним проект и сгенерируем код.
Открыв SW4STM32 вы увидите, что проект изменился: появилась папка MiddleWares, содержащая операционную систему, в папках Src и Inc тоже добавилось несколько файлов для работы с операционной системой. Файл main.c претерпел изменения по части инициализации операционной системы, а также, добавилось описание новой функции StartDefaultTask, которую мы сгенерировали в STM32CubeMX. Прокрутив до функции главного цикла while(1) вы увидите, что код, который мы написали раньше между комментариев /* USER CODE BEGIN 3*/… /* USER CODE END 3*/ остался без изменений.
Удалите этот код из главного цикла, потому что до этого места программа при работе операционной системы никогда не дойдет. Код мигания светодиодом добавим в функцию StartDefaultTask, являющейся одним (пока) из многочисленных независимых потоков операционной системы. Найдите ее и впишите код смены состояния пина с помощью HAL-функции из предыдущего примера в бесконечный цикл:
Здесь osDelay(100); означает задержку в 100 ms. Сохранив проект, скомпилировав его и записав в CyberSteak, вы увидите, что синий светодиод начнет мигать точно так же, как и раньше, только средствами операционной системы FreeRTOS.
Данный пример показывает нам, что операционная система настроена правильно и все работает должным образом.
Для понимания работы операционной системы, о том что такое независимые потоки и как все устроено рекомендуем обратиться к документам «The FreeRTOStm Reference Manual» и «Mastering the FreeRTOStm Real Time Kernel».