Давно, даже очень давно, не было новых статей на нашем сайте, так что пришло время наверстывать... Сегодня мы положим начало изучению STM32F4. И, наверное, начнем с создания нового проекта для этих контроллеров, хотя не хотел я, честно говоря, про это писать статью, так как новый проект тут создается, в принципе, так же как и для STM32F103 (про это тут). Но все-таки бывает, что именно с STM32F4 возникают некоторые трудности, так что, все-таки, рассмотрим этот процесс в подробностях.
Время традиционной вставки: поскольку компания STMicroelectronics прекратила поддержку библиотеки SPL, которая использовалась в этом курсе, я создал новый, посвященный работе уже с новыми инструментами, так что буду рад видеть вас там - STM32CubeMx. Кроме того, вот глобальная рубрика по STM32, а также статья на смежную тему из нового курса: STM32. Быстрый старт с STM32CubeMx.
Так что, запускаем Keil, создаем новый проект – Project - New uVision Project. Сохраняем новый проект в какой-нибудь папке, и затем нам предложат выбрать используемый микроконтроллер. Что ж, выбираем, пусть это будет STM32F407VG:
Готово, в появившемся диалоговом окне тыкаем "Да" и к нам в проект добавится первый файл – startup_stm32f4xx.s. Так же как и раньше, мы будем использовать библиотеки CMSIS и Standard Peripheral Library, но, естественно, уже для контроллеров STM32F4xx. Так что надо их обязательно скачать и добавить нужные файлы в наш пока еще пустой проект. Кстати не раз слышал от разных людей, что попадаются какие то "не такие" библиотеки для F4, и проект даже простейший не собирается. Сам я с таким не сталкивался, тем не менее, вот проверенные библиотеки, которые я сам использую:
- Скачать STM32F4 SPL - Standard Peripheral Library
- Скачать STM32F4 CMSIS - CMSIS
Итак, скачали, все готово, теперь добавляем файлы в проект. На картинке видно, какие понадобятся:
Ну вот и закончена подготовка, теперь создадим новый .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
Все делал как у Вас написано. Вылезает ошибка:
Progect 1.axf: Error: L6218E: Undefined symbol main (referred from rtentry2.o).
Подскажите, пожалуйста, в чем дело?
Возможно файл, в котором функция main находится, не добавлен в проект. Надо к нему путь указать в настройках, ну и в дерево проекта добавить.
Хорошая статья все очень хорошо описано. Получилось с первого раза.
Отлично! Спасибо )
Очень благодарен за ваши труды!
Все получилось, правда не с первого раза).
Спасибо!=)
добрый день! можете выложить проект целиком в архиве?
Вот, набросал по-быстрому - http://rusfolder.com/37349753
Aveal, большее вам спасибо. помогли.
Спасибо огромное, за Ваш пинок.
PS ну то есть СТАРТ.
Я тоже сделал всё как Вы сказали, но компилятор ругается:
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
Файл stm32f4xx_conf.h надо включить в проект
Включил, всё равно не помогает
Я включил этот файл, но всё равно не работает
Путь к этому файлу надо прописать в настройках проекта
Очень полезная статья и крайне познавательный ресурс))))
Спасибо )
Доброго времени суток! за статью огромное спасибо на просторах инета ничего лучше не нашел!
одно но, я вот начинающий и был бы весьма признателен если бы посоветовали какую нибудь книгу по языку С и С++ максимально близкую к программированию ARM на KEIL., возможно у меня не достаточно опыта, я программировал PIC в ССS и там надо сказать С сильно отличается... в плане обращения к портам и тд..сам синтаксис команд. заранее огромное спасибо!
Не совсем так)
С он один и тот же язык, просто у разных микроконтроллеров разные регистры, соответственно, разные библиотеки. Тут лучше всего скачивать на конкретное семейство контроллеров даташит и изучать.
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
Дает такую вот ошибку может я что-то не до понял...
Пожалуйста помогите.
Скорее всего файл, в котором функция main находится, не добавлен в проект. Надо к нему путь указать в настройках, ну и в дерево проекта добавить.
Большие спасибо я разобрался.
Думаю хорошей идеей будет выкладывать к публикации исходник проекта в архиве
В комментариях была ссылка, перенес в конец статьи.
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
В настройках проекта надо указать USE_STDPERIPH_DRIVER
Здравствуйте, уважаемые знатоки) Не подскажите ли, как сделать так, чтоб данные файлы (соответсвующие задействованной периферии процессора) подгружались в проект автоматически (как сделано к примеру в CooCox) и не надо было маяться и все это вручную добавлять, путь к папкам указывать и тому подобное. Примочка, предусмотренная в Keil для этого, называемая "Manage Run-Time Environment", подгружает какие-то свои библиотеки. С ними конечно тоже все работает, но при этом пропадает универсальность, да и написаны они немного по другому. Подскажите, есть ли способ?
Или может я не совсем понимаю, что такое этот hal?)
HAL - это в принципе аналог SPL, а SPL по сути это набор файлов, по 2 для каждого периферийного модуля.
Отлично, смог "по старинке" на spl/cmsis прошить контроллер, когда сам делал - застревало на systeminit. Думал уже придется изучать HAL.