Урок 53
System Workbench
Создаём новый проект
Сегодня мы продолжим работу с бесплатной средой программирования System Workbench for STM32.
На прошлом занятии мы пробовали использовать готовый проект примера, а сегодня уже попытаемся создать свой собственный проект и помигать светодиодами. Начинать всегда лучше с простого, иначе материал не усвоится, по себе знаю.
Для примера возьмём плату STM32F767-Nucleo. С данной платой мы уже знакомы из обзора.
Ну что ж, начнём!
Запустим MS Cube, создадим проект, выбрав наш микроконтроллер (нажмите на картинку для увеличения размера)
В RCC выбираем вот такую опцию
А в SYS вот такие
TIM1 выбран ввиду того, что что на Systick будет ругаться генератор кода, если мы будем использовать FreeRTOS.
Мигать мы будем сразу десятью светодиодами, как нельзя кстати оказалась под рукой светодиодная матрица. Для удобства подключения мы будем использовать порты в разъёме, расположенные рядом с общим проводом GND. Не забываем ни в коем случае про токоограничивающие резисторы. У меня на 680 ом
Включим данные ножки на выход
Перейдём в Clock Configuration, подключим там резонатор и включим всё на максимум (нажмите на картинку для увеличения размера)
Зайдём в Project -> Settings и настроим наш будущий генерируемый проект, немного добавив значение стека и кучи
У вас будет, соответственно, другой путь. Нажмём «ОК».
Сгенерируем проект и закроем диалог, так как вход в проект в случае использования WB (я так буду в дальнейшем для экономии времени и места называть System WorkBench) невозможен
Запустим System Workbench. Щёлкнем правой кнопкой мыши в левом окне и выберем пункт «Import»
Выделим «Existing Project into Workspace» и нажмём «Next»
В «Select root Directory» через обзор выберем папку со вновь созданным проектом. Проект должен будет появиться в списке и пометиться галкой. Жмём «Finish»
Откроем слева дерево проекта, найдём там файл main.c и поставим туда фокус ввода (кликнем мышкой, чтобы установился курсор). Это помогает компилятору в случае наличия в дереве проектов в дереве проектов простым способом понять, что данный проект для него является текущим и ему работать именно с ним.
Попробуем скомпилировать проект. Для этого выберем в меню Project -> Build Project. Если проект нормально соберётся, то мы увидим внизу вот такую картину
Если мы увидим ошибку в виде ругательства на FPU, то у нас скорей всего не обновлён Workbench. В этом случае лучше ничего не править и не выдумывать, а просто его обновить через пункт меню «Help -> Check for Updates».
Теперь попробуем зайти в отладку. Первый раз всё-таки лучше запускать исполнение именно так. Если будут проблемы, то надо удалить в свойствах проекта все конфигурации отладки. Если появится диалог с выбором программатора, то нужно будет его выбрать
Ну а дальше всё, как на прошлом занятии.
Теперь в main.h для удобства добавим макросы для наших светодиодов. Я вставлю из заранее заготовленного файла macro.txt
/* USER CODE BEGIN Includes */
#define LED01 GPIO_PIN_5
#define LED02 GPIO_PIN_6
#define LED03 GPIO_PIN_7
#define LED04 GPIO_PIN_14
#define LED05 GPIO_PIN_15
#define LED06 GPIO_PIN_12
#define LED07 GPIO_PIN_13
#define LED08 GPIO_PIN_9
#define LED09 GPIO_PIN_11
#define LED10 GPIO_PIN_14
#define LED01PORT GPIOA
#define LED02PORT GPIOA
#define LED03PORT GPIOA
#define LED04PORT GPIOD
#define LED05PORT GPIOD
#define LED06PORT GPIOF
#define LED07PORT GPIOF
#define LED08PORT GPIOE
#define LED09PORT GPIOE
#define LED10PORT GPIOF
#define LED01SET() HAL_GPIO_WritePin(LED01PORT, LED01, GPIO_PIN_SET)
#define LED02SET() HAL_GPIO_WritePin(LED02PORT, LED02, GPIO_PIN_SET)
#define LED03SET() HAL_GPIO_WritePin(LED03PORT, LED03, GPIO_PIN_SET)
#define LED04SET() HAL_GPIO_WritePin(LED04PORT, LED04, GPIO_PIN_SET)
#define LED05SET() HAL_GPIO_WritePin(LED05PORT, LED05, GPIO_PIN_SET)
#define LED06SET() HAL_GPIO_WritePin(LED06PORT, LED06, GPIO_PIN_SET)
#define LED07SET() HAL_GPIO_WritePin(LED07PORT, LED07, GPIO_PIN_SET)
#define LED08SET() HAL_GPIO_WritePin(LED08PORT, LED08, GPIO_PIN_SET)
#define LED09SET() HAL_GPIO_WritePin(LED09PORT, LED09, GPIO_PIN_SET)
#define LED10SET() HAL_GPIO_WritePin(LED10PORT, LED10, GPIO_PIN_SET)
#define LED01RESET() HAL_GPIO_WritePin(LED01PORT, LED01, GPIO_PIN_RESET)
#define LED02RESET() HAL_GPIO_WritePin(LED02PORT, LED02, GPIO_PIN_RESET)
#define LED03RESET() HAL_GPIO_WritePin(LED03PORT, LED03, GPIO_PIN_RESET)
#define LED04RESET() HAL_GPIO_WritePin(LED04PORT, LED04, GPIO_PIN_RESET)
#define LED05RESET() HAL_GPIO_WritePin(LED05PORT, LED05, GPIO_PIN_RESET)
#define LED06RESET() HAL_GPIO_WritePin(LED06PORT, LED06, GPIO_PIN_RESET)
#define LED07RESET() HAL_GPIO_WritePin(LED07PORT, LED07, GPIO_PIN_RESET)
#define LED08RESET() HAL_GPIO_WritePin(LED08PORT, LED08, GPIO_PIN_RESET)
#define LED09RESET() HAL_GPIO_WritePin(LED09PORT, LED09, GPIO_PIN_RESET)
#define LED10RESET() HAL_GPIO_WritePin(LED10PORT, LED10, GPIO_PIN_RESET)
/* USER CODE END Includes */
Теперь вставим код бегущих огней в бесконечный цикл из того же файла macro.txt
/* USER CODE BEGIN 3 */
LED10RESET();
LED01SET();
HAL_Delay(100);
LED01RESET();
LED02SET();
HAL_Delay(100);
LED02RESET();
LED03SET();
HAL_Delay(100);
LED03RESET();
LED04SET();
HAL_Delay(100);
LED04RESET();
LED05SET();
HAL_Delay(100);
LED05RESET();
LED06SET();
HAL_Delay(100);
LED06RESET();
LED07SET();
HAL_Delay(100);
LED07RESET();
LED08SET();
HAL_Delay(100);
LED08RESET();
LED09SET();
HAL_Delay(100);
LED09RESET();
LED10SET();
HAL_Delay(100);
}
/* USER CODE END 3 */
Теперь можно прошивать через обычную кнопку «Run».
Предыдущий урок Программирование МК STM32 Следующий урок
Купить отладочную плату можно здесь STM32F767ZI-Nucleo
Смотреть ВИДЕОУРОК
Здравствуйте, в самом начале статьи возник вопрос и не отпускал до самого конца: зачем в настройках RCC в кубе, вы выбрали BYPASS Clock Source?
Посмотрел видео — вопрос отпал