Быстрый старт с микроконтроллерами STM32F4. Создание проекта.

Давно, даже очень давно, не было новых статей на нашем статье, так что пришло время наверстывать 🙂 Сегодня мы положим начало изучению STM32F4. И, наверное, начнем с создания нового проекта для этих контроллеров, хотя не хотел я, честно говоря, про это писать статью, так как новый проект тут создается, в принципе, так же как и для STM32F103 (про это тут). Но все-таки бывает, что именно с STM32F4 возникают некоторые трудности, так что, все-таки, рассмотрим этот процесс в подробностях!

Так что, запускаем Keil, создаем новый проект – Project – New uVision Project. Сохраняем новый проект в какой-нибудь папке, и затем нам предложат выбрать используемый микроконтроллер. Что ж, выбираем, пусть это будет STM32F407VG:

Создание нового проекта

Готово, в появившемся диалоговом окне тыкаем «Да» и к нам в проект добавится первый файл – startup_stm32f4xx.s. Также как и раньше, мы будем использовать библиотеки CMSIS и Standard Peripheral Library, но, естественно,  уже для контроллеров  STM32F4xx. Так что надо их обязательно скачать и добавить нужные файлы в наш пока еще пустой проект. Кстати не раз слышал от разных людей, что попадаются какие то «не такие» библиотеки для F4, и проект даже простейший не собирается. Сам я с таким не сталкивался, тем не менее, вот проверенные библиотеки, которые я сам использую:

Итак, скачали, все готово, теперь добавляем файлы в проект. На картинке видно, какие понадобятся:

Новый проект в Keil

Ну вот и закончена подготовка, теперь создадим новый .c файл, в котором и будет наш код. Идем в File – New, в Keil’е открывается пустой файл, жмем File – Save as и сохраняем его под именем test.c, например. Не забываем при сохранении указать расширение файла (.c). Файл создали, отлично, но надо его еще и в проект наш добавить. Ну, собственно, в этом ничего сложного нету 🙂 В этот файл запишем тестовую пустую программу:

/***************************************************************************************/
#include "stm32f4xx.h"
#include "stm32f4xx_rcc.h"
#include "stm32f4xx_gpio.h"


/***************************************************************************************/
int main()
{
	while(1)
	{
		__NOP();
	}
}


/***************************************************************************************/

Почти все уже готово, осталось заглянуть в настройки проекта – Project – Options for target… Открывается окошко с множеством вкладок, нас тут интересуют лишь несколько. Открываем вкладку C/C++ и в поле Define прописываем:

  • USE_STDPERIPH_DRIVER,STM32F4XX
Настройки проекта

Ну и внизу в поле Include Paths надо добавить пути абсолютно ко всем файлам, включенным в проект. После выполнения этого шага можно давить на F7 (Build), и проект соберется без ошибок и предупреждений. Как видите, ничего сложного!

Но вообще я лично делаю несколько иначе. Смотрите в чем минус такого подхода. Вот мы скачали себе куда-то библиотеки CMSIS и SPL, добавили файлы из этих папок, прописали пути к файлам, все круто. НО! Проект не соберется на другом компьютере, поскольку пути все абсолютные, то есть указывают на конкретные папки на вашем компьютере. И на другой машине придется фактически заново выполнять действия по созданию нового проекта. Это огромнейший минус. Поэтому я обычно создаю отдельную папку для нового проекта, в ней создаю подпапки для CMSIS, SPL и других используемых библиотек и в эти папки запихиваю все файлы, которые мне понадобятся в каждом конкретном проекте. Вот, например, создадим папку STM32F4_Test для нашего нового проекта и в ней следующие папки:

Структура нового проекта

В папки CMSIS и SPL я засунул все необходимые файлы, которые мы добавляли, создавая проект, в начале статьи. Теперь запускаем Keil, создаем новый проект и сохраняем его в нашу подпапку Project, чтобы все файлы проекта лежали в одном месте и не устраивали хаос.

Проект создан, теперь, как и раньше просто добавляем в него все файлы из папок STM32F4_CMSIS и STM32F4_SPL. В папку Source запихиваем наш тестовый .c файл с функцией main() и его тоже добавляем в проект. Осталось настроить настройки =) Все то же самое – в поле define прописываем:

  • USE_STDPERIPH_DRIVER,STM32F4XX

В Include Paths:

Пути к файлам проекта

Собираем проект – ошибок нет, полет нормальный! В принципе в итоге получили то тоже самое, но теперь проект будет без проблем сразу собираться на любом другом компьютере, а это очень удобно и полезно ) Абсолютно все файлы проекта теперь лежат рядом, в одной папке, а пути стали относительными и их не придется менять.

На этом то, собственно все, в ближайшее время что-нибудь поделаем для программирования STM32F4, обязательно, так что до скорого!;)

