Программирование STM32F4. Создание нового проекта в Keil.

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

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

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

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

Скачать STM32F4 SPL — Standard Peripheral Library

Скачать STM32F4 CMSISCMSIS

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

Новый проект в 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

Понравилась статья? Поделись с друзьями!

Программирование STM32F4. Создание нового проекта в Keil.: 29 комментариев
  1. Все делал как у Вас написано. Вылезает ошибка:

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

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

    • Возможно файл, в котором функция main находится, не добавлен в проект. Надо к нему путь указать в настройках, ну и в дерево проекта добавить.

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

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

  4. Доброго времени суток! за статью огромное спасибо на просторах инета ничего лучше не нашел!
    одно но, я вот начинающий и был бы весьма признателен если бы посоветовали какую нибудь книгу по языку С и С++ максимально близкую к программированию 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
    Дает такую вот ошибку может я что-то не до понял…
    Пожалуйста помогите.

    • Скорее всего файл, в котором функция main находится, не добавлен в проект. Надо к нему путь указать в настройках, ну и в дерево проекта добавить.

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

  7. 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

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

    • HAL — это в принципе аналог SPL, а SPL по сути это набор файлов, по 2 для каждого периферийного модуля.

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *