Создание проекта в Keil uVision.
Один из вопросов, который возникает, при переходе на STM32:
«Какую среду разработки выбрать?»
Наверное самые популярные — это Coocox, IAR и Keil uVision, я пользуюсь последней.
Главное её преимущество перед другими — это мощный симулятор, с поддержкой периферии и множеством виртуальных приборов.
Все эти плюшки «упрощают жизнь» опытному разработчику и помогают новичку разбираться с богатой периферией современных МК. Ниже изображён скриншот интерфейса.

Размер прошивки при использовании бесплатной версии ограничен и составляет 32К, чего в большинстве случаев достаточно.
Для того чтобы её установить, качаем MDK-ARM с официального сайта.



И устанавливаем его.
Всё хорошо, но при создании проекта не получится выбрать нужный МК. Исправить это можно, установив необходимый пакет, например, для линейки STM32F1xx этот пакет называется Keil.STM32F1xx_DFP.x.x.x.pack

Теперь когда среда установлена, приступим к созданию проекта.

Желательно создать отдельную папку для проекта так, как файлов будет много.

Если в проекте не используется библиотека StdPeriph достаточно подключить файл стартапа и ядро CMSIS.


Теперь необходимо создать или добавить нужные файлы.




После того как все необходимые файлы включены в проект, можно перейти к настройке проекта.

Если МК тактируется от кварца, необходимо указать его частоту.

Частоту тактирования SYSCLK, которая тактирует все шины МК, можно выбрать, в файле system_stm32f10x.c, для этого достаточно раскомментировать нужную.


Название функций, в которых обрабатываются прерывания, можно посмотреть в файле startup.

Приготовления закончены и можно переходить непосредственно к отладке, предварительно скомпилировав проект.

Для того чтобы начать отладку необходимо нажать кнопку, показанную на скриншоте.

Далее, пользуясь кнопками изображенными ниже, можно отлаживать программу.

На самом деле функционал программы гораздо шире, а в статье описан лишь тот минимум, который необходим для того, чтобы начать работу.
Создаем свой первый проект в Keil
В данной статье создадим первый рабочий проект в среде uVision от Keil, откомпилируем его, прошьем отладочную плату STM32VLDiscovery, рассмотрим некоторые «подводные камни», которые будут по мере работы над проектом. Ничего особенно писать не будем просто помигаем светодиодами. UPD: статья довольно старая, но информация в ней актуальна и для последней на данный момент версии Keil 5.23. Итак начнем. Для начала создаем пустой новый проект, в меню выбираем PROJECT -> New uVision Project, сохраняем его (проект имеет расширение .uvproj), выбираем в окне наш МК, в STM32VLDiscovery это STM32F100RB:


Далее нам предложат добавить в проект стартовый код, жмем «Yes»:
Создадим новый файл с исходным кодом, сохраняем его, присвоив ему расширение .c, добавляем его к проекту в новую группу, также добавляем файлы библиотеки CMSIS, зачем они нужны в следующем уроке, пока просто добавляем:

Теперь необходимо выполнить конфигурацию проекта:

В окне проекта на вкладке Target видим установки адресов памяти IROM и IRAM, эти значения устанавливаются автоматически при выборе соответствующего чипа, менять их крайне нежелательно (Здесь также желательно установить Xtal частоту, на которой работает микроконтроллер):

Идем во вкладку Output и здесь ставим галочки напротив тех типов файлов, которые мы хотим получить на выходе проекта (Debug Information необходим для отладки устройства, HEX File – прошивка микроконтроллера):

Переходим во вкладку C/C++, если наш проект использует include файлы, то здесь необходимо в поле Include Paths установить пути до этих файлов:

В нашем проекте мы будем использовать файл stm32f10x.h, указываем путь до него:

Далее у нас идет настройка вкладок Debug и Utilities, где производится установка отладчика STLINK, в прошлом уроке мы это уже делали. Все на этом настройка проекта закончена, можно приступать к написанию кода.
Сделаем простую мигалку светодиодами, которые висят у нас на порту С (PC8, PC9) попеременно через пол секунды, кстати в Keil нет функции delay, как в GCC для AVR, так что нам придется написать эту функцию самостоятельно используя таймер:
#include "stm32f10x.h" void initial (void) < RCC->APB2ENR |= 1 CRH &= ~GPIO_CRH_CNF8; GPIOC->CRH |= GPIO_CRH_MODE8_0; GPIOC->CRH &= ~GPIO_CRH_CNF9; GPIOC->CRH |= GPIO_CRH_MODE9_0; /*timer config*/ RCC->APB1ENR |= RCC_APB1ENR_TIM6EN; TIM6->PSC = 8000-1; TIM6->CR1 |= TIM_CR1_OPM; > void delay_ms (uint16_t value) < TIM6->ARR = value; TIM6->CNT = 0; TIM6->CR1 = TIM_CR1_CEN; while((TIM6->SR & TIM_SR_UIF)==0)<> // дождаться конца задержки TIM6->SR &= ~TIM_SR_UIF; > int main (void) < initial (); while (1) < GPIOC->BSRR |= 1 BRR |= 1 BSRR |= 1 BRR |= 1 >
Ну что ж, можно и компилировать и собирать проект, жмем F7 и у нас выпадает следующая ошибка: C:\Keil\ARM\INC\ST\STM32F10x\stm32f10x.h(96): error: #35: #error directive: «Please select first the target STM32F10x device used in your application (in stm32f10x.h file), которая говорит нам, что необходимо выбрать процессор в файле stm32f10x.h, зачем это придумали делать вручную я не знаю, открываем в проекте это файл и раскомментируем #define с нашим процессором (UPD правильнее сделать на вкладке С/С++ -> Preprocessor Symbol -> Defines вставляем «STM32F10X_MD_VL»):

