Примеры программ в keil

Микроконтроллеры STM32 построены на основе архитектуры ARM Cortex M. В настоящее время они становятся все более популярными благодаря их высокой производительности и относительно невысокой стоимости. Ранее мы рассматривали программирование платы STM32F103C8, также известной под названием STM32 Blue Pill («синяя таблетка») с помощью Arduino IDE как с использованием внешнего FTDI программатора, так и через USB разъем.

Программирование платы STM32 с помощью Arduino IDE достаточно простое и открывает возможность использования множества библиотек, разработанных для платформы Arduino. В этом случае вам нет необходимости глубоко погружаться в изучение архитектуры ARM. Но в этой статье мы попробуем подняться на более высокий уровень в программировании плат STM32, который позволит нам не только улучшить структуру нашего программного кода, но также сэкономить объем памяти за счет неиспользования не нужных нам библиотек.

Внешний вид проекта программирования платы STM32 Blue Pill с помощью Keil uVision и STM32CubeMX

Creating first project with keil uvision 5 ARM

Для этого компания STMicroelectronics разработала инструмент под названием STM32Cube MX, который автоматически формирует базовый код для нашей программы исходя из используемой платы STM32 и подключенных к ней периферийных устройств. Таким образом, у нас отпадает необходимость написания кода для основных драйверов и периферийных устройств. В дальнейшем этот автоматически сгенерированный код можно отредактировать в программной среде Keil uVision. Законченную версию программы можно загрузить в плату STM32 с помощью программатора ST-Link, разработанного компанией STMicroelectronics.

В данной статье мы рассмотрим программирование платы STM32F103C8 (Blue Pill) с помощью Keil uVision и STM32CubeMX. В качестве периферийных устройств, подключенных к плате, будут использоваться кнопка и светодиод. Сначала мы автоматически сгенерируем код программы с помощью инструмента STM32Cube MX, а затем отредактируем его в программе Keil uVision.

Необходимые компоненты

Аппаратное обеспечение

  1. Плата разработки STM32F103C8 (STM32 Blue Pill) (купить на Aliexpress).
  2. Программатор ST-LINK V2 (купить на Aliexpress).
  3. Кнопка.
  4. Светодиод (купить на Aliexpress).
  5. Макетная плата.
  6. Соединительные провода.

Программное обеспечение

  1. Инструмент генерации кода STM32CubeMX.
  2. Keil uVision 5.
  3. Драйверы для ST-Link V2.

ST-LINK V2 представляет собой программатор со встроенным дебаггером для микроконтроллеров STM8 и STM32. С его помощью можно также загружать программный код для нашей платы отладки STM32F103C8. Для взаимодействия с микроконтроллерами STM8 и STM32 программатор ST-LINK V2 содержит интерфейсы SWIM (single wire interface module) и JTAG/ SWD (serial wire debugging). Программатор работает через USB интерфейс и может работать с такими интегрированными средами разработки как Atollic, IAR, Keil или TASKING

Keil uVision Tutorial for beginners

Внешний вид программатора ST-LINK V2 показан на следующем рисунке.

Внешний вид программатора ST-LINK V2

Показанный на рисунке программатор ST-LINK V2 поддерживает полный диапазон интерфейсов отладки SWD, который представляет собой простой 4-х проводный интерфейс и отличается хорошей стабильностью работы. Программатор ST-LINK V2 доступен во множестве цветовых решений и изготавливается из алюминиевого сплава. Для индикации режимов работы программатор содержит в своем составе светодиод синего цвета. Названия контактов подписаны на корпусе программатора.

Программатор ST-LINK V2 может подключаться к программному обеспечению Keil и с его помощью загружать код программы в микроконтроллеры STM32. Распиновка программатора ST-LINK V2 показана на следующем рисунке.

Распиновка программатора ST-LINK V2

Примечание : во время первого подключения программатора ST-LINK V2 к компьютеру необходимо установить драйверы для работы с ним, которые можно скачать по следующей ссылке. Выбирайте драйвер, подходящий для вашей операционной системы.

