STM32F030F4P6 Keil Первый проект.
Всем привет!
В этой статье хочу рассказать как создать проект в среде Keil uVision5 версии V5.29.0.0. для микроконтроллера STM32F030F4P6 фирмы ST для которого была сделана плата которую я описал в статье STM32F030F4P6 hand-made, так же показал в другой статье STM32F030F4P6 Blink CubeMX как сделать проект в среде CubeMX и управлять светодиодом. Чем нравиться создавать программы в среде Keil - просто, быстро, и все то, что вставляешь в код - это ты сделал самостоятельно (ну или хочется так думать - что самостоятельно). STM32F030F4P6 (и не только он) позволяет расширить свои познания о среде Keil uVision, и так как мы не планируем останавливаться на одном типе микроконтроллеров - создадим для себя основу для будущих проектов. Мы создадим пустой проект с примером настройки портов и управления светодиодом как в статье STM32F030F4P6 Blink CubeMX, но в среде uVision без CubeMx.
Цель создания этой статьи - запомнить последовательность действий при которой создается новый проект, тем кто это делает постоянно скорее всего это будет не интересно, а вот тем кто только начинает осваиваться - пригодиться точно. Я постараюсь рассказать о создании - максимально подробно. Конечно, на первых шагах - ошибки будут возникать на разных этапах создания, но не ошибается тот кто ни чего не делает ..
Итак начнем - первый проект мы будем создавать в среде Keil (см. ниже) то не обновился -обновитесь, всегда лучше использовать последние версии программного обеспечения.
Размер памяти в STM32F030F4P6 16Кб - 32 Кб разрешенного бесплатного использования программы uVision - воспользуемся этим для своих проектов.
Итак приступим ...
Запускаем Keil и начинаем создавать проект.
Делаем последовательно как указано на фото.
Подбираем для себя имя проекта. Я обычно выбираю названия исходя из того что будет делать программа.
После ввода названия и нажатия Сохранить - выходит окно выбора микроконтроллер для созданного проекта. Мы соответственно выбираем STM32F030F4Px - т.к. у нас STM32F030F4P6
Как только микропроцессор выбран - нажимаем Ok и попадаем в окно в котором необходимо выбрать первоначальные библиотеки и файлы которые буду установлены в проект.
Проект у нас простой - в открытом окне (см. ниже ) добавим основное
Открываем вкладку Device - появляются подпункты меню. Нас интересует пункт Startup. Мы хотим программировать микроконтроллер с использованием библиотек Keil поэтому меняем в строчке Device - (второй столбец на фото) STM32CubeMx на Standalone как на фото ниже
После выбора - устанавливаем во всем окне нужные нам библиотеки как на фото ниже.
Выбрали - нажимаем OK и выходим в основное окно в котором будут видны подключенные файлы.
Поменяем название нашей папки на более удобное.
Поменяли (можно не менять - по желанию).
Приступим к первоначальной настройке свойств проекта и программатора.
Для этого открываем
Открывается первая страница - на ней устанавливаем частоту кварцевого резонатора установленного на плате - в моем случае Xtal (MHz) - 16.0 и устанавливаем "галку" на пункте Use MicroLib см. на фото ниже.
Следующее окно которое нас интересует - Output. Устанавливает "галку" на Create Hex File - это не обязательно если шить прямо из программы Keil. Но при использовании другой программы для прошивки микроконтроллера - этот файл необходим.
Далее переходим на вкладку для настройки программатора и отладчика программы - Debug. В правой ее части выбираем тот программатор который будем использовать с платой. Я выбирают китайский клон - это не правильно использовать не оригинальное оборудование для программирования!!! но дешево и просто ..
И по этому ST-Link Debugger настойки следующие - Settings
Если видим окно ниже с пустым Unit - проблема может быть
1. Программатор не подключен к PC
2. Программатор подключен но не исправен
3. Программатор не установлен в системе WINDOWS (не установлены драйвера и т.п.)
В моем случае это пункт 1. Подключаем программатор в USB порт в окне с пустым Unit - нажимаем Ok и выходим в первое окно. Дожидаемся когда WINDOWS установит устройство - убедиться можно открыв - Диспетчер устройств и в дереве устройств увидеть
Все отлично переходим дальше.
Открываем окно Debug видим ST-LINK/2
Далее устанавливаем порт для отладки SW (если не установлен) и переходим во вкладку Flash Download и устанавливаем все галки как на фото ниже.
"Галки" установлены добавим Programming Algorithm для этого нажимаем ADD
В окне которое открылось добавляем алгоритм и нажимаем Add
В итоге
Нажимаем OK - Ok и выходим в основное окно программы. Минимальные настройки для проекта установлены.
Добавляем в проект основные файл main.c и main.h
Сначала main.c
вводим название и дальше необходимо указать то место где будут храниться все основные файлы проекта
ЖЕЛАТЕЛЬНО (но не обязательно) для удобства хранить все по своим папкам. Я заранее их в папке проекта не создал поэтому создам из окна создания файла дл этого при выборе куда сохранить выбираю папку с проектом и создаю папку Main и в нее сохраняю и main.c main.h
Тоже самое с main.h
После создания main.h - слева мы видим наш проект с созданными файлами. Начинам заполнять файлы main.c и main.h первоначальным содержимым.
main.c содержимое файла
******************************************************
#include "main.h"
int main(void)
{
while (1)
{
}
}
*******************************************************
Конец файла main.c
НЕ ЗАБЫВАЕМ О ПУСТОЙ СТРОКЕ В КАЖДОМ ФАЙЛЕ!!
main.h содержимое файла
******************************************************
#ifndef MAIN_H
#define MAIN_H
#include "stm32f0xx.h"
#endif
*******************************************************
Конец файла main.h
Наполнили файлы содержимым - все сохраняем
После сохранения
собираем проект и убеждаемся, что на этой стадии ошибок нет!!
Отлично!!!
Мы создали пустой проект и в нем на этой стадии ошибок нет !!!
Все вроде просто НО !! Самое интересное начинается дальше ...
Продолжим!
Начинаем конфигурировать порты для нашего проекта! Создаем два начальных файла.
port_ini.c и port_ini.h и сохраняем их директорию Main
Выходим в основную окно программы и наполняем эти файлы содержимым.
**************************************************************************************
Содержимое файла port_ini.c
#include "port_ini.h"
#include "stm32f0xx.h"
Конец файла port_ini.c
***************************************************************************************
Содержимое файла port_ini.h
#ifndef PORT_INI_H
#define PORT_INI_H
#include "stm32f0xx.h"
#endif
Конец файла port_ini.h
**************************************************************************************
И дополняем файл main.c строчкой
#include "main.h"
#include "port_ini.h"
**************************************************************************************
Переходим во вкладку port_ini.c
И заполняем его настройками нужных нам портов микроконтроллера с которыми мы будем работать.
Смотрим
Подключим светодиод к PA5.
Подключаем СВЕТОДИОД через РЕЗИСТОР исходя из потребления светодиода!
Порт может выдать нам 25 mA - следовательно ток светодиода не может быть больше этого значения!! Я обычно для информационных диодов рассчитываю ток в 10 mA (или что около того - все зависит от наличия нужного резистора). Закон Великого Ома объяснять не буду. Думаю, что вы сами сможете пересчитать нужный номинал резистора!!! С учетом того, какое напряжение питание будет использовано. В моем случае на плате только 3.3v и я буду использовать схему подключения к порту следующую;
PA5 - > резистор - > "+" светодиода "-" светодиода на GND.
Включаем светодиод - > устанавливаем порт PA5 в "1".
Выключаем светодиод -> устанавливаем порт PA5 в "0".
С какой частотой будем моргать пока не важно.
Итак настрои порт PA5 как выход в файле Port_ini.c.
Для этого добавляем в файл следующие строчки
#include "port_ini.h"
#include "stm32f0xx.h"
// Конфигурируем порты для управления
void GPIO_init(void)
{
GPIO_InitTypeDef GPIO_user; // создаем структуру
RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOA ,ENABLE); // включаем тактирование порта А
// Светодиод подключенный к порту выход РА 5
GPIO_user.GPIO_Pin = GPIO_Pin_5;
GPIO_user.GPIO_Speed = GPIO_Speed_Level_3;
GPIO_user.GPIO_Mode = GPIO_Mode_OUT;
GPIO_user.GPIO_OType = GPIO_OType_PP;
GPIO_user.GPIO_PuPd = GPIO_PuPd_NOPULL;
GPIO_Init(GPIOA, &GPIO_user);
}
И видим следующую картину
Одни красные кресты ...
И правильно т.к. мы решили поработать с функциями которые не обнаружены в нашем проекте.
Их необходимо добавить. Это набор стандартных библиотек от фирмы ST - STM32F0xx_StdPeriph_Driver Для этого необходимо их скачать с официально сайта ST .com или у меня ссылка.
Скачиваем архив и открываем. Содержимое архива см. ниже
Нам нужна папка выделенная на фото выше и еще CMSIS.
Распаковываем архив и копируем эту папку в свой проект. В моем случае папка получает вид
добавлена папка Device (она находиться в папке CMSIS) и STM32F0xx_StdPeriph_Driver
Для нормального запуска необходимо сделать следующее
1. Прописать папки в настройках проекта.
2. Добавить в любую прописанную папку файлы - в моем случае они в папке Device.
stm32f0xx.h и stm32f0xx_conf.h и system_stm32f0xx.c- они есть в выше скачанном архиве.
Скачать этот файл - system_stm32f0xx.c и поместить его по месту хранения в проекте - в моем случае D:\Keil_pj\030\RTE\Device\STM32F030F4Px - это файл созданный в программе разработанный фирмой ST - STM32F0xx_AN4055_V1.0.1 - STM32F0xx_Clock_Configuration_V1.0.1.xls - почитайте про него обязательно!!
Так прописываем папки. Открываем настройки проекта
Нажимаем на кнопку с тремя точками на против строки Include Paths - выходит окно в котором добавляем пути к папкам. В итоге должно получиться так как на фото ниже
Нажимаем ОК
В строке Define вводим строчку USE_STDPERIPH_DRIVER,STM32F030xx
Нажимаем ОК
Закрываем Keil uVision.
Пути к файлам прописали теперь копируем файл stm32f0xx_conf.h
В папку D:\Keil_pj\030\Device\ST\STM32F0xx\Include в результате она получается
Остается файл system_stm32f0xx.c его копируем в папку проекта по адресу
D:\Keil_pj\030\RTE\Device\STM32F030F4Px Папка будет с двумя файлами
И дальше переходим в основное окно Keil и собираем проект для проверки
Если все сделано по пунктам то получим окно с предупреждением
Исправляем и эту ошибку - причем она будет возникать тогда когда будем в других проектах добавлять стандартные библиотеки!!!
В открывшимся окне добавляем файлы - нажимаем Add Files
И добавляем файлы
port_ini.c
port_ini.h
Стандартные библиотеки которые по адресу D:\Keil_pj\030\STM32F0xx_StdPeriph_Driver
inc - *.h
src -*.c
stm32f0xx_gpio.h
stm32f0xx_gpio.c
stm32f0xx_rcc.h
stm32f0xx_rcc.c
В итоге после дополнения файлов получаем
Нажимаем Ok.
Проверяем
И получаем окно результата
Хорошо! Ошибок нет!!!
Открываем port_ini.c и дополняем его.
**************************************************************************************
#include "port_ini.h"
#include "stm32f0xx.h"
uint16_t delay_count;
// Прерывание
void SysTick_Handler(void)
{
if (delay_count > 0)
{
delay_count --;
}
}
// Конфигурируем порты для управления
void GPIO_init(void)
{
GPIO_InitTypeDef GPIO_user; // создаем структуру
RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOA ,ENABLE);// включаем тактирование порта А // Светодиод подключенный к порту выход РА 5
GPIO_user.GPIO_Pin = GPIO_Pin_5;
GPIO_user.GPIO_Speed = GPIO_Speed_Level_3;
GPIO_user.GPIO_Mode = GPIO_Mode_OUT;
GPIO_user.GPIO_OType = GPIO_OType_PP;
GPIO_user.GPIO_PuPd = GPIO_PuPd_NOPULL;
GPIO_Init(GPIOA, &GPIO_user);
}
//Задержка для светодиода
void delay_ms(uint16_t delay_temp)
{
delay_count = delay_temp;
while (delay_count)
{ };
}
**************************************************************************************
Открываем port_ini.h и дополняем его
*************************************************************************************
#ifndef PORT_INI_H
#define PORT_INI_H
#include "stm32f0xx.h"
void delay_ms(uint16_t delay_temp);
void GPIO_init(void);
#endif
*************************************************************************************
Переходим в main.c и дополняем его
*************************************************************************************
#include "main.h"
#include "port_ini.h"
int main(void)
{
SysTick_Config(SystemCoreClock / 1000);
// Настраиваем порты
GPIO_init();
while (1)
{
GPIO_ResetBits(GPIOA, GPIO_Pin_5); //Подаем «1» на PA5
delay_ms(500);
GPIO_SetBits(GPIOA, GPIO_Pin_5); //Подаем «0» на PA5
delay_ms(500);
}
}
*****************************************************************************
Все сохраняем и
Должно выйти окно без ошибок
Хорошо! Осталось проверить - записать в микроконтроллер и увидеть как включается и гаснет светодиод
для этого
Загрузка в микроконтроллер должна пройти без ошибок и должен быть создан *.hex файл для внешнего программатора
Далее
и RUN
Должно получиться как на видео см. ниже.!!
Ура !!! Все получилось!!!!
Ссылка на проект !!!
P.S.
Добавил видео создание проекта для микроконтроллера STM32F030F4P6 с нуля - как создать проект, как подключить папки, как установить частоту работы микроконтроллера. Видео без звука. Но все делается подробно. Если будут вопросы направляем на почту stm32@stm32res.ru