Создание проекта для STM32F103C8T6 в System Workbench for STM32
- Опубликовано в Статьи
Данная статья описывает быстрый способ создания проекта для недорогого микроконтроллера STM32F103C8T6 на отладочной плате в среде разработки System Workbench for STM32.
При попытке изучить работу с микроконтроллером я столкнулся с проблемой создания первого работающего проекта в среде System Workbench for STM32 без использования дополнительных средств, например STM32CubeMX.
Чтобы запустить программу нам понадобится:
- отладочная плата с микроконтроллером STM32F103C8T6
- UART TTL (3.3V) (не забываем что у нашего МК уровни — 3.3 V ) конвертер на базе микросхемы PL2303
- Среда разработки System Workbench for STM32
- Программа STM32 Flash loader demonstrator
И так начнем!
Необходимо запустить среду разработки System Workbench for STM32
Далее выбираем File-> New-> C++ Project. В открывшемся окне указываем название проекта (у нас test1). В Project type выбираем Executable->Ac6 STM32 MCU Project -> Ac6 STM32 MCU GCC. Нажимаем Next. В окне
Select configurations Оставляем все как есть, нажимаем Next. В Target Configuration выбираем вкладку Mcu, в списке Series указываем STM32F1, Mcu: STM32F103C8Tx. Нажимаем Next.
В окне Project Firmware configuration указывам Hardware Abstraction Layer (Cube HAL). При отсутствии необходимо загрузить, кликнув по кнопке Download target firmware. Далее нажимаем Finish.
У нас создан проект. Теперь попробуем его собрать: нажимаем Project-> Build All. Запустился процесс сборки. По окончанию процесса в Console мы увидим надпись Build Finished.
Стоит отметить, что во папке Debug появился файл test1.bin, который можно загрузить в микроконтроллер. Однако сейчас никакой наглядной работы программа выполнять не будет.
Добавляем минимальный функционал – мигание светодиодом на 13 ножке
Открываем файл test\src\ main.c. В нем указано следующее:
#include "stm32f1xx.h" int main(void) { for(;;); }
А мы заменим на код, указанный ниже:
#include "stm32f1xx.h" #include "stm32f1xx_hal.h" int main(void) { // объявляем инициализационную структуру, которая содержит все параметры для настройки периферийного устройства в виде переменных-членов структуры GPIO_InitTypeDef GPIO_InitStruct; HAL_GPIO_WritePin(GPIOC, GPIO_PIN_13, GPIO_PIN_SET); // устанавливает pin 13 в ЕДИНИЦУ // Параметр GPIO_PIN_SET: светодиод горит, GPIO_PIN_RESET: светодиод выключен /* Настраиваем GPIO pin : PC13 */ GPIO_InitStruct.Pin = GPIO_PIN_13; //строчка указывает какой пин настраиваем GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;//указывваем режим работы — ВЫХОД двухтактный (push-pull) GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW; // настраиваем скорость работы выхода (низкая скорость 2MHz) HAL_GPIO_Init(GPIOC, &GPIO_InitStruct); // указываем порт микроконтроллера с которым проводится настройка (GPIOC) int i = 0; for(;;) { //изменяет состояние pin на противоположное. Если было 0, то станет единица, и наоборот. HAL_GPIO_TogglePin(GPIOC, GPIO_PIN_13); HAL_Delay( i++ ); // Функция задержки Delay в миллисекундах. //Увеличение переменной i за цикл задает уменьшение частоты мерцания светодиода } }
Компилируем программу, берем прошивку (файл с расширением *.bin)в папке \Debug или \Release в зависимости от активной конфигурации на момент компиляции и прошиваем микроконтроллер, подаем на него питание и смотрим как мигает светодиод.