STM32CubeMX

Инструмент STM32CubeMX представляет собой часть экосистемы STMCube, разработанной компанией STMicroelectronics. Данный инструмент позволяет значительно облегчить разработку программного кода для микроконтроллеров STM32. STM32CubeMX включает графическую оболочку и позволяет производить формирование программного кода на языке C с помощью графических инструментов. Далее этот программный код может быть использован в различных программах: keil uVision, GCC, IAR и т.д. Скачать STM32CubeMX можно по следующей ссылке.

Особенности STM32CubeMX:

  • эффективное решающее устройство;
  • помощник синхронизации;
  • калькулятор потребляемой мощности;
  • утилиты, осуществляющие конфигурацию периферийных устройств микроконтроллера, таких как контакты GPIO, USART и т.д.
  • утилиты, осуществляющие программную конфигурацию стека протоколов TCP/IP, USB и т.д.

Схема проекта

Схема подключения светодиода, кнопки и программатора ST-LINK V2 к плате STM32F103C8 (Blue Pill) представлена на следующем рисунке.

Схема подключения светодиода, кнопки и программатора ST-LINK V2 к плате STM32F103C8 (Blue Pill)

Плата STM32 Blue Pill в нашем проекте получает питание от программатора ST-LINK, который, в свою очередь, подключен к USB порту компьютера. Поэтому нам не нужно отдельно подавать питание на плату STM32 Blue Pill. Схема соединений между платой STM32F103C8 и программатором ST-LINK V2 приведена в следующей таблице.

Плата STM32F103C8 ST-LINK V2
GND GND
SWCLK SWCLK
SWDIO SWDIO
3V3 3.3V

Светодиод в нашей схеме используется для индикации нажатия кнопки. Анод светодиода подключен к контакту PC13 платы STM32 Blue Pill, а катод подключен к общему проводу (земле).

Кнопка подключена к контакту PA1 платы STM32 Blue Pill с помощью подтягивающего резистора 10 кОм.

Внешний вид собранной конструкции проекта показан на следующем рисунке.

Внешний вид собранной конструкции проекта

Создание и загрузка программы в плату STM32 с помощью Keil uVision и ST-Link

Выполните следующую последовательность шагов

Шаг 1. Первым делом установите все необходимые драйверы для программатора ST-LINK V2, программы STM32CubeMX и Keil uVision, а также необходимые пакеты для платы STM32F103C8.

Шаг 2. Запустите STM32CubeMX.

Шаг 3. В нем нажмите на New Project (новый проект).

Создание нового проекта STM32Cube MX

Шаг 4. После этого выполните поиск и выберите микроконтроллер STM32F103C8.

Выбор микроконтроллера STM32F103C8 в STM32Cube MX

Шаг 5. На экране появится распиновка платы STM32F103C8, на которой вы можете задать необходимую конфигурацию (режимы работы) контактов. Также вы можете выбрать контакты для подключения периферийных устройств.

Распиновка платы STM32F103C8 в программе STM32CubeMX

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

Выбор режима работы контакта в программе STM32CubeMX

Шаг 7. Для нашего проекта мы выбрали для контакта PA1 режим работы GPIO INPUT (на ввод данных), для контакта PC13 – GPIO OUTPUT, для отладки (debug) SYS – SERIAL WIRE (к этим контактам мы будем подключать контакты ST-LINK SWCLK configured) контакты окрашиваются в зеленый цвет как показано на следующем рисунке.

Читайте также:
Требования к программам комплексного развития коммунальной инфраструктуры

Выбранные в программе STM32CubeMX режимы контактов для нашего проекта

Шаг 8. Далее под вкладкой конфигурации (Configuration tab) выберите GPIO чтобы установить конфигурацию (режимы работы) для контактов, которые мы выбрали на предыдущем шаге.

Отображение режима работы контактов в программе STM32CubeMX

Шаг 9. Затем в окне настройки конфигурации контактов (pin configuration box) мы можем настроить пользовательские метки для используемых нами контактов, то есть дать этим контактам осмысленные имена.

Настройка пользовательских меток для контактов в программе STM32CubeMX

Шаг 10. После этого выберите пункт меню Project >> Generate Code.

Запуск в программе STM32CubeMX режима генерации кода

Шаг 11. Появится диалоговое окно с настройками проекта. В этом окне вам необходимо ввести имя проекта и его местоположение, а также используемый инструментарий. Мы используем программу Keil, поэтому в качестве интегрированной среды разработки (IDE) выберите MDK-ARMv5.

Изменение настроек проекта в программе STM32CubeMX

Шаг 12. Далее под вкладкой генерации кода (Code Generator tab) выберите пункт «Copy only the necessary library files» и затем нажмите OK.

Выбор режима копирования файлов библиотек в программе STM32CubeMX

Шаг 13. Появится диалоговое окно генерации кода. Выберите Open Project чтобы автоматически открыть генерацию кода в Keil uvsion.

Открытие генерации кода в Keil uvsion

Шаг 14. Откроется инструмент Keil uVision с нашим автоматически сгенерированным кодом в STM32CubeMx и нашим введенным именем проекта с необходимыми подключенными библиотеками и кодами для контактов, работу которых мы настроили ранее.

Запуск Keil uVision с нашим автоматически сгенерированным кодом в STM32CubeMx

Шаг 15. Теперь нам необходимо настроить логику работы программы. Например, включать светодиод (контакт PC13) при нажатии кнопки (контакт PA1) и выключать светодиод при отпускании кнопки. Поэтому выберите файл main.c чтобы включить в него необходимые фрагменты кода.

Выбор редактируемого файла в Keil uVision

Шаг 16. Добавьте следующий фрагмент кода в цикл while(1).

Источник: microkontroller.ru

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

В этой статье мы рассмотрим пример создания проекта с нуля для платы 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);

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

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,

// Светодиод на плате подключенный к порту РА 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,

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,

// Кнопка на плате подключенная к порту РЕ 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,
>
Не забываем про пустую строчку .

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

7047

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

7048

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);

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)

Port_ini.c

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

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,

// Светодиод на плате подключенный к порту РА 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,

// Светодиод на плате подключенный к порту РА 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,

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,

// Кнопка на плате подключенная к порту РЕ 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,
>

Port_ini.h

#ifndef PORT_INI_H
#define PORT_INI_H
#include «stm32f4xx.h»

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

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

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

  • Войдите или зарегистрируйтесь, чтобы оставлять комментарии

Источник: www.stm32res.ru

Начало работы с STM32 в Keil MDK-ARM

STM32 — это семейство 32-разрядных микроконтроллеров фирмы STMicroelectronics.

Микроконтроллеры содержат микропроцессорное ядро ARM, точнее ARM Cortex-M. Это ядро присуще не только микроконтроллерам STM32, оно существует само по себе, и на его основе выпускается множество микроконтроллеров от разных производителей.

Keil MDK-ARM (произносится «Кеил эм-ди-кей арм») — это среда разработки для микроконтроллеров с ядром ARM Cortex-M.

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

Существует множество других сред разработки. Например, последнее время автор пользуется средой, которую описал в другой статье. Но в этой пойдет речь о Keil MDK-ARM, потому что она имеет большую популярность и достаточно проста.

Первым делом качаем последнюю версию Keil MDK-ARM с официального сайта. Она имеет ряд ограничений, которые не влияют на большинство задач. Самое существенное ограничение состоит в том, что среда не сгенерирует программу объемом больше 32 КБ, но такую программу надо постараться написать. Хотя микроконтроллеры STM32 часто имеют намного больший объем, вплоть до 2 МБ.

На момент написания статьи последняя версия Keil MDK-ARM — 5.18 (от 5 февраля 2016).

Чтобы скачать среду, надо заполнить форму на сайте Keil:

Форма для скачивания MDK-ARM

Следует ввести настоящий адрес электронной почты, иначе сайт будет ругаться. После заполнения и нажатия Submit, дается ссылка для скачивания:

Сcылка для скачивания MDK-ARM

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