Полный проект из примера статьи – empty_project

Поделиться!

Подписаться
Уведомление о
guest
29 Комментарий
старее
новее большинство голосов
Inline Feedbacks
View all comments
Ярослав
Ярослав
7 лет назад

Все делал как у Вас написано. Вылезает ошибка:

Progect 1.axf: Error: L6218E: Undefined symbol main (referred from rtentry2.o).

Подскажите, пожалуйста, в чем дело?

DrWin
DrWin
7 лет назад

Хорошая статья все очень хорошо описано. Получилось с первого раза.

Andrey
Andrey
7 лет назад

Очень благодарен за ваши труды!
Все получилось, правда не с первого раза).

Roman
Roman
6 лет назад

добрый день! можете выложить проект целиком в архиве?

Roman
Roman
Reply to  Aveal
6 лет назад

Aveal, большее вам спасибо. помогли.

Константин
Константин
6 лет назад

Спасибо огромное, за Ваш пинок.
PS ну то есть СТАРТ.

Yevgeniy_F
Yevgeniy_F
6 лет назад

Я тоже сделал всё как Вы сказали, но компилятор ругается:
Build target ‘Target 1’
assembling startup_stm32f4xx.s…
compiling stm32f4xx_gpio.c…
stm32f4xx.h(7116): error: #5: cannot open source input file “stm32f4xx_conf.h”: No such file or directory
compiling stm32f4xx_rcc.c…
stm32f4xx.h(7116): error: #5: cannot open source input file “stm32f4xx_conf.h”: No such file or directory
compiling LED.c…
stm32f4xx.h(7116): error: #5: cannot open source input file “stm32f4xx_conf.h”: No such file or directory
Target not created

Yevgeniy_F
Yevgeniy_F
6 лет назад

Включил, всё равно не помогает

Yevgeniy_F
Yevgeniy_F
6 лет назад

Я включил этот файл, но всё равно не работает

Ярослав
Ярослав
6 лет назад

Очень полезная статья и крайне познавательный ресурс))))

Юрий
Юрий
5 лет назад

Доброго времени суток! за статью огромное спасибо на просторах инета ничего лучше не нашел!
одно но, я вот начинающий и был бы весьма признателен если бы посоветовали какую нибудь книгу по языку С и С++ максимально близкую к программированию ARM на KEIL., возможно у меня не достаточно опыта, я программировал PIC в ССS и там надо сказать С сильно отличается… в плане обращения к портам и тд..сам синтаксис команд. заранее огромное спасибо!

Юрий
Юрий
5 лет назад

Build target ‘Target 1’
linking…
.\target.axf: Error: L6218E: Undefined symbol main (referred from rtentry2.o).
Not enough information to list image symbols.
Finished: 1 information, 0 warning and 1 error messages.
“.\target.axf” – 1 Error(s), 0 Warning(s).
Target not created
Дает такую вот ошибку может я что-то не до понял…
Пожалуйста помогите.

Юрий
Юрий
5 лет назад

Большие спасибо я разобрался.

Павел
Павел
5 лет назад

Думаю хорошей идеей будет выкладывать к публикации исходник проекта в архиве

Дмитрий
Дмитрий
5 лет назад

Build target ‘STM’
compiling Main.c…
linking…
.\Objects\rabota.axf: Error: L6218E: Undefined symbol assert_param (referred from stm32f30x_gpio.o).
Not enough information to list image symbols.
Finished: 1 information, 0 warning and 1 error messages.
“.\Objects\rabota.axf” – 1 Error(s), 0 Warning(s).
Target not created.

Помогите советом? В чем может быть загвоздка? Использовал CMSIS и startup от Keil 5. SPL, conf.h перепробовал разные : как от этого сайта, так и с сайта stm

Дмитрий
Дмитрий
4 лет назад

Здравствуйте, уважаемые знатоки) Не подскажите ли, как сделать так, чтоб данные файлы (соответсвующие задействованной периферии процессора) подгружались в проект автоматически (как сделано к примеру в CooCox) и не надо было маяться и все это вручную добавлять, путь к папкам указывать и тому подобное. Примочка, предусмотренная в Keil для этого, называемая “Manage Run-Time Environment”, подгружает какие-то свои библиотеки. С ними конечно тоже все работает, но при этом пропадает универсальность, да и написаны они немного по другому. Подскажите, есть ли способ?

Дмитрий
Дмитрий
4 лет назад

Или может я не совсем понимаю, что такое этот hal?)

Присоединяйтесь!

Profile Profile Profile Profile Profile
Vkontakte
Twitter

Язык сайта

Июнь 2020
Пн Вт Ср Чт Пт Сб Вс
« Май    
1234567
891011121314
15161718192021
22232425262728
2930  

© 2013-2020 MicroTechnics.ru