Урок №4 HelloWorld

Сегодня мы разберем создание проекта с помощью приложений 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. Если все выполнено правильно, должен замигать синий светодиод.

На видео приведена реализация поставленной задачи:

play-sharp-fill

На этом урок не заканчивается. Теперь выполним эту же задачу, но средствами операционной системы реального времени 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».

 

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *