STM32F4 Начнем программировать CubeMX!
В этой статье мы покажем, какой необходимый набор программных средств и действий необходимо сделать для того, чтобы начать программировать и управлять ядром ARM производства ST.
Наш Опыт программирования различных процессоров начиная с архитектуры х86, С51, AVR, Nios II, TigerShark, ну и конечно STM32, точно нам говорит, что на сегодня почти всё сравнялось, и у всех производителей почти один и тот же подход. Конкретно о подходах и программировании того или иного кристалла и его особенностей мы поговорим дальше, а сейчас просто рассмотрим этапы проектирования и реализации прошивок для микроконтроллеров, который почти одинаков, во многих видах микроконтроллерах с какими то малыми изменениями. Рассмотрим их
Оглавление
1. Этапы проектирование ПО для микроконтроллеров STM32
3.1. Начинаем работать с STM32CubeMX
3.1.1. Структура STM32CubeF4_FirmWare
3.1.2. Настройка системы в CubeMX
3.1.2.1. Окно Настройки кристалла
3.1.2.2. Окно Схема тактирования МК
3.1.2.3. Окно Конфигурация Элементов МК
3.2.1. Генерируем инициализационный код, наконец-то
3.2.2. Начинаем программировать
4. Ура мы запустили Keil HAL LED
1. Этапы проектирование ПО для микроконтроллеров STM32
В этой статье мы покажем, какой необходимый набор программных средств и действий необходимо сделать для того, чтобы начать программировать и управлять ядром ARM производства ST.
Наш Опыт программирования различных процессоров начиная с архитектуры х86, С51, AVR, Nios II, TigerShark, ну и конечно STM32, точно нам говорит, что на сегодня почти всё сравнялось, и у всех производителей почти один и тот же подход. Конкретно о подходах и программировании того или иного кристалла и его особенностей мы поговорим дальше, а сейчас просто рассмотрим этапы проектирования и реализации прошивок для микроконтроллеров, который почти одинаков, во многих видах микроконтроллерах с какими то малыми изменениями. Рассмотрим их:
· Установка компилятора;
· Установка библиотек;
· Выбор языка разработки (ASM, C, C++);
· Выбор среды программы: либо это библиотеки, либо ОС.
o Библиотеки:
§ CMSIS, SPL, HAL;
o ОС :
§ CMSIS RTOS, μC/OS-II , FreeRTOS, Linux, Android и другие;
Теперь перейдем к компиляторам!
2. Установка компилятора
Самих компиляторов очень много под архитектуру ARM, вот основные и наиболее популярные :
· RealView Development Suite (ARM C/C++ Compiler)
· Keil MDK-ARM (ARM C/C++ Compiler)
· IAR Embedded Workbench for ARM (IAR C/C++ Compiler)
· MULTI IDE for ARM (Green Hills C/C++ Compiler)
· CooCox CoIDE (GCC Compiler)
Мы будем использовать Keil, потому что еще давно к нему привыкли J.
Наш проект мы будем компилировать, и запускать в версии Keil 5.17. Качаем его !
Ссылка – https://www.keil.com/download/product/.
Или какой нить не ниже 5.Х.
Установив переходим к установке системной вещи под названием CubeMX.
3. STM32CubeMX
Рис. 3.1 Обзор прицепов работы с CubeMX
STM32CubeMX – это генератор инициализационного кода для семейства STM32, позволяющий автоматически настроить всю периферию, для данного кристалла или сгенерировать инициализационный код для какого-нибудь отладочного набора.
STM32Cube является комплексным программным решением, комбинируя встроенное программное обеспечение элементов MCU на базе программного обеспечения STM32CubeMX. Встроенное программное обеспечение не только охватывает все микроконтроллеры STM32 с высокой переносимостью, драйверов низкого уровня, но поставляется с набором компоненты middleware уровня, такие как RTOS, USB, TCP / IP, файловая система или графика. STM32CubeMX помогает пользователю настроить STM32 MCU (распиновку, цепи тактирования и периферию) и программное обеспечение стеки. Она также может помочь оценить энергопотребление благодаря калькулятору расчета потребляемой мощности. В STM32Cube встроены библиотеки программного обеспечения и STM32CubeMX генератор кода / конфигуратор может быть использован независимо друг от друга, но их полный потенциал достигается когда они используются вместе; как только MCU настроен, Пользователь может генерировать инициализационный C код, основанный на произведённых настройках в STM32CubeMX.
Свои примеры мы будем показать на отладочной плате STM32F429I-DISCO.
Рис. 3.2. Вид отладочной платы STM32F429I-DISCO
Ссылка на страницу STM32CubeMX для всех семейств:
http://www.st.com/web/catalog/tools/FM147/CL1794/SC961/SS1533/PF259242 **
Ссылка на страницу STM32CubeMX для семейства STM32F4 набор библиотек :
· http://www.st.com/web/en/catalog/tools/PF259243
Устанавливаем его и переходим к процессу создания и настройки проекта для STM32.
** – внизу ссылка на саму программу, а для установки соответствующих библиотек , надо выбрать, соответствующий набор, подходящей для выбранного семейства, мы будем вести изложение на примере семейства STM32F4.
3.1. Начинаем работать с STM32CubeMX
Общие принципы работы в STM32CubeMX — создаем проект, выбираем микроконтроллер и нам сразу же предлагается большая схема со всеми выводами выбранного нами контроллера. Нажимая на выводы и заходя в разнообразные меню, мы легко настраиваем как периферию, так и режимы работы каждого конкретного вывода. Сразу же очевидные плюсы — можно наглядно увидеть, какие выводы уже заняты, а какие еще свободны (в крупных проектах — более чем полезная фишка). Как все это работает мы еще увидим на примере, а пока обсудим в общих чертах )
Итак, мы выбрали все нужные нам выводы, ввели все настройки периферии (например, частоты тактирования, режимы работы таймеров….), и STM32CubeMx дает нам возможность сгенерировать соответствующий код. То есть в итоге мы получаем готовый проект, с уже прописанными настройками, с подключенными библиотеками и с готовой инициализацией всей выбранной периферии. Базой для всего этого являются библиотеки CMSIS и HAL. (С CMSIS мы уже давно знакомы, а вот вторая библиотека — это что-то новое. – Здесб надо дать ссылку на статью, где описывается CMSIS SPL HAL)
Библиотека STM32 HAL Driver пришла (пока еще не окончательно) на смену всем хорошо известной библиотеке Standard Peripheral Library (SPL). В принципе, и структура и функции этих библиотек очень схожи, но HAL более заточена под принцип «вызвал функцию и сразу заработало». Для тех, кому не особо хочется возиться с какими-то низкоуровневыми настройками периферии — то что надо Естественно, на данный момент библиотека еще «сыровата», есть некоторые недоработки, но с каждым новым релизом ситуация все лучше и лучше.
Перейдем к практике. И тут я решил остановить свой выбор на семействе STM32F4, хотя это не имеет особого значения, поскольку мы всего лишь хотим ознакомиться с функционалом и принципом работы STM32CubeMx. Итак ST предлагают нам во-первых, собственно, сам STM32CubeMx (в скачанном архиве будет .exe файл для установки программы), а также набор библиотек STM32Cube FirmWare F4. Несмотря на почти одинаковые названия архивов на сайте ST — это абсолютно разные вещи. CubeMx — готовый софт для конфигурирования периферии, Cube FW — набор множества библиотек.
3.1.1. Структура STM32CubeF4_FirmWare
И для начала рассмотрим, что же за библиотеки нам предлагаются. Распаковываем архив и начинаем ковырять:
Рис. 3.1.1.1. Структура папок STM32CubeF4_FirmWare
Рис. 3.1.1.2. Количество примеров для определённых отладочных плат
Рис. 3.1.1.3. Программные компоненты, реализованные в STM32CubeF4_FirmWare
Рис. 3.1.1.4. Программная архитектура STM32CubeF4_FirmWare
Архитектура имеет три уровня реализации, которые оисывают свой уровень обстракции:
· Level 0: Этот уровень делится на три подуровня:
• Пакет Поддержки Платформы (BSP): этот слой предлагает набор программных интерфейсов, связанных с аппаратными Компонентами на аппаратных платах (Аудиокодек, I / O расширитель, Сенсорный экран, SRAM драйвер, ЖК драйверы. и т.д …) и состоит из двух частей:
o Компонент: это драйвер, связанные с внешним устройством на плате, и не связан с STM32, драйвер компонент обеспечивает определенные интерфейсы к BSP внешнего компонента драйвера и могут быть перенесены на любую плату.
o BSP драйвер: он позволяет драйверу компонента должны быть связаны с конкретной плате и предоставляет набор удобных интерфейсов. Правило API именования BSP_FUNCT_Action (): напр. BSP LED_Init (), BSP LED_On ()
Он основан на модульной архитектуре, что позволяет ему быть легко перенесен на любом оборудовании, просто реализации подпрограммы низкого уровня.
• Уровень Аппаратных Абстракций (HAL): этот слой предоставляет драйвер низкого уровня, и методы аппаратных интерфейсов, чтобы взаимодействовать с верхними слоями (приложения, библиотеки и стеки). Он обеспечивает общий, мульти экземпляр и функционально ориентированные интерфейсы, которые позволяют чтобы разгрузить реализацию пользовательского приложения, предоставляя готовые к использованию процессов. Для примера: для периферийных устройств связи (I2S, UART ) он обеспечивает интерфейсы позволяющие инициализации и настройки периферийного уровня, управлять передачей данных на основе опроса, прерываниями или DMA процессом и управлять ошибками связи с которые могут возникать во время коммуникация. HAL Драйверы API делятся на две категории :
o общие интерфейсы API, которые обеспечивают общие и определенные функции на всех сериях расширения API,
o STM32 который предусматривает конкретные и индивидуальные функции для конкретного семейства или определенной части семейства.
Основные примеры периферийного использования: этот слой содержит примеры основных операций в STM32F4 периферии используя только ресурсы HAL и BSP.
· Level 1: Этот уровень разделен на два подуровня:
• Компоненты промежуточного уровня(Middleware components:): набор библиотек, охватывающих USB Host и библиотеки устройств, STemWin, LibJPEG, FreeRTOS, FatFs, LwIP и PolarSSL. горизонтальное взаимодействие между компонентами этого слоя осуществляются непосредственно путем вызова API, функцию во время работы вертикальная взаимодействие с драйверами низкого уровня осуществляется с помощью специфических обратных вызовов и статические макросы реализованные в интерфейсе библиотеки системных вызовов. Например, FatFs Реализует дисковый ввод / вывод драйвер для доступа к диск MicroSD или USB Mass Storage Класс. Основные особенности каждого компонента промежуточного программного таковы:
o USB Host и Device Библиотеки :
– классы Несколько USB поддерживаются (запоминающих, HID, CDC, DFU, аудио-, MTP) – Поддержка мульти функции пакетной передачи: позволяет отправлять большие объемы данных
без разделения их на макс трансфертов размер пакета.
– Использует файлы конфигурации, чтобы изменить ядро и конфигурацию библиотеки без изменения кода библиотеки (только чтение).
– Включает в себя 32-разрядных выровненные структуры данных для обработки передачи DMA основе в Highspeed Режимы.
– Поддержка мульти USB OTG основные экземпляры из пользовательского уровня через конфигурационный файл (Позволяет работать с более чем одним USB хост / устройство периферии).
– RTOS и Автономная работа
– Связь с низкоуровневым драйвером осуществляется через уровень абстракции, используя
Файл конфигурации, чтобы избежать каких-либо зависимости между Библиотекой и низкого уровня драйвера.
o Стек STemWin Графический
– Профессиональные решения для развития GUI на основе EMWIN Segger в решение
– Оптимизированные драйверы дисплея
– Программы для генерации кода и редактирования растрового (STemWin Builder …)
o LibJPEG
– Стандарт с открытым исходным кодом
– Реализация C для кодирования изображения JPEG и декодирования.
o FreeRTOS
– Стандарт с открытым исходным кодом
– Уровень совместимости CMSIS
– Операция Tickless в режиме пониженного энергопотребления
– Интеграция со всеми модулями STM32Cube Middleware
o FAT файловой системы
– FatFs FAT библиотека с открытым исходным кодом
– Поддержки длинных имен
– Поддержка динамических несколькими накопителями
– RTOS и режимом автономной работы
– Примеры с MicroSD и USB хост-класса запоминающих
o LwIP TCP / IP стек
– Стандарт с открытым исходным
– RTOS и режимом автономной работы
• Примеры, основанные на компонентах Middleware: каждый Middleware компонент поставляется с одним или несколькими примерами (называемых также приложений), показывающие, как использовать его примеры интеграции, которые используют несколько компонентов промежуточного также предоставляются.
· Level 2: Этот уровень состоит из одного слоя, который является глобальным реальным-временем и графическое демонстрации на основе слоя Middleware программного обеспечения, слоя низкого уровне абстракции и приложений, которые используют периферийные устройств для функции поддерживаемых отладочным набором.
3.1.2. Настройка системы в CubeMX
Попробуем создать проект для нашей отладочной платы STM32F429I-DISCO!
Рис. 3.1.2.1. Стартовое окно
Выбираем новый проект – “New Project“. Сразу же открывается окно с огромным количеством настроек, в котором нам необходимо выбрать микроконтроллер, который мы собираемся использовать в нашем проекте. Я выбрал STM32F429I‑DISCO0. Появляется новое окно:
Рис. 3.1.2.2. Окно выбора либо кристалла, либо отладочной платы
Выбираем закладку Board Selector и видим следующее окно
Рис. 3.1.2.3. Окно выбора либо кристалла, либо отладочной платы с общим описанием платы
Далее двойным щелчком выбираем плату и видим опять новое окно J))).
3.1.2.1. Окно Настройки кристалла
Рис. 3.1.2.4. Окно Настройки кристалла
В окне на рис. 3.1.2.3. Показаны два поля : 1 – ое , позволяет настроить те или иные регистры в заданные состояния, а справа, во втором окне , задана цоколевка кристалла. Если заметить, то на многих пинах уже заданы определенные настойки. Допустим на пинах PC14, PC15 – эти пины определены, как вход и выход для кварцевого резонатора. А ножка PC1 – определена как SPI и подходит к MEMS датчику. Вот в принципе общие возможности. Так же по нажатию мышки на пин, можно выбрать его настройки, если вы хотите его переопределить! ТО есть всё очень удобно и наглядно, что очень важно, чтоб не сидеть и не писать что где и как ! Очень системный подход!
Рис. 3.1.2.5. Представлены возможные иконки состояния тех или иных регистров
3.1.2.2. Окно Схема тактирования МК
Далее идет закладка “Clock Configuration“, посмотрим что там! Ну и что Вы видите ?! Красота !
Рис. 3.1.2.5. Схема тактирования МК
Опять же всё очень наглядно и можно менять многие параметры и при этом учитываться допустимые соотношения делителя и умножителя PLL и если вы зададите недопустимые данные то, вам высветиться ошибка!
Переходим к следующей закладке “Configaration“. В ней мы можем настроить MiddleWare уровень, добавить MiddleWare компоненты а также настроить периферию. Ну я для примера добавил FASTFS , FreeRTOS , и эти элементы добавляться в систему и можно произвести их настройку. В тестовом примере мы пока их не будем использовать. Так же видно что у нас нет никакой аналоговой части. Это связано с етм что в первом окне мы не выбрали ни одного АЦП. Это можно легко сделать перейти на первую вкладку и выбрав какой нить АЦП .
Рис. 3.1.2.6. Настройка конфигурации периферии и MiddleWare компонентов
Рис. 3.1.2.6. Пример выбора АЦП
Для примеры мы просто создадим настройки по умолчания, где нет АЦП и дополнительных компонентов.
Рис. 3.1.2.7. Пример нашего тестового проекта
3.1.2.3. Окно Конфигурация Элементов МК
Следующая закладка, отвечает за расчет мощности рассеивания. Но её мы рассматривать не будет. Посмотрите её сами. А теперь перейдём к самому ответственному это написания кода, включение и управление нашим китом!
3.2. Программируем в Keil
3.2.1. Генерируем инициализационный код, наконец-то
От создания кода нас отделяет, какая то малость.
Рис. 3.2.1.1. Вызываем меню создания инициализационного кода
Откроется окошко, в котором можно выбрать имя и папку вашего проекта. Выбрать компилятор, в данном случае выбираем “MDK–ARM V 5″ (Keil v5.x). А во второй закладке можно выбрать опции создания вашего кода. Всё, осталось запустить генерацию!
Рис. 3.2.1.2. Опции генерации проекта
Последний штрих это то, что программа позволяет создать отчет о вашем проекте , это делается в том же меню где выбирали генерацию кода, как показано на рис. 3.2.1.1. Сделайте его самостоятельно! Ну а теперь. Будет очень трудно. Так что идите перекусите, подкрепитесь или просто походите вокруг стула, для отвлечения. И снова возвращайтесь к нам. Дальше интереснее!!!
3.2.2. Начинаем программировать
Заходим в папку с проектом у меня он выглядит так.
Рис. 3.2.2.1. Структура фалов проекта
CubeMX нам создал папку проекта, где уже есть все необходимые файлы для компиляции. Раньше же это надо было делать руками и из общего набора заголовочных фалов и исходников кода, создавать свои сборки. Теперь этого не надо, всё уже в одной папки и рядом! При этом вы можете использовать просто голый CMSIS либо HAL ( дать ссылку на статью, где даеться пояснение на эту тему).
Ну чтож по приветствуем мир J))). С учетом того, что в пункте 2, мы произвели установку Keil, заходим в папку MDK–ARM и находим там Проектный файл для Keil, с расширением *.uvprojx запускаем его. У меня он будет называться “Second.uvprojx” (потому что первый у меня не получился ^) .
Рис. 3.2.2.2. Структура проекта
Мне кажется очень неплохая структура, проекта которая разбита на следующие папки и уровни:
· HAL API – функции HAL уровня;
· CMSIS – драйверы низкого уровня;
· Application/USER – прикладные функции (main.с, _it.c – описание обработчиков прерывания и др.) ;
· Application/MDK–ARM – здесь стартап ассемблерный код (файл startup_stm32f429xx.s ), в котором указана описание функций обработчиков прерывания и указание на main entry point ( на начальную входную функцию , т.е. функцию main), функцию, с которой будет грузиться проект.
Мы в последующих статьях рассмотрим больше подробностей , а сейчас просто попробуем написать пару строк для мигания светодиодом, посредством HAL и поймем заключительные моменты для запуска полноценного приложения!
4. Ура мы запустили Keil HAL LED
А сейчас допишем такие строки в код фала main.c
1. int main(void)
2. {
3.
4. /* USER CODE BEGIN 1 */
5.
6. /* USER CODE END 1 */
7.
8. /* MCU Configuration———————————————————-*/
9.
10. /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
11. HAL_Init();
12.
13. /* Configure the system clock */
14. SystemClock_Config();
15.
16. /* Initialize all configured peripherals */
17. MX_GPIO_Init();
18.
19. /* USER CODE BEGIN 2 */
20.
21. /* USER CODE END 2 */
22.
23. /* Infinite loop */
24. /* USER CODE BEGIN WHILE */
25. while (1)
26. {
27. /* USER CODE END WHILE */
28.
29. /* USER CODE BEGIN 3 */
30.
31.
32. HAL_GPIO_WritePin(GPIOG,GPIO_PIN_13,GPIO_PIN_RESET);
33. HAL_Delay(500);
34. HAL_GPIO_WritePin(GPIOG,GPIO_PIN_13,GPIO_PIN_SET);
35. HAL_Delay(500);
36.
37. // GPIO_Pin_13
38.
39.
40.
41. }
42. /* USER CODE END 3 */
43.
44. }
Строки с 32 – 35 вставляем в файл main.c .А теперь самый ответственный момент зашьем проект.
5. Заключение
Мы познакомились с необходимым набором элементов для программирования и разработки проектов под МК STM32 на базе процессоров Cortex–M4. Познакомились с архитектурой и структурой проекта построенного с использованием CubeMX, с настройками приложения CubeMX. Так же научились и разобрались со структурой проекта в Keil. Ну и конечно создали программу мигания светодиодом, расположенным не плате с использованием функцция HAL. В следующих статьях мы более углублённо и детально разберем создания новых проектов и работы с переферией платы по средством Keil! Спасибо за внимание !
6. Используемые материалы
ARM® Cortex®-M:
· Cortex-M Series from ARM.com ;
· Cortex-M4 Technical Reference Manual
STM32 STMicroelectronics:
· ST.com
Статьи :
69 thoughts on “STM32F4 Начнем программировать CubeMX!”