Качаем и устанавливаем. Установленная среда занимает на диске около 1,3 ГБ. После установки автоматически запускается менеджер пакетов:

Менеджер пакетов

Он нужен, чтобы качать, устанавливать и обновлять различные дополнения (пакеты).

Менеджер пакетов появился в MDK-ARM версии 5, что уменьшило объем установочного файла почти в два раза (версия 4.71 была объемом 550 МВ, а версия 5.00 — 300 МБ).

В левой части менеджера мы выбираем устройства (микроконтроллеры), а в правой соответствующие им пакеты.

Допустим, нам надо вести разработку под микроконтроллер STM32F407VG, который установлен на отладочной плате STM32F4-Discovery.

Тогда находим этот микроконтроллер в списке слева и устанавливаем соответствующий пакет DFP:

Установка DFP

Можно заметить, что среди установленных пакетов есть CMSIS. CMSIS — это библиотека для ядра Cortex-M, общая для всех микроконтроллеров. Библиотека разрабатывается фирмой ARM и доступна для скачивания с официального сайта после регистрации. Можно было бы не устанавливать этот пакет, а пользоваться официальным выпуском библиотеки, но это дополнительные сложности.

Закрываем менеджер пакетов и запускаем Keil uVision5 (произносится мю-вижен):

Читайте также:
Художественная литература средняя группа программа детство

Значек Keil uVision5

Keil uVision5 — это часть MDK-ARM, графический интерфейс среды, который включает редактор кода:

Keil uVision5

Я рекомендую произвести небольшую настройку редактора. Выбираем меню «Edit -> Configuration…», и производим следующие настройки:

Настройка Keil uVision5

  1. Кодировка UTF-8.
  2. Правая граница кода в 80 символов.
  3. Отступы по 4 пробела.

Эти настройки довольно спорные. У каждого разработчика свои предпочтения.

Теперь создаем проект. Для этого выбираем меню «Project -> New uVision Project…». В открывшемся окне выбираем расположение и имя проекта. Для проекта лучше создать отдельную папку и сохранить проект туда.

После сохранения появится окно выбора устройства. Выбираем нужный микроконтроллер и нажимаем «ОК». Если бы мы не установили нужный пакет, то микроконтроллера не было бы в списке:

Выбор микроконтроллера

В следующем окне предстоит выбрать компоненты, которые будут использоваться в проекте. Необходимо выбрать «CMSIS:CORE» и «Device:Startup»:

Компоненты CMSIS и Startup

После нажатия «OK» процесс создания проекта завершится.

В дальнейшем вы всегда сможете запустить окно выбора компонентов, чтобы добавить или удалить их. Для этого надо выбрать меню «Project -> Manage -> Run-Time Evironment…».

При выборе компонентов может оказаться, что какой-то компонент зависит от других компонентов, которые вы не выбрали. Об этом вы узнаете из сообщений в нижней части окна. Необходимо будет выбрать зависимые компоненты.

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

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

Здесь мы видим название проекта «example», цель проекта «Target 1», пустую группу файлов «Source Group 1», компоненты CMSIS и Device.

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

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

В структуре мы видим два файла. Один с расширением «s». Он содержит исходный код на языке ассемблера. Другой с расширением «с». Он содержит исходный код на языке Си.

Собрать проект и получить файл прошивки можно нажав клавишу F7. Но в таком виде проект не будет собран и вы получите ошибку, потому что отсутствует функция «main()».

Функция «main()» — это точка входа в вашу программу, то с чего начинается программа. Ее наличие обязательно если вы пишите программу на языке Си.

Давайте создадим эту функцию. Кликнем на группе «Source Group 1» правой кнопкой и выберем «Add New Item to ‘Source Group 1’…» (перевод: добавить новый элемент в группу ‘Source Group 1’). Создадим файл «main.c»:

Создание файла main.c

В созданный файл добавим код:

int main()

В конец файла стоит добавить пустую строку, иначе при сборке вы получите предупреждение «warning: #1-D: last line of file ends without a newline».

