STM32F030F4P6 Keil Первый проект

Опубликовано stm32 - пн, 02/17/2020 - 11:18

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 - воспользуемся этим для своих проектов.

r31_0

Итак приступим ...

Запускаем Keil и начинаем создавать проект.

Делаем последовательно как указано на фото.

r1_0

Подбираем для себя имя проекта. Я обычно выбираю названия исходя из того что будет делать программа.

r2_0

После ввода названия и нажатия Сохранить - выходит окно выбора микроконтроллер для созданного проекта. Мы соответственно выбираем STM32F030F4Px - т.к. у нас STM32F030F4P6

r3_0

Как только микропроцессор выбран - нажимаем Ok и попадаем в окно в котором необходимо выбрать первоначальные библиотеки и файлы которые буду установлены в проект.

r4_0

Проект у нас простой -  в открытом окне (см. ниже ) добавим основное

r5_0

Открываем вкладку Device - появляются подпункты  меню. Нас интересует пункт Startup.  Мы хотим программировать микроконтроллер с использованием библиотек Keil поэтому меняем в строчке Device - (второй столбец на фото)  STM32CubeMx на  Standalone как на фото ниже

 

r6_0

 

r7_0

 

После выбора - устанавливаем во всем окне нужные нам библиотеки как на фото ниже.

r8_0

 

Выбрали - нажимаем OK и выходим в основное окно в котором будут видны подключенные файлы.

Поменяем название нашей папки на более удобное.

r9_0

Поменяли (можно не менять - по желанию).

Приступим к первоначальной настройке свойств проекта и программатора.

Для этого открываем

r10_0

Открывается первая страница - на ней устанавливаем частоту кварцевого резонатора установленного на плате - в моем случае Xtal (MHz)   -  16.0 и устанавливаем "галку" на пункте Use MicroLib см. на фото ниже.

r11_0

Следующее окно которое нас интересует - Output. Устанавливает "галку" на Create Hex File - это не обязательно если шить прямо из программы Keil. Но при использовании другой программы для прошивки микроконтроллера - этот  файл необходим.

r12_0

Далее переходим на вкладку для настройки программатора и отладчика программы - Debug.  В правой ее части выбираем тот программатор который будем использовать с платой. Я выбирают китайский клон - это не правильно использовать не оригинальное оборудование для программирования!!! но дешево и просто ..

r48_0

И по этому ST-Link Debugger настойки следующие - Settings

R13_0

Если видим окно ниже с пустым Unit - проблема может быть 

1. Программатор не подключен к PC

2. Программатор подключен но не исправен 

3. Программатор не установлен в системе WINDOWS (не установлены драйвера и т.п.) 

 

r14_0

В моем случае это пункт 1. Подключаем программатор в USB порт в окне с пустым Unit - нажимаем Ok и выходим в первое окно. Дожидаемся когда WINDOWS установит устройство - убедиться можно открыв - Диспетчер устройств и в дереве устройств увидеть 

r32_0

Все отлично переходим дальше.

Открываем окно Debug  видим ST-LINK/2 

r15_0

Далее устанавливаем порт для отладки SW (если не установлен) и переходим во вкладку Flash Download и устанавливаем все галки как на фото ниже.

r16_0

"Галки" установлены добавим Programming Algorithm для этого нажимаем ADD

r17_0

В окне которое открылось добавляем алгоритм и нажимаем Add

r18_0

В итоге 

r19

Нажимаем OK - Ok и выходим в основное окно программы. Минимальные настройки для проекта установлены. 

Добавляем в проект основные файл main.c и main.h

r20_0

Сначала main.c

r21_0

вводим название и дальше необходимо указать то место где будут храниться все основные файлы проекта 

ЖЕЛАТЕЛЬНО (но не обязательно) для удобства хранить все по своим папкам. Я заранее их в папке проекта не создал поэтому создам из окна создания файла дл этого при выборе куда сохранить выбираю папку с проектом и создаю папку Main  и в нее сохраняю и main.c main.h

 

 

r22_0

 

r23_0

Тоже самое с main.h

r24_0

После создания main.h - слева мы видим наш проект с созданными файлами. Начинам заполнять файлы main.c и main.h  первоначальным содержимым.

 