После чего компиляция происходит успешно.
STM32F103. Начало работы в Keil
Статья ориентирована на одного моего товарища, вполне перспективного программиста, надеюсь она ему поможет. Если вы не он, закройте страницу тоже можете читать.
Основные вопросы этой заметки:
- как начать разрабатывать ПО для stm32 в Keil ;
- что для этого необходимо.
Начать необходимо со второго вопроса. Необходимый минимум это среда программирования ( Keil ), программатор и отладочная плата. Можно конечно и в симуляторе запускать программу, но это не так инетресно, так что плата и программатор нужны. Где брать писать не буду, не моя это забота.
Для начала необходимо установить keil, его можно взять на официальном сайте, на данный момент последняя версия 5.26 , если у вас 5.25 не отчаивайтеся, там различий не много, есть весьма полезные функции, но они вам не нужны.
Я сразу же после установки на новую машину произвожу настройку среды программирования:

Вот так они выглядят. Теперь по пунктам, что и где настроено.
- Изменена кодировка файлов на юникод, так у вас гарантированно будут отображаться русские символы в комментариях
- Настраиваю замену табуляции на 4 пробела (это довольно холиварная тема, но я любю так), с такими настройками код гарантированно одинаково будет выглядить в любом редакторе.
Теперь установим паки (различные библиотеки) необходимые для разработки под наш чип. Минимум установлен на картинке. FreeRTOS на самом деле не обязательно устанавливать, но пусть будет, ведь после игр с различной переферией будет пытаться оседлать её.

И так, все настройки сделаны, всё установлено, пробудем создать новый проект. Делается это через меню Project->New μVision Project. Сразу после нажатия откроется окно с предложением выбрать используемый чип, его название можно посмотреть на корпусе =)

Следующим этапом нам будет предложено выбрать необходимые в нашей работе паки. Отмечаем всё как на картинке.

- CMSIS (Cortex Microcontroller Software Interface Standard);
- Startup — это ассемблерный файл для запуска нашей программы, с содержимым можно будет ознакомиться самостоятельно;
- STDPeriph — Библиотека переферийных устройств:
- Fraemwork — оснойной файл, подлючающий бибилотеку;
- GPIO — для управления портами ввода-вывода;
- RCC — для управления тактированием.
Всё выбрано, значить пожно приступать к следующему шагу. Настройка проекта. открывается через меню Project->Option for Target.
Рассмотрим наиболее интересные и необходимые вкладки.
Здесь можно выбрать версию компилятора, для простоты будем использовать версию 5.

Вкладка для настройки компилятора. Здесь можно включить оптимизацию, выбрать уровень предупреждений, установить список инклудов и предопределенных макросов, и многое другое.

Нажатие на кнопку обведенную синим открывает диалоговое окно для добавления путей к используемым зголовочным файлам.

Следующая вкладка для настройки отладки, здесь можно выбрать используемый программатор и настроить его.

Настройки программатора. При загрузке прошивки будем стирать весь чип, программировать, верифицировать и запускать программу на исполнение.

