Top.Mail.Ru

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

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

Время традиционной вставки: поскольку компания STMicroelectronics прекратила поддержку библиотеки SPL, которая использовалась в этом курсе, я создал новый, посвященный работе уже с новыми инструментами, так что буду рад видеть вас там - STM32CubeMx. Кроме того, вот глобальная рубрика по STM32, а также статья на смежную тему из нового курса: STM32. Быстрый старт с STM32CubeMx.

Так что, запускаем 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

30 комментариев
Старые
Новые
Межтекстовые Отзывы
Посмотреть все комментарии
Ярослав
Ярослав
11 лет назад

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

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

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

DrWin
DrWin
11 лет назад

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

Andrey
Andrey
11 лет назад

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

Roman
Roman
11 лет назад

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

Roman
Roman
Ответ на комментарий  Aveal
11 лет назад

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

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

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

Yevgeniy_F
Yevgeniy_F
10 лет назад

Я тоже сделал всё как Вы сказали, но компилятор ругается:
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
10 лет назад

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

Yevgeniy_F
Yevgeniy_F
10 лет назад

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

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

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

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

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

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

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
Дает такую вот ошибку может я что-то не до понял...
Пожалуйста помогите.

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

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

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

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

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

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

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

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

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

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

Александр
Александр
3 лет назад

Отлично, смог "по старинке" на spl/cmsis прошить контроллер, когда сам делал - застревало на systeminit. Думал уже придется изучать HAL.

30
0
Оставьте комментарий! Напишите, что думаете по поводу статьи.x