Быстрый старт с микроконтроллерами 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
7 лет назад

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

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

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

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

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

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

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

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

Profile Profile Profile Profile Profile
Vkontakte
Twitter

Язык сайта

Август 2020
Пн Вт Ср Чт Пт Сб Вс
 12
3456789
10111213141516
17181920212223
24252627282930
31  

© 2013-2020 MicroTechnics.ru