Keil uVision5 - самое начало ...
В этой статье мы рассмотрим пример создания проекта с нуля для платы STM32F4VE . Мы создадим проект, подключим к нему необходимые библиотеки, создадим отдельные файлы в которых будем хранить настройки портов микроконтроллера и будем к ним обращаться из основной программы. Итоговая программа будет исполнять следующее задание - при нажатии на кнопку установленную на плате будет загораться светодиод. Одна кнопка один светодиод. Эта статья не будет объяснять как настраивать порты и писать правильно функции и обращения - статья для тех у кого возникают проблемы в самом начале работы с редактором Keil uVision5 и для тех кто не решается на него перейти .. пока не решается ..
Итак начнем:
Создадим папку в которой будет находиться наш проект - в моем случае это 407 (от названия микроконтроллера).
Копируем в созданную папку библиотеки. Я стараюсь всегда все сохранить в каждом проекте т.к. через определенное время очень сложно бываем найти нужное. Название папок соответствует названиям папок которые были в архиве при скачивании их с сайта ST.сом. Это библиотеки для четвертой версии микроконтроллеров. Подробно я рассказывал как их найти в примере для платы STM32F103C8, но можно скачать у меня CMSIS и STM32F4xx_StdPeriph_Driver
Также в одну из папок копируем два основных файла это stm32f4xx.h и stm32f4xx_conf.h
Также для основных файлов проекта я создаю отдельную папку Main. И все создаваемые файлы буду копировать в нее.
Запускаем Keil uVision5
Создаем проект
Выбираем ранее созданную папку и в ней создаем файл проекта
Сохраняем название проекта и автоматически попадаем в окно выбора микроконтроллера.
Выбираем тот что установлен на плате
Ок и переходим в следующее окно. В нем Keil uVision5 предлагаем установить необходимые библиотеки автоматически.
Выбираем для проекта.
Нажимаем OK и переходим в основное окно
Меняем название на User и добавляем в проект
Основной файл main.c
Но прежде чем его добавить кнопкой Add - сохраняем его в папку Main которую создали ранее.
Выбираем Location - Обзор папок
Переходим в директорию ищем папку Main или создаем ее ...
Когда все выбрано и создано нажимаем Add. Возвращаемся в основное окно выбираем Project - Options for ...
И переходим в настройки проекта. Меняем частоту на 8 000 000 Гц.
Переходим на вкладку C/C++
И заполняем ее начиная с Include Paths
Добавляем все пути к папкам и библиотекам
В итоге должно быть так
Нажимаем OK и в основном окне добавляем в строку Define следующую строку
USE_STDPERIPH_DRIVER,STM32F4XX
Нажимаем Ok и возвращаемся в основное окно. Добавляем в main.c следующие строки
#include "main.h"
#include "stm32f4xx.h"
#include "stm32f4xx_conf.h"
#include "stm32f4xx_rcc.h"
#include "stm32f4xx_gpio.h"
Нажимаем F7 и собираем проект. После того как проект собрался без ошибок мы можем удалить файл main.h т.к. он скопировался в +main.c.
Полученный вид
Находим скопированный main.h и открываем его. Будем использовать его для определение и всего того, что мешает в основном main.c
Начинаем его заполнять его содержанием..
#ifndef MAIN_H
#define MAIN_H
#endif
При этом не забывая про последнюю пустую строку!!!!!!
После того как мы записали в main.h начальные строчки. Создадим еще два файла в которых будем хранить настройки портов ввода и вывода. Назовем этот файл как port_ini.c и соответственно port_ini.h
Начнем с создания port_ini.c (по аналогии с main.c и в туже папку)
После создания файла открываем его и вносим в него следующие строчки
#include "port_ini.h"
Сохраняем файл и переходим к созданию port_ini.h
После создания файла открываем его и вносим следующие строки
#ifndef PORT_INI_H
#define PORT_INI_H
#include "stm32f4xx.h"
void GPIO_init(void);
void button_ini(void);
#endif
Не забываем про пустую строку ..
Нажимаем F7 и как в прошлый раз мы можем удалить port_ini.h т.к. его копия переместилась в + port_ini.c
Отлично ! Подготовительную чать создали. Перейдем к программе управления светодиодами и кнопками - и заодно убедимся, что модульная система (тогда когда в основном файле 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);
}
Не забываем про пустую строчку !!!!
Все сохраняем и жмем F7 и получаем ошибку !!!!
Error: L6218E: Undefined symbol GPIO_Init (referred from port_ini.o).
Чтобы исправить ошибку необходимо сделать следующее. Пропишем основные файлы которые хоть и указаны в путях к проекту, но не определяются корректно ..
Итак выбираем User жмем правую клавишу мыши и выбираем следующий пункт меню Manage Project Items...
В появившемся окне видны подключенные к проекту. Правое окно. Добавим в него нам необходимые файлы stm32f4xx_rcc.с и stm32f4xx_gpio.с.
Нажимаем Add Files ... и добавляем эти файлы
Жмем Add
Жмем Add
В итоге должно получиться ..
Нажимаем Ok
Жмем F7 и видим что ошибка пропала и мы можем писать программу дальше.
Определяем в файле port_ini.h следующие данные
#ifndef PORT_INI_H
#define PORT_INI_H
#include "stm32f4xx.h"
void GPIO_init(void);
void button_ini(void);
#endif
Дополняем 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
}
}
}
Программа простая - при нажатии на кнопку К- загорается светодиод.
Ниже привожу листинг файлов
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 на плате.
На этом примере мы научились с нуля создавать проект который имеет в своей структуре несколько файлов в которых удобно хранить и настраивать от дельно от основного файла.
- Войдите или зарегистрируйтесь, чтобы оставлять комментарии