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

Первый проект на STM32F407VE Keil

Опубликовано stm32 - Птн, 03/29/2019 - 21:15

Keil uVision5 - самое начало ...

В этой статье мы рассмотрим пример создания проекта с нуля для платы STM32F4VE . Мы создадим проект, подключим к нему необходимые библиотеки, создадим отдельные файлы в которых будем хранить настройки портов микроконтроллера и будем к ним обращаться из основной программы. Итоговая программа будет исполнять следующее задание - при нажатии на кнопку установленную на плате будет загораться светодиод. Одна кнопка один светодиод. Эта статья не будет объяснять как настраивать порты и писать правильно функции и обращения - статья для тех у кого возникают проблемы в самом начале работы с редактором Keil uVision5 и для тех кто не решается на него перейти .. пока не решается ..

Итак начнем:

Создадим папку в которой будет находиться наш проект - в моем случае это 407 (от названия микроконтроллера).

 

701

Копируем в созданную папку библиотеки. Я стараюсь всегда все сохранить в каждом проекте т.к. через определенное время очень сложно бываем найти нужное. Название папок соответствует названиям папок которые были в архиве при скачивании их с сайта ST.сомЭто библиотеки для четвертой версии микроконтроллеров. Подробно я рассказывал как их найти в примере для платы STM32F103C8, но можно скачать у меня CMSIS и STM32F4xx_StdPeriph_Driver

 

702

Также в одну из папок копируем два основных файла это stm32f4xx.h и stm32f4xx_conf.h

703

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

703_6

Запускаем Keil uVision5 

705

Создаем проект

706

Выбираем ранее созданную папку и в ней создаем файл проекта

707

Сохраняем название проекта и автоматически попадаем в окно выбора микроконтроллера. 

708

Выбираем тот что установлен на плате 

709

Ок и переходим в следующее окно. В нем Keil uVision5 предлагаем установить необходимые библиотеки автоматически. 

7010

Выбираем для проекта.

7011

Нажимаем OK и переходим в основное окно

7012

Меняем название на User и добавляем в проект  

 

7013

Основной файл main.c

7014

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

Выбираем Location - Обзор папок 

7015

Переходим в директорию ищем папку Main или создаем ее ...

7016

7017

 7018

Когда все выбрано и создано нажимаем Add. Возвращаемся в основное окно выбираем Project - Options for ...

7020

И переходим в настройки проекта. Меняем частоту на 8 000 000 Гц.

7021

Переходим на вкладку C/C++

7022

И заполняем ее начиная с Include Paths

7023

Добавляем все пути к папкам и библиотекам 

7024

В итоге должно быть так 

7026

Нажимаем OK  и в основном окне добавляем в строку Define следующую строку 

USE_STDPERIPH_DRIVER,STM32F4XX

7027

Нажимаем Ok и возвращаемся в основное окно. Добавляем в main.c следующие строки 

#include "main.h"
#include "stm32f4xx.h"                  
#include "stm32f4xx_conf.h"
#include "stm32f4xx_rcc.h"
#include "stm32f4xx_gpio.h"

 

7028

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

 

7029

Полученный вид 

7030

Находим скопированный main.h и открываем его. Будем использовать его для определение и всего того, что мешает в основном main.c 

7031

Начинаем его заполнять его содержанием..

#ifndef MAIN_H
#define MAIN_H


#endif

При этом не забывая про последнюю пустую строку!!!!!!

 

7032

После того как мы записали в main.h начальные строчки. Создадим еще два файла в которых будем хранить настройки портов ввода и вывода. Назовем этот файл как port_ini.c и соответственно port_ini.h 

Начнем с создания port_ini.c (по аналогии с main.c и в туже папку)

 

7033

После создания файла открываем его и вносим в него следующие строчки 

#include "port_ini.h" 

7034

Сохраняем файл и переходим к созданию port_ini.h 

7035

После создания файла открываем его и вносим следующие строки

#ifndef PORT_INI_H
#define PORT_INI_H
#include "stm32f4xx.h" 

void GPIO_init(void); 
void button_ini(void);


#endif

Не забываем про пустую строку ..

7036

Нажимаем F7 и как в прошлый раз мы можем удалить port_ini.h т.к. его копия переместилась в + port_ini.c

7037

Отлично ! Подготовительную чать создали. Перейдем к программе управления светодиодами и кнопками - и заодно убедимся, что модульная система (тогда когда в основном файле main.c) только основная программа. 

