Войти
A+ A A-

Создание проекта для 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 в зависимости от активной конфигурации на момент компиляции и прошиваем микроконтроллер, подаем на него питание и смотрим как мигает светодиод.