Ну вот с настройка мы разобрались.
Приступим к написанию кода.
Программа для микроконтроллера выглядит в виде бесконечного цикла. Что бы это понять предлагаю ознакомиться с кодом:
/* Точка входа в программу */ int main( void ) < /* Здесь производится инициализация основных узлов программы и микроконтроллера */ while( 1 ) < /* Вечный цикл необходим для работы, иначе программа останомиться Сюда обычно помещают код который выполняется постоянно или оставляют цикл пустым если работают на прерываниях, можно совмещать. */ >>Что нужно сделать чтоб ы помигать светодиодом?
- Включить тактирование порта к которому подключен светодиод;
- Настроить порт на выход;
- в вечном цикле переключать вывод с небольшой задержкой то в 0 , то в 1 .
Вот и наш учебный код:
#include "stm32f10x.h" #include "stm32f10x_gpio.h" // Файл с функциями управления ножками контроллера #include "stm32f10x_rcc.h" // Управление тактированием #include // Правильные типы данных, вместо всяких int, char и тому подобных // Далее будут ссылки на страницы референс мануала, его можно сказать по ссылке: // https://www.st.com/resource/en/reference_manual/CD00171190.pdf // Примитивнейшая функция задержки // Для орагнизации задержек (или периодических событий) // обычно применяются таймеры, но нам пока рано, так что // тупо мотаем такты void Delay( void ) < for( uint16_t i = 0; i // точка входа в программу, всегда именно "int main ( void )" int main( void ) < // ---------------- Включаем тактирование порта GPIOC // 1. С использованием SPL RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOC, ENABLE ); // 2. С использованием CMSIS, магические числа // RCC->APB2ENR |= (1 CRH |= (0x00 ODR |= (1 BSRR = (1 ODR &= ~(1 BRR = (1 BSRR = (1 > // В конце файла для Кейла обязательна пустая строка! Хз зачем, просто нужна.Код мигалки специально реализован несколькими возможными способами, используя STDPeriph и без него (только CMSIS )
Проект с этим кодом можно скачать здесь. Но лучше научиться создавать проект с нуля.
Будут вопросы пишите в комментариях, я обычно быстро отвечаю.
Как всегда — Спасибо за внимание и хорошего кодинга! =)
- Миландр. Неожиданное поведение CAN.
- Библиотека CMSIS DSP. Так ли быстр целочисленный квадратный корень?
CDEblog
Блог инженера-схемотехника, конструктора и немного программиста
Настройка проекта в Keil uvision5
До работы с STM микроконтроллерами, упорно изучал AVR. После приобретения своей первой платы STM32f3discovery, своим первым проектом, конечно же, хотел помигать светодиодами. Думал ща приду домой, включу и сразу начну программировать и без проблем делать всякие там проекты. Но не тут то было. После создания проекта постоянно вылетали всякие ошибки, компилятор постоянно ругался на недостающие файлы.
Наиболее часто вылетала ошибка типа этой:
«.\Objects\Ex3.axf: Error: L6218E: Undefined symbol assert_param (referred from stm32f30x_adc.o). Not enough information to list image symbols. Finished: 1 information, 0 warning and 1 error messages. ".\Objects\Ex3.axf" - 1 Error(s), 497 Warning(s). Target not created.»
После долгих попыток наконец-то удалось установить причину всех моих неудач. Ниже представлены несколько шагов, которые делаю я для создания проекта. Эти шаги облегчат процесс создание своих первых проектов на микроконтроллерах семейства STM32.
Среда Keil имеет свои «внутренние» файлы, которые она использует по умолчанию. К примеру фалы отвечающие за конфигурацию периферии и др. Для того чтобы компилятор использовал скипированные файлы необходимо сделать
1. Шаг первый – скачиваем файлы настройки контроллера
Для того чтобы настроить свой первый проект вам необходимо для начала скачать архив для вашей конкретной платы с официального сайта
Для своей платы STM32f3Discovery я скачал архив с примерами по ссылки
Далее распаковываем данный архив.
2. Создаем папки проекта
- cmsis – папка содержащая файлы настройки микроконтроллера;
- pl – папка с файлами переферрий;
- user – пользовательская папка, тут главный исполняемый файл;
- startup – начальная инициализация/
У меня это выглядит так:
3. Создаем аналогичные группы в среде Keil u vision
Аналогично в нашем проекте создаём группы с такими же названиями. Названия можно давать любые, но чтобы не путаться лучше такие же, как и сами папки.
Важно понимать, что создание группы в проекте это не создание аналогичных папок в папке проекта, а всего лишь группировка исполняемых файлов.
4. Копируем нужные файлы в папки проекта
Далее нам необходимо скопировать из нашего,ранее скаченного архива, следующие файлы.
- » F:\Projects\STM32\Ex4\cmsis\system_stm32f30x.c»
- » F:\Projects\STM32\Ex4 \cmsis\system_stm32f30x.h»
- » F:\Projects\STM32\Ex4cmsis\stm32f30x.h»
Файл stm32f30x.h – это файл необходимый для настройки работы микроконтроллера.
В папку pl две папки из STM32F30x_StdPeriph_Driver это
inc и src, в которых находится куча файлов для работы с периферией.
Также в папку pl необходимо скопировать файл stm32f30x_conf.h из любого проекта.
- «F:\Projects\STM32\Ex4\pl\stm32f30x_conf.h»
- «F:\Projects\STM32\Ex4\pl\inc\тут куча файлов h»
- «F:\Projects\STM32\Ex4\pl\src\ тут куча файлов c»
В папку startupкопируем следующий файл
В папке userсоздаем наш исполняемый файл main.c
5. Добавляем файлы в проект
- В группу cmsis добавляем один файл system_stm32f30x.c;
- В группу pl все си-шные файлы периферии из папки src;
- В группу startup файл startup_stm32f30x.s;
- А в папке user создаем файл main.cв ручную.
На данном этапе это выглядит так:
6. Самый главные этап создания проекта
Далее нам необходимо открыть файл stm32f30x.h и убрать комментарий со следующей строки:
В результате Keil начинает использовать ваши скопированные файлы.
7. Добавляем в проект стандартную библиотеку core
Для того чтобы добавить данную библиотеку необходимо менеджере проектов выбрать пунк Run-TimeEnviroment и поставить галочку в поле CMSIS.
Далее открываем наш main.c и компилируем, если ошибок нет. Значит проект настроен верно.