r25_0

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

Наполнили файлы содержимым - все сохраняем

 

r26_0

После сохранения 

r27

собираем проект и убеждаемся, что на этой стадии ошибок нет!! 

r30_0

Отлично!!! 

Мы создали пустой проект и в нем на этой стадии ошибок нет !!! 

Все вроде просто НО !! Самое интересное начинается дальше ...

Продолжим!

Начинаем конфигурировать порты для нашего проекта!  Создаем два начальных файла.

port_ini.c  и port_ini.h и сохраняем их директорию Main

r33_0

 r34_0

Выходим в основную окно программы и наполняем эти файлы содержимым.

**************************************************************************************

Содержимое файла 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

r35_0

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

Смотрим 

r1_1

Подключим светодиод к 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);
}

И видим следующую картину

r36_0

Одни красные кресты ...

И правильно т.к. мы решили поработать с функциями которые не обнаружены в нашем проекте.

Их необходимо добавить.  Это набор стандартных библиотек от фирмы ST  -  STM32F0xx_StdPeriph_Driver  Для этого необходимо их скачать с официально сайта ST .com или у меня ссылка.

Скачиваем архив и открываем. Содержимое архива см. ниже

r37_0

Нам нужна папка выделенная на фото выше и еще CMSIS.

Распаковываем архив и копируем эту папку в свой проект. В моем случае папка получает вид 

добавлена папка Device (она находиться в папке CMSIS) и STM32F0xx_StdPeriph_Driver

m

Для нормального запуска необходимо сделать следующее

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 - почитайте про него обязательно!!  

Так прописываем папки. Открываем настройки проекта 

m1

Нажимаем на кнопку с тремя точками на против строки Include Paths - выходит окно в котором добавляем пути к папкам. В итоге должно получиться так как на фото ниже

m2

Нажимаем ОК

В строке Define вводим строчку USE_STDPERIPH_DRIVER,STM32F030xx

m4

Нажимаем ОК

Закрываем Keil uVision.

Пути к файлам прописали теперь копируем файл stm32f0xx_conf.h

В папку D:\Keil_pj\030\Device\ST\STM32F0xx\Include   в результате она получается 

m5

Остается файл system_stm32f0xx.c  его копируем в папку проекта по адресу

D:\Keil_pj\030\RTE\Device\STM32F030F4Px   Папка будет с двумя файлами

m7

И дальше переходим в основное окно Keil и собираем проект для проверки

m8

Если все сделано по пунктам то получим окно с предупреждением

m9

Исправляем и эту ошибку - причем она будет возникать тогда когда будем в других проектах добавлять стандартные библиотеки!!!

m10

В открывшимся окне добавляем файлы - нажимаем Add Files 

m11

 И добавляем файлы 

port_ini.c

 

m12

port_ini.h

m13

Стандартные библиотеки которые по адресу  D:\Keil_pj\030\STM32F0xx_StdPeriph_Driver

inc - *.h

src -*.c

stm32f0xx_gpio.h

stm32f0xx_gpio.c

stm32f0xx_rcc.h

stm32f0xx_rcc.c

В итоге после  дополнения файлов получаем 

m16

Нажимаем Ok.

Проверяем 

m8_1

И получаем окно результата

m17

Хорошо! Ошибок нет!!!

Открываем 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);     
         }    
    
}

*****************************************************************************

Все сохраняем и 

m18

Должно выйти окно без ошибок 

m19

Хорошо! Осталось проверить - записать в микроконтроллер и увидеть как включается и гаснет светодиод

для этого 

m20

Загрузка в микроконтроллер должна пройти без ошибок и должен быть создан *.hex файл для внешнего программатора

m21

Далее 

m22

и RUN 

m23

 

Должно получиться как на видео см. ниже.!!

Ура !!! Все получилось!!!!

Ссылка на проект !!!

Видео файл

 

P.S.  

Добавил видео создание проекта для микроконтроллера STM32F030F4P6 с нуля - как создать проект, как подключить папки, как установить частоту работы микроконтроллера. Видео без звука. Но все делается подробно. Если будут вопросы направляем  на почту stm32@stm32res.ru

 

 

 

Яндекс.Метрика