Выбираем вкладку    port_ini.c и вносим следующие данные для инициализации портов микроконтроллера

 

#include "port_ini.h"

// Конфигурируем порты для управления светодиодами 

void GPIO_init(void)
{
        GPIO_InitTypeDef GPIO_InitStructure;                                                       // создаем структуру
        RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOB,ENABLE);     // включаем тактирования порта В
        RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA,ENABLE);     // включаем тактирование порта А
    
    
    // Светодиод на плате подключенный к порту РА 6 
      GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6;                                       // Пин 6
      GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz;                   // 2 Mhz 
      GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;                     // настроен на выход
      GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;                         // Подтяжка
      GPIO_InitStructure.GPIO_OType = GPIO_OType_OD;          
      GPIOA->ODR ^= GPIO_Pin_6;                                                             // отключаем сразу светодиод
      GPIO_Init(GPIOA, &GPIO_InitStructure);
        
  
    // Светодиод на плате подключенный к порту РА 7     
      GPIO_InitStructure.GPIO_Pin = GPIO_Pin_7;
      GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz;
      GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;
      GPIO_InitStructure.GPIO_OType = GPIO_OType_OD;
      GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;    
      GPIOA->ODR ^= GPIO_Pin_7;
      GPIO_Init(GPIOA, &GPIO_InitStructure);
        
        
}

   void button_ini(void)
    {
       RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOE,ENABLE);     // включаем тактирование порта А
             
       GPIO_InitTypeDef init_button;   // Определяем структуру

// Кнопка на плате подключенная к порту РЕ 3 
      init_button.GPIO_Pin = GPIO_Pin_3;    
      init_button.GPIO_Mode = GPIO_Mode_IN; 
      init_button.GPIO_Speed = GPIO_Low_Speed ;
       
      init_button.GPIO_PuPd = GPIO_PuPd_UP;    
      GPIO_Init(GPIOE, &init_button); 
             
   // Кнопка на плате подключенная к порту РЕ 4
      init_button.GPIO_Pin = GPIO_Pin_4;
      init_button.GPIO_Mode = GPIO_Mode_IN; 
      init_button.GPIO_Speed = GPIO_Low_Speed ;
      init_button.GPIO_PuPd = GPIO_PuPd_UP;
      GPIO_Init(GPIOE, &init_button);
         }
     Не забываем про пустую строчку !!!!  

 

7039

7038

Все сохраняем и жмем F7 и получаем ошибку !!!!

Error: L6218E: Undefined symbol GPIO_Init (referred from port_ini.o). 

7040

Чтобы исправить ошибку необходимо сделать следующее. Пропишем основные файлы которые хоть и указаны в путях к проекту, но не определяются корректно ..

Итак выбираем User жмем   правую клавишу мыши и выбираем следующий пункт меню Manage Project Items... 

 7041

В появившемся окне видны подключенные к проекту. Правое окно. Добавим в него нам необходимые файлы stm32f4xx_rcc.с и stm32f4xx_gpio.с.

 

7042

Нажимаем Add Files ... и добавляем эти файлы

7043

7044

7045

7046

Жмем Add

7047

Жмем Add

В итоге должно получиться ..

7048

Нажимаем Ok

7049

Жмем F7 и видим что ошибка пропала и мы можем писать программу дальше.

7050

Определяем в файле  port_ini.h следующие данные

#ifndef PORT_INI_H
#define PORT_INI_H
#include "stm32f4xx.h" 

void GPIO_init(void); 
void button_ini(void);


#endif

 

7051

Дополняем main.c основной программой

 

#include "main.h"
#include "stm32f4xx.h"                  
#include "stm32f4xx_conf.h"
#include "stm32f4xx_rcc.h"
#include "stm32f4xx_gpio.h"

//*******************************************************
//*******************************************************

int main(void)
{    
  //  Инициализируем порты 
        GPIO_init();    
    //  Инициализируем кнопки    
         button_ini();
    
    
      while (1)
     {      
             if (BUTTON_k1 == 0)                                          // Смотрим схему на плату 
                 {
                     GPIO_ResetBits(GPIOA, GPIO_Pin_6); //Подаем «0» на PA6 светодиод светиться
               }
          else 
          {
           GPIO_SetBits(GPIOA, GPIO_Pin_6); //Подаем «1» на PA6  иначе не светиться

                    }                        
         if (BUTTON_k0 == 0) 
                 {
                     GPIO_ResetBits(GPIOA, GPIO_Pin_7); //Подаем «0» на PA7
               }    
              else 
          {
           GPIO_SetBits(GPIOA, GPIO_Pin_7); //Подаем «1» на PA6

                    }        

         }    
    
}

 

