Итак, компилятор установлен, пришло время создания первого проекта. Сразу думаю надо обсудить библиотеки, которые мы будем использовать в нашей работе с STM32.
Во-первых, CMSIS. Это замечательная библиотека, единый стандарт для всех Cortex. CMSIS позволяет легко переносить код с одного контроллера с ядром ARM Cortex на любой другой. Короче, в CMSIS стандартизирован доступ к разной периферии разных микроконтроллеров STM. Библиотека состоит из нескольких файлов, которые нам надо будет добавить в проект, но об этом немного позднее.
Время традиционной вставки: поскольку компания STMicroelectronics прекратила поддержку библиотеки SPL, которая использовалась в этом курсе, я создал новый, посвященный работе уже с новыми инструментами, так что буду рад видеть вас там - STM32CubeMx. Кроме того, вот глобальная рубрика по STM32, а также статья на смежную тему из нового курса: STM32. Быстрый старт с STM32CubeMx.
Во-вторых, библиотека Standard Peripheral Library. В SPL очень удобно реализована настройка всевозможных периферийных модулей, а также есть множество функций для работы с ними же. Эту библиотеку достаточно подробно будем изучать при обсуждении какой-либо конкретной периферии в будущих статьях. А сейчас кратенько рассмотрим ее структуру в общих чертах. Для любого модуля микроконтроллера есть 2 файла: заголовочный файл и, собственно, файл с исходным кодом. Так что, создавая проект для работы, например, с АЦП, мы будем включать в проект два файла из Standard Peripheral Library.
Возможно, кто-то сомневается, стоит ли использовать эту библиотеку. Речь, конечно о SPL (по поводу CMSIS думаю ни у кого нет особых сомнений). Так вот, я для себя однозначно решил, что стоит. Потому что ни к чему изобретать велосипед, библиотека написана и очень удобна, гораздо удобнее, чем напрямую ковыряться в многочисленных регистрах. НО! При всем этом, надо все-таки иметь представление какой регистр за что отвечает, и как с ними работать. Для этого не лишним будет просматривать раздел даташита на конкретную периферию при работе с ней.
Итак, скачиваем CMSIS и Standard Peripheral Library (SPL) и шагаем дальше:
- скачать CMSIS - STM32_CMSIS
- скачать Standard Peripheral Library - STM32_SPL
Теперь, наконец-то, переходим к нашему первому проекту. Создадим отдельную папку для проектов, и в ней будем создавать по папке для каждого отдельно взятого проекта. Если этого не делать, то в итоге получится просто каша из файлов. А если проект большой, то есть включает большое количество файлов, то лучше сгруппировать файлы в группы и разложить по разным подпапкам. Итак, запускаем Keil!
Идем в Project -> New uVision Project. Появляется окошко для выбора папки, в которой будет создан проект. Также надо дать нашему проекту имя. Пусть будет, например, test, это будет просто тестовый проект. Скриншот приводить не буду, тут все и так понятно. Теперь нам надо выбрать микроконтроллер. Я остановил свой выбор на STM32F103CB:
Жмем OK, появляется диалоговое окно, жмем "Да", и вот первый шаг позади.
В левой части видим окошко Project. Там будут отображаться все файлы, добавленные в наш проект. Я обычно переименовываю группы, которые по умолчанию называются Target 1 и Source Group 1 в STM32 и StartUp соответственно. Сразу же добавим еще пару групп – для библиотек, а также для наших файлов, в которых будет собственно сам код. У меня после модификации все выглядит вот так:
Конечно, такой вариант не является единственно верным, просто так удобнее, а пока проект содержит немного файлов, пары папок вполне хватит. Идем дальше. Создадим пустой файл .c: File - New .
Появляется пустой файл, жмем File - Save As и называем наш первый файл test.c. Готово! Теперь нужно добавить все необходимые файлы в проект. Дважды тыкаем на папку CMSIS в дереве проекта и добавляем следующие файлы:
- core_cm3.c
- system_stm32f10x.c
И вот они, первые грабли, с которыми я столкнулся. Проект отказался собираться без файла stm32f10x_conf.h. А в моей скачанной CMSIS он напрочь отсутствовал. Поэтому качаем его отдельно и тоже добавляем в проект (если качали библиотеки по ссылкам выше, то там уже есть этот файл). Далее открываем этот файл, находим строчку #include "stm32f10x_type.h" и комментируем ее. Этот файл мы использовать не будем. Такие действия лично мне пришлось осуществить, чтобы успокоить компилятор, возможно, у меня просто оказалась битая библиотека. Мне было проще поправить имеющуюся под себя, чем искать какие то другие варианты 🙂
Теперь аналогично добавим файлы библиотеки SPL. Пока они нам не понадобятся, но пусть будут. Добавим, например stm32f10x_rcc.c и подхватим includ’ом stm32f10x_rcc.h (файлы, содержащие все связанное с тактированием различной периферии). И наконец добавим наш созданный файл test.c в папку Source Files в дереве проекта.
Далее идем в Project - Options for target… Тут несколько вкладок для различных настроек. Идем во вкладку Output и ставим галку Create HEX File. Теперь наша цель – вкладка C/C++. В поле define пишем следующее: USE_STDPERIPH_DRIVER. Без этого проект не соберется. Осталось в Include Paths добавить пути ко всем(!) файлам, включенным в проект. Получим примерно следующее:
И вот тут еще одни грабли. Все папки, которые добавляем в Include Paths не должны содержать пробелов. Так что мои Header Files, Source Files и Project Files плавно превращаются в Header_Files, Source_Files и Project_Files.
Еще один шаг к созданию проекта сделан, в принципе, осталось совсем чуть-чуть. В файл test.c закинем следующий тестовый код, который абсолютно ничего не делает:
#include "stm32f10x.h" #include "stm32f10x_rcc.h" int main() { while(1); }
Осталось лишь нажать F7 (build) и проект соберется. Все отлично, но мы наблюдаем непредвиденные warning’и. Хорошо написанная программа не должна их содержать, так что будем править. К счастью, это потребует от нас минимум усилий. Итак:
incompatible redefinition of macro "HSE_Value"
Чтобы это не вылетало, открываем stm32f10x_conf.h, ищем:
#define HSE_Value ((u32)8000000) /* Value of the External oscillator in Hz*/
И беспощадно комментируем эту строку. Вот и все... Если у кого-то вылезло:
warning: #1-D: last line of file ends without a newline
то надо сделать так, чтобы файл test.c не заканчивался строкой кода. Проще говоря, ставим курсор после последней скобки в этом файле и жмем Enter. Warning сразу же пропадает.
Ну вот, первые шаги сделаны. Мы создали пустой проект, который абсолютно ничего не делает полезного (бесполезного впрочем тоже 🙂 ). Но для начала уже неплохо, в следующих статьях будем заполнять проект кодом. Кстати, если у кого-нибудь возникли какие-либо трудности при создании проекта, пишите в комментарии, не стесняйтесь! И не пропустите статью нашего курса по STM32CubeMx, описывающую аналогичный процесс создания базового проекта.
Зделал всё как написано . вылетела ошибка
1234.c: Error: C3065E: type of input file '1' unknown
Проверь все пути ко всем файлам на наличие пробелов
А в дефайнах проекта там не надо писать что-то типа USE_STDPERIPH_LIBRARY?
В настройках проекта в "define" прописываем -USE_STDPERIPH_DRIVER
А можно ещё узнать где брать эти библиотеки, например на F4
Добавлю вечером ссылку на библиотеку для F4, а так в интернете все что угодно можно найти)
О, как боевик прочитала:) так эмоционально, только фраза "находим строчку #include «stm32f10x_type.h» и комментируем ее нафиг" - остановила:) что значит комментируем? почему не удалить?
можно и удалить)
ок, а комментировать - это как? что-то добавить или изменить назначение?
Тут это почти то же самое что и удалить, ставим в начале строки "//" и этой строки как будто бы нет, мы ее видим, а программа - нет
если не удаляем, а прячем, - может ли она пригодиться?
Теоретически да, поэтому и не удаляем
Build target 'STM 32'
assembling startup_stm32f10x_md_vl.s...
startup_stm32f10x_md_vl.s: Error: A1071E: Cannot open listing file 'startup_stm32f10x_md_vl.lst': Invalid argument
Target not created
Наверняка где-то в пути к файлу пробелы или русские буквы
Разобрался. Файл был для асемблера, в настройках переделал на С
Камрады, напишите, по возможности, статью про задание частоты тактового генератора, после PIC совсем не понимаю как выставлять частоты в STM32 и как использовать wizard в Keil, уверен, что у кого то есть уже такой опыта. Спасибо!
Постараюсь написать, но не уверен, что в ближайшее время получится..
В наборе МК при создании проекта у меня нет тулсета ARM, только C51. При этом в File->Device Database все присутствует. Есть ли советы как починить?
У Кейла есть разные IDE - для C51 и для ARM. Видимо это та версия, которая для С51
Большое спасибо, за статью!
Но есть одно но.
Когда запускаешь проект в режиме "Use ST-Link Debugger" (в качестве примера). То стоит установить галочку не только на вкладке "Debug", но и на вкладке "Utilies" стоит выбрать требуемое устройство (в рамках данного примера это будет ST-Link Debugger).
Подскажите пожалуйста, как настроить комбинации горячих клавиш Ctrl+C, Ctrl+V.
Заранее спасибо!
Если это про Кейл вопрос - то Edit - Configuration - Shortcut Keys =)
Ух, сразу споткнулся на "сразу же добавим еще пару групп" - а где они добавляются-то?
Правой кнопкой в окне Project (там где все файлы) и потом в меню Add group
А у меня вот такая ошибка вылезла:
Build target 'STM32'
compiling test.c...
linking...
test.axf: Error: L6320W: Ignoring --entry command. Cannot find argument 'Reset_Handler'.
test.axf: Warning: L6320W: Ignoring --first command. Cannot find argument '__Vectors'.
Target not created
Кейл?
Keil mVision4
Точно для ARM Keil?
точно для ARM, такой же как на рисунке на этой страничке
Файл startup.s включен в проект?
блин..), спасибо, извините
=))
Помогите плиз.
Всё ругается
.\CMSIS\Device\ST\STM32L1xx\Include\stm32l1xx.h(247): error: #67: expected a "}"
SDIO_IRQn = 45, /*!< SDIO global Interrupt */
А что за контроллер? Кидай проект, я посмотрю )
Здравствуйте 🙂
Делал по аналогии с вашим мануалом под контроллер stm32f30 .
После попытки компиляции :
.\second.axf: Error: L6320W: Ignoring --entry command. Cannot find argument 'Reset_Handler'.
.\second.axf: Warning: L6320W: Ignoring --first command. Cannot find argument '__Vectors'.
Not enough information to list image symbols.
Not enough information to list the image map.
Finished: 2 information, 1 warning and 1 error messages.
🙁
Делаю по аналогии с контроллером stm32f30.
Была ошибка, связанная с отсутствием startup_stm32f30x.S. Добавил в проект.
При компиляции выдает 53 ошибки в startup_stm32f30x.S
.......
startup_stm32f30x.S(9): error: A1159E: Label missing from line start
startup_stm32f30x.S(37): error: A1137E: Unexpected characters at end of line
Помогите , пожалуйста!
А какой Кейл?
uVision 5 под arm
Аа.. тогда даже не знаю, что сказать, сам пятым не пользуюсь, и вообще постоянно люди жалуются, что в пятом что-то не работает. Ставь uVision 4))
Я скачал новую версию Keil с офф. сайта и там в списке нет stm32. Что я не очень понял как тогда начать?
Это точно Кейл для ARM процессоров?
Спасибо. Да вроде уже разобрался. Теперь качнул MDK-ARM v4.73. До этого был С51 v9.52. Но об этом в статья явно не писано :)) Я как новичек не знал, что все так разделено!!!
Почему-то в скаченной с офф.сайта MDK-ARM v4.73 теперь вообще ни чего нет в списке.
Все снес, папку удалил, реестр почистил, поставил заново MDK-ARM v4.73 скаченный с офф.сайта - ура заработало!!
Отлично !))
Немного критики.
На мой взгляд подход "боремся с этим неправильным кейлом и неправильной CMSIS" сам по себе неправильный. Гораздо лучше использовать современные инструменты от STM. Есть такая шикарная вещь как STM32CubeMX. Она генерирует готовый проект для кейла с CMSIS и библиотечными функциями для периферии. При этом можно в любой момент поменять конфигурацию и перегенерировать проект, не потеряв пользовательский код программы. А для отладочных плат типа DISCOVERY автоматически настраиваются подключения периферии на плате, и уже случайно не попадешь на занятый пин. Да еще и графический режим назначения ног, настройки тактирующих частот и основных интерфейсов. Код эта штука дает валидный, комментированный и разлаженный по файлам и группам. Изучать ARM так в миллион раз проще, чем ковырять совершенно непонятный новичку файлы.
Ну, во-первых, на момент создания статьи Cube еще был в зародышевом состоянии в головах специалистов ST.
Во-вторых, даже на сегодняшний день Cube - сырой проект, который требует доработок и исправлений.
В-третьих, как раз-таки новичок, используя сразу Cube, не получает толком никаких знаний о структуре проекта, о построении программы и тому подобных вещах. Таким образом, использование STM32, в целом, начинает напоминать использование недоинструментов типа Arduino.
Кроме того, библиотека HAL, выпускаемая как замена SPL, от поддержки которой ST отказались, заточена под легкость и доступность программирования, а не под оптимизацию и "качественность" получаемого программного продукта.
И все вышесказанное, опять же на фоне того, что продукты реально сырые на данный момент, что, в принципе и понятно, поскольку работа над ними в самом разгаре.
Есть несколько основных подходов, по большому счету - работа непосредственно с регистрами микроконтроллера, в результате человек, занимающийся программированием получает весь спектр знаний о конкретной периферии, с которой работает. Компромиссом является использование библиотек типа SPL - программист также получает необходимые знания, понимает работу устройств/контроллеров/программ в целом. Третьим подходом является как раз продукты типа CubeMX - "нажал на ножку, поставил пару галок, получил отдельный файл со всей инициализацией, работает и фиг с ним". И если для разбирающихся людей это не проблема, то для новичков такой способ изучения просто фатален.
На дату написания статьи я и правда не посмотрел. За это извиняюсь.
Я все таки считаю, что следует использовать простые инструменты для решения каждой конкретной задачи. Знать основы, понимать регистры и прочее - это конечно обязательно. Но совсем необязательно ковырять код на уровне близкому к ассемблеру, что бы писать эффективный код. В современных реалиях железо стоит дешевле программиста. Поэтому выгоднее взять более производительную железку, чем отказаться от использования готовых библиотек. Даже при разработке серийной продукции.
Я все к чему: лучше учить правильно пользоваться высокоуровневыми инструментами,но давать выжимку из низкоуровневой области и HAL подчеркивая важные моменты. А писать эффективный и качественный код (что на уровне регистров, что на уровне библиотек) кто-то может, а кто-то нет. Это больше связано со складом ума.
А Cube мне например очень понравился в части настройки тактирующих частот с графическим пояснением и визуализации расположения и предназначения выводов. Весьма полезные вещи при ознакомлении даже с новым камнем, а не только с линейкой STM32. При этом для правильной настройки нужны те же знания, что и для работы с SPL , только применять их легче, и ничего не пропустить и не забыть проще.
А умение правильно подшаманить CMSIS практических навыков не дает.
PS Я все равно очень уважаю Ваш труд по написанию данного цикла статей. И не в коем случае не хочу сказать, что статья плохая. Написанное мною выше основано на личном опыте преподавания и обучения. Может это будет Вам полезно.
Простите, если я резко чересчур высказался ) Просто тема наболевшая, часто очень попадаться стали программисты, которые ничего не знают толком и, что самое плохое, ничего не хотят учить и понимать.
Приветсвую!
Поставил mVision 5.0. Там немножко инчаче создаётся проект. Например, выбор устройства (device) возможен только после добавления устройтсва через "Pack Installer" (справа в поле поиска нужно ввести интересующий контроллер, в статье - STM32F103CB), а после выбора контроллера слева нужно установить DFP (Device Family Pack) - после этого можно создавать проект, т.к. устройство будет доступно для выбора.
На данный момент мне не понятно, как работает "Pack Installer" вот в каком отношении: через "Pack Installer" было видоно, что ,библиотека ARM::CMSIS установлена. Вопрос, нужно ли явно искать и добавлять в проект файлы этой библиотеки или они будут автоматически добавляться во время сборки.... Если всё будет работать автоматически, то "Pack Installer" - удобная штука!
Добрый день!
А можно как-то обойтись без библиотек и насколько это будет сложно?
А то не хочется разбираться в чужих библиотеках.
CMSIS - базовая библиотека, без нее врядли, а без SPL вполне можно - вручную выставлять в регистрах биты.
Спасибо. Всё с первого раза получилось))
Доброго времени суток. Могли бы кто-нибудь из здесь присутствующих подсказать, откуда можно скачать CMSIS - STM32_CMSIS и Standard Peripheral Library — STM32_SPL для STM32F051R8?
помогите пожалуйста с такими ошибками:
FCARM FILE CONVERTER V2.50
Completed 36 File (s), Ratio 100%
compiling pro ...
pro: Error: C4065E: type of input file 'pro' unknown
pro: Error: C4079E: ArmCC command with no effect
". \ pro.axf" - 2 Error (s), 0 Warning (s).
Target not created
.\Example.axf: Error: L6200E: Symbol SystemInit multiply defined (by system_stm32f4xx_1.o and system_stm32f4xx.o).
Подскажите, пожалуйста, в чем причина этой ошибки? У меня 7 их вылазит при построении.
Похоже, что в проект включены два одинаковых файла - system_stm32f4xx_1.c и system_stm32f4xx.с
мда. Стартую не с нуля и стартануть не могу. Хоть бы написали, как установить IDE, как добавить в неё библиотеки микроконтроллеров и т.д. Бьюсь об неё уже час, первый проект создать не могу. В кокосе уже бы давным давно программу писал.
Я даже растерялся поначалу, прочитав.
Вообще 90 процентов статьи посвящено именно тому как добавить файлы библиотек в новый проект, как прописать к ним пути и т. д.
А уж писать про установку IDE на сайте, ориентированном все-таки на программистов или людей, которые хотят ими стать, по меньшей мере странно.
Вы серьезно полагаете, что тут будет уместно описание таких шагов как - скачивание установочного файла (.exe) из интернета, запуск этого файла, нажатие кнопки Next в открывающихся диалоговых окнах, указание директории установки программы и т. д...?
Немного не так поняли. Например, в окне select device for target у меня была всего одна строка с одним устройством. Микроконтроллеров stm32 там не было. Чтобы они там появились, надо зайти в прилагающуюся к IDE утилиту и там установить библиотеки. Вроде всё просто, а провозился с этим с полчаса. Вот первые грабли, дальше не получилось что- то ещё и ещё. Как итог- старт не состоялся, я остаюсь на CooCox. Как говорится, хорошая попытка, keil.
Вполне вероятно, что Кейл не тот, у них же есть IDE под разные архитектуры.
Аналогично... А вот работая с плисинами в зайлинксовом ISE вообще никаких проблем не испытывал (во всяком случае на этапе сборки проекта). А в кейле очень мутно...
Помогите, пожалуйста!
Ошибка core_cm3.c: Error: #869: could not set locale ".1252" to allow processing of multibyte characters
День добрый. Подскажите, что за варнинг выскакивает - ".\Objects\Primer.axf" - 0 Error(s), 1 Warning(s).
Над этими строками Кейл должен написать, какой именно warning
Прошу прощения, что сразу не написал. Проект оставил на рабочем компьютере.
Я скопировал весь текст.
*** Using Compiler 'V5.05 update 2 (build 169)', folder: 'D:\Program Files\Keil_v5\ARM\ARMCC\Bin'
Build target 'Target 1'
compiling core_cm3.c...
linking...
.\Objects\Primer.axf: Warning: L6304W: Duplicate input file .\objects\core_cm3_1.o ignored.
Program Size: Code=548 RO-data=224 RW-data=4 ZI-data=1636
Finished: 0 information, 1 warning and 0 error messages.
FromELF: creating hex file...
".\Objects\Primer.axf" - 0 Error(s), 1 Warning(s).
Build Time Elapsed: 00:00:12
То есть я каким-то образом задействовал дважды core_cm3_1.o.
Два одинаковых файла включены в проект - core_cm3_1.c и core_cm3.c
Спасибо. Да есть такое. Нашел. Один исключил и варнинга нет.
День добрый. Подскажите, что за WARNINGS:
compiling stm32f10x_rcc.c...
STM32_SPL\src\stm32f10x_rcc.c(273): warning: #223-D: function "assert_param" declared implicitly
assert_param(IS_RCC_HSE(RCC_HSE));
STM32_SPL\src\stm32f10x_rcc.c(338): warning: #223-D: function "assert_param" declared implicitly
assert_param(IS_RCC_CALIBRATION_VALUE(HSICalibrationValue));
STM32_SPL\src\stm32f10x_rcc.c(357): warning: #223-D: function "assert_param" declared implicitly
assert_param(IS_FUNCTIONAL_STATE(NewState));
STM32_SPL\src\stm32f10x_rcc.c(383): warning: #223-D: function "assert_param" declared implicitly
assert_param(IS_RCC_PLL_SOURCE(RCC_PLLSource));
STM32_SPL\src\stm32f10x_rcc.c(404): warning: #223-D: function "assert_param" declared implicitly
assert_param(IS_FUNCTIONAL_STATE(NewState));
STM32_SPL\src\stm32f10x_rcc.c(431): warning: #223-D: function "assert_param" declared implicitly
assert_param(IS_RCC_PREDIV1_SOURCE(RCC_PREDIV1_Source));
STM32_SPL\src\stm32f10x_rcc.c(568): warning: #223-D: function "assert_param" declared implicitly
assert_param(IS_RCC_SYSCLK_SOURCE(RCC_SYSCLKSource));
STM32_SPL\src\stm32f10x_rcc.c(612): warning: #223-D: function "assert_param" declared implicitly
assert_param(IS_RCC_HCLK(RCC_SYSCLK));
STM32_SPL\src\stm32f10x_rcc.c(638): warning: #223-D: function "assert_param" declared implicitly
assert_param(IS_RCC_PCLK(RCC_HCLK));
STM32_SPL\src\stm32f10x_rcc.c(664): warning: #223-D: function "assert_param" declared implicitly
assert_param(IS_RCC_PCLK(RCC_HCLK));
STM32_SPL\src\stm32f10x_rcc.c(703): warning: #223-D: function "assert_param" declared implicitly
assert_param(IS_RCC_IT(RCC_IT));
STM32_SPL\src\stm32f10x_rcc.c(731): warning: #223-D: function "assert_param" declared implicitly
assert_param(IS_RCC_USBCLK_SOURCE(RCC_USBCLKSource));
STM32_SPL\src\stm32f10x_rcc.c(770): warning: #223-D: function "assert_param" declared implicitly
assert_param(IS_RCC_ADCCLK(RCC_PCLK2));
STM32_SPL\src\stm32f10x_rcc.c(832): warning: #223-D: function "assert_param" declared implicitly
assert_param(IS_RCC_LSE(RCC_LSE));
STM32_SPL\src\stm32f10x_rcc.c(865): warning: #223-D: function "assert_param" declared implicitly
assert_param(IS_FUNCTIONAL_STATE(NewState));
STM32_SPL\src\stm32f10x_rcc.c(882): warning: #223-D: function "assert_param" declared implicitly
assert_param(IS_RCC_RTCCLK_SOURCE(RCC_RTCCLKSource));
STM32_SPL\src\stm32f10x_rcc.c(896): warning: #223-D: function "assert_param" declared implicitly
assert_param(IS_FUNCTIONAL_STATE(NewState));
STM32_SPL\src\stm32f10x_rcc.c(1067): warning: #223-D: function "assert_param" declared implicitly
assert_param(IS_RCC_AHB_PERIPH(RCC_AHBPeriph));
STM32_SPL\src\stm32f10x_rcc.c(1098): warning: #223-D: function "assert_param" declared implicitly
assert_param(IS_RCC_APB2_PERIPH(RCC_APB2Periph));
STM32_SPL\src\stm32f10x_rcc.c(1129): warning: #223-D: function "assert_param" declared implicitly
assert_param(IS_RCC_APB1_PERIPH(RCC_APB1Periph));
STM32_SPL\src\stm32f10x_rcc.c(1188): warning: #223-D: function "assert_param" declared implicitly
assert_param(IS_RCC_APB2_PERIPH(RCC_APB2Periph));
STM32_SPL\src\stm32f10x_rcc.c(1219): warning: #223-D: function "assert_param" declared implicitly
assert_param(IS_RCC_APB1_PERIPH(RCC_APB1Periph));
STM32_SPL\src\stm32f10x_rcc.c(1240): warning: #223-D: function "assert_param" declared implicitly
assert_param(IS_FUNCTIONAL_STATE(NewState));
STM32_SPL\src\stm32f10x_rcc.c(1253): warning: #223-D: function "assert_param" declared implicitly
assert_param(IS_FUNCTIONAL_STATE(NewState));
STM32_SPL\src\stm32f10x_rcc.c(1285): warning: #223-D: function "assert_param" declared implicitly
assert_param(IS_RCC_MCO(RCC_MCO));
STM32_SPL\src\stm32f10x_rcc.c(1332): warning: #223-D: function "assert_param" declared implicitly
assert_param(IS_RCC_FLAG(RCC_FLAG));
STM32_SPL\src\stm32f10x_rcc.c(1406): warning: #223-D: function "assert_param" declared implicitly
assert_param(IS_RCC_GET_IT(RCC_IT));
STM32_SPL\src\stm32f10x_rcc.c(1451): warning: #223-D: function "assert_param" declared implicitly
assert_param(IS_RCC_CLEAR_IT(RCC_IT));
STM32_SPL\src\stm32f10x_rcc.c: 28 warnings, 0 errors
linking...
.\test1.axf: Error: L6218E: Undefined symbol assert_param (referred from stm32f10x_rcc.o).
Not enough information to list image symbols.
Finished: 1 information, 0 warning and 1 error messages.
".\test1.axf" - 1 Error(s), 28 Warning(s).
Target not created
USE_STDPERIPH_DRIVER прописано в настройках?
Прописано в Preprocessor Symbols --> Define. У меня STM32F103RB на плате MSBSTM32, paths выглядят C:\Keil\ARM\Boards\Keil\MCBSTM32\LLL\STM32_SPL\inc.
LLL создана для Вашего tutorial.
Надо перепроверить, что точно правильно прописано и что пути ко всем хэдерам есть в настройках. Симптомы ошибки очень уж типичные для этих двух проблем.
Я вижу главную проблему в SPL и HAL. Что эти знания оказываются бесполезными, как только попадается АРМ не производства STM. А вероятность этого для специалиста продающего свой труд весьма вероятна.
Также знание, к примеру, регистров AVR абсолютно никак не помогает при работе с любым другим контроллером. С чего вообще библиотеки ST должны быть полезными при использовании других контроллеров?
С того, что CMSIS подходит ко ВСЕМ АРМ (в большой степени)
Ну а SPL это просто обертка.
Когда открываю новый проект, в разделе STM нет стм-ских устройств. там только upsd-ские устройства.
Что делать-то? Качал с торрента, 12-14 гигов. Что качал, непонятно..
Непонятно действительно ) Я насколько помню четвертый Кейл в районе 400 мб..
Подскажите пожалуйста, что делать? Я два раза проходил по одному видеоуроку и повылезали ошибки.
Т.е. первоначально я выбрал не то устройство, о котором говорилось в уроке, а дальше делал все как говорили - скачивал библиотеку с сайта st.com, прописывал пути, создавал папки (user, periph, CMSIS) и т.д.
Качал отсюда - http://rutracker.org/forum/viewtopic.php?t=2305709
Вот ошибки: Build target 'Target 1'
compiling system_stm32f4xx.c...
.\CMSIS\Device\ST\STM32F4xx\Include\stm32f4xx.h(666): warning C318: can't open file 'core_cm4.h'
\Users\Сергей\Desktop\MyKeilProject\CMSIS\Device\ST\STM32F4xx\Include\system_stm32f4xx.h(59): error C129: missing ';' before 'SystemCoreClock'
.\CMSIS\Device\ST\STM32F4xx\Include\stm32f4xx.h(668): warning C318: can't open file 'stdint.h'
CMSIS\Device\ST\STM32F4xx\Source\Templates\system_stm32f4xx.c(483): warning C322: unknown identifier
compiling misc.c...
.\CMSIS\Device\ST\STM32F4xx\Include\stm32f4xx.h(666): warning C318: can't open file 'core_cm4.h'
\Users\Сергей\Desktop\MyKeilProject\CMSIS\Device\ST\STM32F4xx\Include\system_stm32f4xx.h(59): error C129: missing ';' before 'SystemCoreClock'
...
Target not created.
Build Time Elapsed: 00:01:04
Перед Target еще куча всего, но не хочу загромождать комментарий.
.\CMSIS\Device\ST\STM32F4xx\Include\stm32f4xx.h(666): warning C318: can’t open file ‘core_cm4.h’ - не получается открыть файл. Либо файла нет в проекте, либо пути к нему не прописаны в настройках.
Здравствуйте. Подскажите пожалуйста, как тут происходит настройка тактирования? Одну, похожую на настройку строку вы рекомендуете закомментить: #define HSE_Value ((u32)8000000) /* Value of the External oscillator in Hz*/ Может как то еще оно настраивается? Или STM умеет сам распознавать частоту резонатора? А как узнавать частоту работы всей периферии (особенно новичкам)? С кубом все понятно, а вот Standard Peripheral Library для меня загадочна.
Там строка закомментирована только из-за того, что она дублируется в другом файле, а так в SPL тоже есть файлы для работы с тактированием (stm32f10x_rcc.c) и там есть набор функций нужный.
Объясните следующую ошибку:
.\gpio.axf: Error: L6218E: Undefined symbol main (referred from rtentry2.o)
Not enough information to list image symbol
Можно не отвечать, глупость зашкаливает
У меня 5-й Keil. Сделал всё как у вас. Правда выбрал другой контроллер. Пути прописал ВСЕ! Ошибка:
*** Using Compiler 'V5.06 update 1 (build 61)', folder: 'C:\Keil_v5\ARM\ARMCC\Bin'
Build target 'Target 1'
linking...
.\Objects\test.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.
".\Objects\test.axf" - 1 Error(s), 0 Warning(s).
Target not created.
Build Time Elapsed: 00:00:03
Так вот, в папке Object даже нет такого файла - \test.axf. А он там должен быть?
Функция main() не определена
А чем Keil лучше чем CooCox?
Здесь строчку надо прописать, иначе не заработает... тут строку закомментировать, а то проект не соберется... еще и к каждому файлу(!) из проекта путь указать... В кокосе библиотеки предельно просто добавляются, и без всяких заморочек. Почему именно кейл?
Я IAR'ом только пользуюсь последние несколько лет. В 5 Кейле тоже можно добавлять библиотеки насколько я помню.
не совсем это и для начинающих ! Вы пропускаете необходимые вещи как раз полезные для начинающих и приходится заглядывать в сторонние проекты !
Пример :
Теперь аналогично добавим файлы библиотеки SPL. Пока они нам не понадобятся, но пусть будут. Добавим, например stm32f10x_rcc.c и подхватим includ’ом stm32f10x_rcc.h
Это как ?
Добрый день!
#include "stm32f10x_rcc.h"