Теперь проект можно собрать клавишей F7. В результате вы получите файл «Objectsexample.axf» (по умолчанию имя файла совпадает с именем проекта). Файл располагается в папке с проектом.

Обычно разработчику требуется файл прошивки в формате Intel HEX. Чтобы получить его, надо произвести настройку цели. Чтобы увидеть настройки цели нажмите Alt-F7, перейдите на вкладку «Output» и выберите «Create HEX File».

После очередной сборки вы получите файл «Objectsexample.hex».

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

Запустим выбор компонентов с помощью меню «Project -> Manage -> Run-Time Evironment…» и выберем компонент «Device:STM32Cube Hal:GPIO».

В нижней части окна мы увидим неудовлетворенную зависимость «Device:STM32Cube Hal:Common». Выберем этот компонент и увидим еще больший список зависимостей. Необходимо выбрать все требуемые зависимости:

  • Device:STM32Cube Hal:Common
  • Device:STM32Cube Hal:RCC
  • Device:STM32Cube Hal:PWR
  • Device:STM32Cube Hal:Cortex
  • Device:STM32Cube Framework:Classic

STM32Cube — это библиотека, которую предоставляет STMicroelectronics.

При выборе компонентов мы выбираем какие возможности этой библиотеки использовать.

Микроконтроллер, кроме ядра, содержит большое количество периферийных устройств: АЦП, ЦАП, таймеры, различные интерфейсы и многое другое. Каждое периферийное устройство имеет свое название. Например, устройство для работы с портами микроконтроллера называется GPIO, об этом можно узнать из документации на микроконтроллер.

Библиотека STM32Cube многоуровневая, то есть включает в себя множество промежуточных библиотек. Одна из промежуточных библиотек называется STM32Cube HAL, или просто HAL. Она поделена на модули и каждый модуль соответствует какому-нибудь периферийному устройству. Название модуля совпадает с названием устройства, например, имеется модуль GPIO.

Существует большое количество документации по STM32Cube. Но основное описание по работе с периферийными устройствами содержится в руководстве по HAL. Это руководство разработчик использует большую часть времени. Обратимся к нему, чтобы заставить шевелиться ножки микроконтроллера.

Для начала подключим HAL в нашей программе, добавив строчку перед определением функции «main()»:

#include «stm32f4xx_hal.h»

В самом начале функции «main()» вызовем функцию «HAL_Init()», которая инициализирует библиотеку.

Таким образом мы получим следующий код в файле «main.c»:

#include «stm32f4xx_hal.h» int main()

Продолжение следует…

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

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

В статье я хотел еще привести конечный код и объяснить, как он работает. Могу лишь поделиться непроверенной программой:

#include «stm32f4xx_hal.h» int main() < HAL_Init(); // Разрешить тактирование порта A. __HAL_RCC_GPIOA_CLK_ENABLE(); // Настройки порта. GPIO_InitTypeDef s; s.Pin = GPIO_PIN_0; // Вывод 0. s.Mode = GPIO_MODE_OUTPUT_PP; // Цифровой выход. s.Pull = GPIO_NOPULL; // Без подтяжки. s.Speed = GPIO_SPEED_FREQ_VERY_HIGH; // Максимальная скорость. // Настроить вывод 0 порт A. HAL_GPIO_Init(GPIOA, // Бесконечно переключать состояние порта с максимальной скоростью. while(1) < HAL_GPIO_TogglePin(GPIOA, GPIO_PIN_0); >//return 0; > void SysTick_Handler(void)

Ссылки

  1. Скачать продукты Keil без заполнения формы.
  2. Скринкаст «Eclipse и GNU Tools для разработки под ARM-микроконтроллеры«.
  3. Микроконтроллер STM32F407VG.
  4. Отладочная плата STM32F4-Discovery.
  5. Библиотека STM32CubeF4.
  6. Руководство по STM32CubeF4 HAL.
  7. Библиотека CMSIS.
  8. Отсчет времени в STM32Cube.

Источник: bravikov.wordpress.com

Рейтинг
( Пока оценок нет )
Загрузка ...
EFT-Soft.ru