7053

 

Программа простая - при нажатии на кнопку К- загорается светодиод.

Ниже привожу листинг файлов 

1. main.с 

#include "main.h"
#include "stm32f4xx.h"                  
#include "stm32f4xx_conf.h"
#include "stm32f4xx_rcc.h"
#include "stm32f4xx_gpio.h"

//*******************************************************
//*******************************************************

int main(void)
{    
//  Инициализируем порты 
  GPIO_init();    
 //  Инициализируем кнопки    
  button_ini();
  while (1)
     {      
     if (BUTTON_k1 == 0) 
      {
      GPIO_ResetBits(GPIOA, GPIO_Pin_6); //Подаем «0» на PA6 
       }
      else 
       {
       GPIO_SetBits(GPIOA, GPIO_Pin_6); //Подаем «1» на PA6

        }                        
         if (BUTTON_k0 == 0) 
       {
         GPIO_ResetBits(GPIOA, GPIO_Pin_7); //Подаем «0» на PA7
        }    
          else 
        {
         GPIO_SetBits(GPIOA, GPIO_Pin_7); //Подаем «1» на PA6

        }        

         }    
    
}

main.h

#ifndef MAIN_H
#define MAIN_H

 // Переопределим на более удобные названия кнопки 
 
#define BUTTON_k1 GPIO_ReadInputDataBit(GPIOE, GPIO_Pin_3)
#define BUTTON_k0 GPIO_ReadInputDataBit(GPIOE, GPIO_Pin_4)

#endif

 

Port_ini.c

#include "port_ini.h"

// Конфигурируем порты для управления светодиодами 

void GPIO_init(void)
{
   GPIO_InitTypeDef GPIO_InitStructure;                     // создаем структуру
   RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOB,ENABLE);     // включаем тактирования порта В
   RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA,ENABLE);     // включаем тактирование порта А
    
  //  Настройка порта под светодиод -> PB0   - этого светодиода нет на плате
                      
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1; 
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT; 
    GPIO_Init(GPIOB, &GPIO_InitStructure);
    
   // Светодиод на плате подключенный к порту РА 6 -  
      GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6;
      GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz;
      GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;    
      GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;
      GPIO_InitStructure.GPIO_OType = GPIO_OType_OD;
      GPIOA->ODR ^= GPIO_Pin_6;
      GPIO_Init(GPIOA, &GPIO_InitStructure);
        
   // Светодиод на плате подключенный к порту РА 7     
      GPIO_InitStructure.GPIO_Pin = GPIO_Pin_7;
      GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz;
      GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;
      GPIO_InitStructure.GPIO_OType = GPIO_OType_OD;
      GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;    
      GPIOA->ODR ^= GPIO_Pin_7;
      GPIO_Init(GPIOA, &GPIO_InitStructure);
       
}

     void button_ini(void)
         {
     RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOE,ENABLE);     // включаем          тактирование порта А
      GPIO_InitTypeDef init_button;                                                                     // создаем структуру

// Кнопка на плате подключенная к порту РЕ 3 
      init_button.GPIO_Pin = GPIO_Pin_3;    
      init_button.GPIO_Mode = GPIO_Mode_IN; 
      init_button.GPIO_Speed = GPIO_Low_Speed ;
      init_button.GPIO_PuPd = GPIO_PuPd_UP;    
      GPIO_Init(GPIOE, &init_button); 
             
   // Кнопка на плате подключенная к порту РЕ 4
      init_button.GPIO_Pin = GPIO_Pin_4;
      init_button.GPIO_Mode = GPIO_Mode_IN; 
      init_button.GPIO_Speed = GPIO_Low_Speed ;
      init_button.GPIO_PuPd = GPIO_PuPd_UP;
     GPIO_Init(GPIOE, &init_button);
      }
         

Port_ini.h

#ifndef PORT_INI_H
#define PORT_INI_H
#include "stm32f4xx.h" 

void GPIO_init(void); 
void button_ini(void);

#endif

Ура!!!  Светодиоды должны включаться и выключаться при нажатии на кнопки K1 и K0 на плате.

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

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