Библиотека CMSIS
Библиотека CMSIS включает в себя следующие компоненты:
- CMSIS-CORE: API для ядра Cortex-M и периферии. Стандартизированный интерфейс доступен для Cortex-M0, Cortex-M3, Cortex-M4, SC000, и SC300. Включает дополнительные SIMD-инструкции для Cortex-M4.
- CMSIS-Driver: определяет основные драйверы интерфейсов периферии. Содержит API для операционных систем реального времени (ОСРВ, или англ. Real-Time operating systems — RTOS) и соединяет микроконтроллер с промежуточным ПО (стек коммуникации, файловая система или графический интерфейс).
- CMSIS-DSP: коллекция из более чем 60 функций для различных типов данных (относятся к обработке сигналов): с фиксированной точкой и с плавающей точкой (одинарной точности, 32 бита). Библиотека доступна для Cortex-M0, Cortex-M3, и Cortex-M4. Реализация библиотеки для Cortex-M4 оптимизирована c использованием SIMD-инструкций.
- CMSIS-RTOS API: общий API для систем реального времени.
Используя функции данного интерфейса вы можете отойти от конкретной реализации операционной системы.
- CMSIS-DAP (Debug Access Port): стандартизованное программное обеспечение для отладчика (Debug Unit).
Рассмотрим только CMSIS-CORE.
Библиотека состоит из стандартной (предоставляется ARM) и вендор-зависимой (предоставляется в нашем случае ST) частей.
Стандартная часть
Заголовочный файл core_<processor_unit>.h
предоставляет интерфейс к ядру. Для stm32f103c8 это core_cm3.h
, так как он работает на Cortex-M3. Для Cortex-M0+ это будет файл core_cm0plus.h
.
Под интерфейсом понимается удобный доступ к его регистрам. Например, в состав ядра входят еще две сущности: системный таймер и контроллер прерываний NVIC. Поэтому в этом файле содержатся вспомогательные функции для их быстрой настройки. Включить прерывание можно вызовом функции:
Вам не нужно работать с регистрами ядра напрямую.
Другие файлы нам не столь интересны, но справедливости ради упомянем их. Например файл core_cmInstr.h
содержит обертки инструкций, а core_cmFunc.h
— обертки некоторых важных системных функций.
Если вы не разрабатываете приложение на самом низком уровне, то заглядывать в эти файлы незачем. Тем не менее, подробное описание работы ядра можно найти в документе ARM — Cortex-M3 Devices Generic User Guide, и мы им даже воспользуемся при настройке системного таймера.
Вендор-зависимая часть
Вторая часть библиотеки пишется непосредственным производителем микроконтроллера. Это происходит потому, что микроконтроллер — это не только его ядро, а еще и периферия. Реализация периферии не стандартизована, и каждый производитель делает ее так, как считает нужным. Адреса и даже поведение внутренних модулей (ADC, SPI, USART и т.д.) могут отличаться.
В ассемблеровском файле startup_<device>.s
(в нашем случае это startup_stm32f10x_md.
) реализуется функция обработчика сброса s
Reset_Handler
. Он задает поведение МК при запуске, т.е. выполняет некоторые задачи до входа в функцию main()
, в частности, вызывает функцию SystemInit()
из файла system_<device>.c
(system_stm32f10x.c
). Также в нем задается таблица векторов прерываний (англ. interrupt vector table) с их названиями:
Заголовочный файл system_<device>.h
(system_stm32f10x.h
) предоставляет интерфейс двум функциям и глобальной переменной и отвечает за систему тактирования.
- Переменная
SystemCoreClock
хранит в себе текущее значение тактовой частоты.
Обратите внимание
Меняя это число, вы не меняете тактовую частоту! Переменную
SystemCoreClock
стоит использовать только как индикатор. Более того, никто не гарантирует, что число, записанное в этой переменной, будет отображать реальную частоту: во-первых, оно может не обновиться после изменения регистров; во-вторых, оно никак не учитывает погрешность хода генератора; и в-третьих, стандартная частота (определенная как макросHSE_VALUE
в библиотеке) внешнего кварцевого генератора — 8 МГц, но никто не мешает разработчику поставить, скажем, кварц на 12 МГц.![]()
SystemCoreClockUpdate()
проходится по всем регистрам, связанным с системой тактирования, вычисляет текущую тактовую скорость и записывает ее вSystemCoreClock
. Данную функцию нужно вызывать каждый раз, когда регистры, отвечающие за тактирование ядра, меняются.- Функция
SystemInit()
И последний файл, самый важный для программиста, это драйвер микроконтроллера <device>.h
(stm32f10x.h
). Вся карта памяти микроконтроллера (о ней еще поговорим) записана там в виде макросов. Например, адрес начала регистров периферии, флеш и оперативной памяти:
Регистры модулей, таких как порты ввода-вывода, обернуты в структуры.
Вместо того, чтобы обращаться к ячейке по нужному адресу, это можно сделать через структуру.
Так как элементы в структуре расположены линейно, друг за другом, а длина регистра фиксирована (uint32_t
, 4 байта), то регистр CRL
GPIOA_BASE
, а следующий за ним CRH
через четыре байта, по адресу GPIOA_BASE + 4
. Ниже приведен пример настройки одной из ножек порта на выход. Вам этот код пока что ничего не скажет, но суть сейчас в другом — вам нужно увидеть пример использования библиотеки.В самом конце файла есть полезные макросы для записи, сброса, чтения битов и целых регистров.
Мы рассмотрели, как эти операции работают, в разделе «Микроконтроллер под микроскопом». Т.е. код выше можно переписать так (и он будет более читаем):
Для всех стандартных типов (определенных в <stdint.h>
) вводятся сокращенные синонимы, например:
Слово __IO
не входит в стандарт языка, а переопределено в core_cm3.
:
Последнее, о чём нужно упомянуть, это перечисление IRQn_Type
.
Оно устанавливает номер исключительной ситуации в соответствие с его названием. Когда вы вызываете функции NVIC_Enable()
или NVIC_Disable()
, в качестве параметра нужно использовать одно из имен в этом перечислении.
Назад | Оглавление | Дальше
STM32 + CMSIS + STM32CubeIDE
Здесь я расскажу как создать минимальный проект на CMSIS с использованием «родной» IDE для микроконтроллеров STM – STM32CubeIDE.Возможно STM32CubeIDE и обладает рядом недостатков, но у нее, на мой взгляд, есть несколько преимуществ – таких как проприетарность и бесплатность, ради которых, как минимум, стоит обратить внимание на эту среду разработки, если вы не сделали этого раньше.
Объектом прошивки выбран не очень распространенный микроконтроллер STM32F072 с ядром ARM Cortex-M0, для более привычных STM32F103 на ARM Cortex-M3, с поправкой на ядро, процесс идентичен.
Все необходимые ресурсы можно скачать с сайта st.com, и вот что понадобится:
- Сама IDE, я использую Windows версию, но также доступны версии под Mac и Linux
- Библиотека CMSIS для ARM Cortex-M0, она находится в архиве STM32CubeFx, разбитом по версиям ядра. Сам архив, помимо CMSIS, содержит великое множество других ресурсов начиная от примеров работы с периферией до драйверов USB, собственно, именно этот архив используется, если создавать проект с помощью STM32Cube
- Не помешает Datasheet и Reference Manual
После установки, запуска и выбора папки Workspace можно начать создание проекта. На текущий момент STM32CubeIDE версии 1.1.0, так что по расположению различных настроек следует исходить из этого.
Создание нового проекта — File/New/STM32Project
![](/800/600/https/radio-magic.ru/images/articles/step2.png)
Слева, в окне Project Explorer, появилось дерево проекта, правда он не совсем Empty, как заказывали. Впринципе, если устраивает сгенерированная структура папок, можно добавить туда файлы из библиотеки CMSIS и работать дальше, но здесь я покажу как можно привести структуру проекта в гармонию со своим чувством прекрасного, поэтому удаляется всё, кроме скрипта линкера т.е. файла c расширением .ld — он еще пригодится.
Все манипуляции с папками и файлами можно проводить как в проводнике так и внутри IDE, нажав правой кнопкой на название проекта, к примеру: правая кнопка –> new –> Folder. Если структура проекта изменялась вне IDE, то нужно просто обновить проект: правая кнопка –> Refresh.
Мой вариант структуры проекта выглядит так:
- Startup – здесь будет храниться скрипт линкера, тот самый, оставшийся от сгенерированного проекта, а также startup файл взятый из CMSIS
- CMSIS\src и CMSIS\inc – здесь будут лежать исходники, файлы с расширением .
c в папке scr и заголовочные файлы с расширением .h в папке inc соответственно, относящиеся к библиотеке CMSIS
- Core\src и Core\inc – здесь будет расположен собственно сам проект, для начала стоит положить туда main.c и main.h
Теперь нужно перенести файлы библиотеки CMSIS в проект. Библиотека состоит из файлов ядра и файлов периферии. Файлы ядра начинаются с
В распакованном виде архив содержит папку STM32Cube_FW_F0_V1.11.0, все пути указаны относительно этой папки. Итого, нужно скопировать:
В CMSIS\inc:
- Drivers\CMSIS\Include\cmsis_compiler.h
- Drivers\CMSIS\Include\cmsis_gcc.h
- Drivers\CMSIS\Include\cmsis_version.
h
- Drivers\CMSIS\Include\core_cm0.h
- Drivers\CMSIS\Device\ST\STM32F0xx\Include\stmf0xx.h
- Drivers\CMSIS\Device\ST\STM32F0xx\Include\stm32f072xb.h
- Drivers\CMSIS\Device\ST\STM32F0xx\Include\system_stm32f0xx.h
В CMSIS\src:
- Drivers\CMSIS\Device\ST\STM32F0xx\Source\Templates\system_stm32f0xx.c
В Startup:
- Drivers\CMSIS\Device\ST\STM32F0xx\Source\Templates\gcc\startup_stm32f072xb.s
Так выглядит проект в заполненном виде.
Так как были проведены некоторые манипуляции с папками проекта, нужно отобразить это в настройках.
Правая кнопка по названию проекта -> Properties -> C/C++ Build -> Settings -> Tool Settings -> MCU GCC Linker -> General – здесь нужно указать новое расположение скрипта линкера с помощью кнопки Browse…
Также нужно указать пути к файлам проекта
Properties -> C/C++ General -> Includes
Properties -> C/C++General -> Source Location
В Includes пути к папкам inc, а в Source Location логично было-бы к папкам Чтобы не загромождать визуально дерево, в Source Location можно указать корневые папки Core, CMSIS и Startup.
Для того чтобы проект скомпилировался нужно раскомментировать в файле stm32f0xx.h строку с названием микроконтроллера ну и конечно же в main.c добавить функцию main.
Собственно всё. Безошибочная компиляция и сразу же куда-то подевалось целых полтора килобайта памяти ОЗУ она же RAM, и сразу же вспоминается стек и куча, в процессе создания проекта они нигде не упоминались. Величина стека и кучи указана в файле скрипта линкера, тот что с расширением .ld, их можно и нужно изменять в соответствии с требованиями проекта. Эти значения находятся в начале файла в виде меток _Min_Heap_Size/_Min_Stack_Size с указанием размера в шестнадцатеричном виде. В качестве примера, приведу небольшой проект традиционного мигания светодиодом.
Светодиод будет мигать на отладочной плате STM32F072B-DISCO, тактирование осуществляться от внутреннего генератора HSI48 частотой 48 МГц, а в качестве источника задержки использоваться таймер SysTick, генерирующий прерывания с периодом в 1 мс, при помощи которых отсчитывается точное время задержки. Светодиод подключен к выводу 6 порта С, настроенного на выход push-pull.
Надеюсь, данная информация кому-то пригодится, т.к. в свое время, несмотря на обилие материалов по программированию STM32, мне пришлось перелопатить достаточно много мануалов, чтобы осознать вещи, кажущиеся сейчас очевидными.
По сути это все библиотеки для платформы ARM Cortex (STM32). CMSIS содержит низкоуровневые, не зависящие от производителя методы для доступа к аппаратуре микроконтроллеров ARM Cortex. Некоторые производители, например STM, предоставляют библиотеки поверх CMSIS или в дополнение к CMSIS, такие как STM32CUBE. Библиотеки MDED предоставляют высокоуровневый, независимый от производителя интерфейс программирования (C++ API) для аппаратуры микроконтроллеров различных производителей. Библиотека MBED может использовать соглашения по программированию CMSIS, вызовы функций CMSIS, или может быть функций STM32CUBE. В программе на основе MBED есть следующие уровни (если спускаться от высокого уровня к самому низкому): 6. Ваша программа на C++. Слой CMSIS работает как легкая абстракция, находящаяся между остальным кодом и железом микроконтроллера. Изначально CMSIS представлял из себя только заголовочные файлы с описанием регистров, но потом были добавлены низкоуровневые функции. В основном CMSIS гарантирует, что доступ к регистрам CPU, прерываниям и т. В сущности все эти слои позволяют программе быть независимой от выбранного микроконтроллера. То есть Вы не должны иметь дело с библиотекой STM32Cube, или с HAL API, используя вместо этого библиотеку MBED C++. [Ссылки] 1. STM32: аббревиатуры и термины. |
CMSIS против HAL против стандартной периферийной библиотеки
Чтобы узнать, как это работает, вы хотите использовать ничего из вышеперечисленного. Получите ручной кросс-компилятор и документацию от st, done. Начните кодировать. эти чипы вообще очень легко программировать. документация говорит вам, какие биты в каких регистрах делают что.
Любая / все эти библиотеки предназначены для того, чтобы снять с вас это понимание / нагрузку / работу и создать ощущение, будто вы просто вызываете API, как опыт разработки приложений. Это то, что хотят многие люди. Вы можете использовать весь исходный код для этих библиотек, чтобы помочь понять, но когда вы станете лучше, вы обнаружите дыры и проблемы в библиотеках, иногда очень страшный код. код, собранный вместе, написанный в общих чертах и грубо перенесенный с одного чипа на другой, возможно, поддерживающий функции, которых нет у вашего чипа, и т. д. И все они имеют чрезмерную нагрузку. В 10-100 раз больше кода для этой задачи, конечно, многие из них могут быть оптимизированы, но зачем это нужно?
Независимо от того, пользуетесь ли вы своей собственной или используете одну из этих библиотек, вам все равно следует поискать исходные библиотеки, которые вы используете, чтобы убедиться, довольны ли вы тем, что они делают, если это имеет смысл, соответствует документации по чипу и т. Д. идет не так, вам, вероятно, придется копаться в их вещах столько же, сколько в вашей, чтобы выяснить, почему.
Обратите внимание, что документы по чипам тоже не идеальны, это часть веселья.
Я не понимаю, почему сборка возникает в дискуссии о программировании голого металла. Вы можете обойтись с очень небольшой сборкой. Для этих чипов cortex-m вам технически нужно только столько ассемблера для загрузки:
.
globl _start
_start:
.word 0x20001000
.word main
Вы не можете полагаться ни на данные, ни на bss, и вы не можете вернуться с основного с этим минимумом asm. Но это все, что вам нужно для самого чистого металла. Теперь, если вы хотите делать прерывания, вам нужно больше записей в векторной таблице. больше .word строк. Я рекомендую больше asm, но возможно на 10 или 20 строк больше.
обычно это все, что я использую.
.cpu cortex-m0
.thumb
.thumb_func
.global _start
_start:
stacktop: .word 0x20001000
.word reset
.word hang
.word hang
.word hang
.word hang
.word hang
.word hang
.word hang
.word hang
.word hang
.word hang
.word hang
.word hang
.word hang
.word hang
.thumb_func
reset:
bl notmain
b hang
.thumb_func
hang: b .
.align
.thumb_func
.globl PUT16
PUT16:
strh r1,[r0]
bx lr
.thumb_func
.globl PUT32
PUT32:
str r1,[r0]
bx lr
.thumb_func
.globl GET32
GET32:
ldr r0,[r0]
bx lr
.thumb_func
.globl GET16
GET16:
ldrh r0,[r0]
bx lr
.
thumb_func
.globl dummy
dummy:
bx lr
.end
Да, это говорит Cortex-M0, но это фактический загрузчик для моего кода M4. Я предпочитаю, чтобы это был thumb, а не thumb2. И я просто повторно использую этот код из одного cortex-m в другой, меняя адрес указателя стека по мере необходимости, чтобы он работал для m0, m3 и m4. У меня еще нет m7, и я не слишком много его исследовал.
Включение fpu может потребовать еще несколько строк asm, поскольку необходимы конкретные инструкции. Но дело не в том, чтобы смешивать низкоуровневое программирование и асм. C тем, что нужно для настройки чипа, а также для написания приложения. Библиотеки, о которых вы говорите, написаны на C, а не на asm, поэтому, очевидно, им также не нужно использовать asm.
Если вы хотите изучить внутреннюю работу, напишите свой собственный код. Не используйте эти библиотеки, кроме как для справки. Иногда проще просто взломать его, чем пытаться прочитать их код. (не только ST, но и все поставщики. У одного из поставщиков была строка кода, настолько тревожная, что я использую ее как вопрос для собеседования, нет, не собираюсь публиковать ее здесь).
Безусловно, ST, но и другие производители, для экономии энергии, имеют тактовые импульсы для участков чипа, поэтому, прежде чем вы попытаетесь мигнуть светодиодом, вам нужно найти бит включения для этого блока gpio и посмотреть, выйдет ли он. сброса включен, если нет, то включите его, разговаривая с этой логикой gpio без включенных часов, он просто вешает процессор, ожидая ответа от логики, которая никогда не ответит. Они не всегда говорят вам об этих способностях. После включения они иногда проводят вас через init для некоторого определенного периферийного устройства. Документы ST довольно хороши. Исходя из микрочипа, который получает довольно плохую оценку за документацию, у вас не должно быть проблем.
NN - библиотека для работы с нейронными сетями для микроконтроллеров ARM Cortex-M / Машинное обучение / RoboCraft.
![](/800/600/https/forum.cxem.net/uploads/monthly_2017_03/screen1.png.39a73a31fe6ddd92a742eafc018c269a.png)
Оказывается, ещё в январе, в стандартную библиотеку — CMSIS (Cortex Microcontroller Software Interface Standard) включили функционал для реализации нейронных сетей — CMSIS-NN.
Основанием для внесения подобного функционала в стандартную библиотеку, стало признание того, что с развитием интеллектуальных периферийных устройств, IoT и т.п. — нейронные сети становятся всё более популярными для выполнения задач аналитики данных сразу на месте, что позволяет уменьшить латентность системы, а также уменьшить энергопотребление, которое можно будет не затрачивать на передачу данных.
CMSIS-NN представляет собой набор функций для реализации нейронных сетей, разработанных для максимизации производительности и минимизации объема потребляемой памяти на процессорных ядрах ARM Cortex-M.
Библиотека содержит функционал:
свёрки (Convolution Functions),
активации (Activation Functions) (Sigmoid, Tanh, ReLU),
полносвязный слой (Fully-connected Layer Functions),
пулинг (Pooling Functions),
софтмакс (Softmax Functions),
вспомогательные функции.
Представление чисел
Традиционно, нейросетевые модели обучаются с использованием 32-битного представления данных числами с плавающей запятой (float32). Однако, при работе модели, такая высокая точность, как правило, не требуется.
Исследования показали, что нейронные сети хорошо работают даже с менее точным представлением данных.
В CMSIS-NN, операции проводятся над целыми числами (Fixed-point quantization), что помогает избежать дорогостоящих вычислений над числами с плавающей запятой, а также уменьшает требуемый объём памяти для хранения весов и активаций, что имеет решающее значение для платформ с ограниченными ресурсами.
@brief 8-bit fractional data type in 1.7 format.
typedef int8_t q7_t;
@brief 16-bit fractional data type in 1.15 format.
typedef int16_t q15_t;
Квантование выполняется с учетом формата с фиксированной запятой до степени двойки, то есть представленное значение будет равно A * 2**n
, где A — целое число, n — представляет собой целое число, указывающее основание счисления.
![](/800/600/https/i.ytimg.com/vi/Nyml66k_Ppk/maxresdefault.jpg)
Коэффициенты масштабирования передаются для смещения (bias) и выхода в качестве параметров функций. Само масштабирование реализуются как побитовые сдвиги.
Быстродействие
Измеренное быстродействие для CIFAR-10 (цветная картинка 32x32, выход — 10 классов) на плате NUCLEO-F746ZG Mbed board с ядром Arm Cortex-M7, работающем на частоте 216 MHz, для 7-слойной свёрточной сети (3 раза — Convolution+Max Pooling) составило 99.1 ms на картинку (точность — 79.9%).
далее: STM32Cube.AI — пакет расширения для STM32CubeMX для встраивания нейронных сетей в микроконтроллеры STM32
Ссылки
New CMSIS-NN Neural Network Kernels Boost Efficiency in Microcontrollers by ~5x
CMSIS-NN: Efficient Neural Network Kernels for Arm Cortex-M CPUs
CMSIS NN Software Library
https://github.com/ARM-software/CMSIS_5
Quant_guide
CMSIS-NN CIFAR10 Example
По теме
От Arduino к STM32
STM32: Урок 2 — Quickstart
uTensor — AI на микроконтроллерах
Глубокие нейронные сети как следующий этап развития программного обеспечения
Будущее глубокого обучения
Проблемы применения машинного обучения для решения реальных задач
Нейронная сеть
Нейронная сеть — введение
Принцип обучения многослойной нейронной сети с помощью алгоритма обратного распространения
Пример работы самоорганизующейся инкрементной нейронной сети SOINN
STM32F4xx_Поваренная книга анархиста / stm32 / Сообщество разработчиков электроники
/*-------------------------------------------------------------------------------------------------
* Name: Поваренная книга
* микроконтроллерных систем на базе микропроцессора ARM
* Cortex M4F (среда разработки Keil uVision4 v4.
![](/800/600/https/sun9-67.userapi.com/c857432/v857432759/13b620/wXSe6nUDK4Q.jpg)
*--------------------------------------------------------------------------------------------------
* Copyright © All rights reserved. Maltsev Alexey. 2014
* vk.com/id233978561
* [email protected]
* ICQ: 457-568-689
*-----------------------------------------------------------------------------------------------*/
Буэнос диас!
Итак, что у нас в меню:
• Keil uVision4 (последняя версия на момент написания статьи v4.73.0.0)
rutracker.org/forum/viewtopic.php?t=2305709
• STM32 ST-LINK utility
www.st.com/web/catalog/tools/FM146/CL1984/SC720/SS1454/PF219866
• Дрова на плату STM32F4DISCOVERY под Windows
www.st.com/web/en/catalog/tools/FM146/CL1984/SC724/SS1677/PF251168
• Тестовая плата STM32F4DISCOVERY
• Библиотека STM32F4xx_DSP_StdPeriph_Lib_V1.3.0
STM32F4DISCOVERY
STM32F4DISCOVERY — плата для быстрого и удобного изучения микроконтроллеров серии STM32F4, ориентированных на мультимедийные приложения.
![](/800/600/https/narodstream.ru/wp-content/uploads/2019/07/stm165img19.jpg)
На плате установлен 32-битный ARM-микроконтроллер STM32F407VGT6 семейства Cortex-M4F со следующими характеристиками:
• Корпус LQFP100 (100 ножек)
• Напряжение питания: 1.8 — 3.6 В
• Частота: до 168 МГц
• Память программ (Flash): 1 МБайт
• ОЗУ (RAM): 196 Кбайт
• 4 Кбайт backup SRAM (аналог EEPROM)
• Поддержка инструкций DSP и чисел с плавающей точкой
• 16-битные таймеры: 2 базовых таймера, 8 таймеров общего назначения, 2 продвинутых таймера, 2 watchdog
• 2 32-битных таймера общего назначения
• USB 2.0 full-speed device/host/OTG со своим PHY на борту
• USB 2.0 high-speed/full-speed device/host/OTG с отдельным DMA, со своим full-speed PHY на борту, есть поддержка ULPI
• 10/100 Ethernet MAC с отдельным DMA, поддержка PHY-микросхем с интерфесами IEEE 1588v2, MII/RMII
• 3x SPI (37.5 МБит/с), 2 из них с мультиплексированными полнодуплексными I2S для качественной передачи звука
• 3x I2C с поддержкой SMBus/PMBus
• 4x USART, 2x UART: 10.5 МБит/с, интерфейс ISO 7816, LIN, IrDA, modem control
• 2x CAN (2.0B Active)
• SDIO (для SD-карт)
• DCMI — [от 8 до 14]-битный параллельный интерфейс камеры (до 54 МБайт/с)
• Аналоговый генератор случайных чисел
• Встроенный модуль расчёта CRC
• 82x GPIO (выводы I/O)
• RTC (Real-Time Clock)
• 3 12-битных АЦП, 2.4 миллиона выборок в секунду, 16 каналов, 7.2 миллиона выборок в секунду в режиме тройного чередования
• 2 12-битных ЦАП
• Контроллер DMA с 16 каналами и поддержкой FIFO и пакетной передачи
• Параллельный интерфейс LCD, режимы 8080/6800
• FSMC — контроллер статической памяти с поддержкой Compact Flash, SRAM, PSRAM, NOR и NAND
• Возможность отладки по JTAG или SWD
Что ещё установлено на плате:
• Отладчик ST-Link для отладки и прошивки МК, выведен разъём SWD для программирования других плат и контролллеров
• Есть выводы для внешнего питания 5 и 3 В
• Есть кнопка сброса
• Четыре светодиода и одна кнопка, доступные для программирования
• Все 100 выводов МК выведены по бокам платы штырьками по два ряда
• LIS302DL — MEMS-датчик движения, 3х-осевой цифровой акселерометр
• MP45DT02 — цифровой MEMS-микрофон
• CS43L22 — аудио-ЦАП со встроенным драйвером динамиков класса D
• Для USB OTG выведен разъём micro-USB. Если плату с заводской прошивкой подключить через этот разъём к компьютеру, то она будет вести себя как джойстик класса USB HID.
STM32 ST-LINK Utility
Данную программу удобно использовать для прошивки микроконтроллера при помощи hex файла.
Подсоединяем плату к ПК при помощи кабеля USB – miniUSB. Нажимаем на панели инструментов Connect.
Выбираем hex файл для прошивки (можно просто перетащить файл в основное окно программы).
Прошиваем плату
Результаты прошивки отображаются в командной строке.
Keil uVision4
Монстр программирования. Умеет делать абсолютно все, даже то, что не умеет 😉
Создадим новую папку, куда будем помещать все наши проекты. Например, STM32. В этой папке создадим папку для первого проекта. Назовем ее 00_Test. Так же в папке STM32 создадим папку _Lib – сюда мы поместим фалы библиотек CMSIS и Standard Peripheral Library, и каждый новый проект будет ссылаться на эту папку в поиске библиотек.
В папке 00_Test создадим папки:
Project – здесь будут служебные файлы, которые будет создавать программа Keil uVision4 для данного, конкретного проекта.
user – файлы пользовательского кода (программа, которая будет зашиваться в микроконтроллер). В этой папке создаем текстовый файл main.c. Напишем в нем коротенький код
#include «stm32f4xx.h»
int main(void)
{
while(1) {}
}
Этот код нам понадобится потом.
P.S.: имена папок, а так же структура проекта – личное дело программиста, но надо стремиться к упорядоченному структурированию, чтобы проект был “читабельным” для других программистов. Папку Project можно и не создавать, но тогда все служебные файлы будут “замусоривать” корневой каталог папки 00_Test.
Вот, что должно получится:
Теперь разберемся с библиотеками.
Будем использовать 2 библиотеки:
1. CMSIS (выпускает фирма ARM)
2. Standard Peripheral Library (выпускает фирма STMicroelectronics)
Обе библиотеки бесплатны и доступны для скачивания (эти две библиотеки объединены в одном архиве) на www.st.com/
Причем есть два варианта библиотеки.
1. Библиотека для микроконтроллера STM32F407VGT6 вообще STM32F4xx_DSP_StdPeriph_Lib_V1.3.0 (stm32f4_dsp_stdperiph_lib.zip)
www.st.com/web/catalog/mmc/FM141/SC1169/SS1577/LN11/PF252140?s_searchtype=partnumber#
2. Библиотека конкретно для тестовой платы STM32F4DISCOVERY STM32F4 -Discovery_FW_V1.1.0 (stsw-stm32068.zip)
www.st.com/web/en/catalog/tools/FM147/CL1794/SC961/SS1743/PF257904?s_searchtype=keyword
Мы будем пользоваться библиотекой STM32F4xx_DSP_StdPeriph_Lib_V1.3.0
Заходим в папку
STM32F4xx_DSP_StdPeriph_Lib_V1.3.0
↓
Libraries
↓
И копируем две папки CMSIS и STM32F4xx_StdPeriph_Driver в нашу папку _Lib
Удаляем в папке CMSIS (которую мы скопировали в _Lib) все, кроме папки Device.
Заходим в папку
STM32F4xx_DSP_StdPeriph_Lib_V1.3.0
↓
Project
↓
STM32F4xx_StdPeriph_Examples
↓
ADC
↓
ADC_DMA
↓
Копируем файл stm32f4xx_conf.h в нашу папку STM32F4xx_StdPeriph_Driver
Далее проделаем следующие манипуляции:
_Lib
↓
CMSIS
↓
Device
↓
ST
↓
STM32F4xx
↓
Include
↓
В свойствах файлов stm32f4xx.h и system_stm32f4xx.h снимаем галочку “Только чтение”
Запускаем программу Keil uVision4 и создаем новый проект.
Путь для проекта указываем:
STM32
↓
00_Test
↓
Project
↓
Имя проекта Test
Далее программа предлагает автоматически создать файл конфигурации данного микроконтроллера – startup_stm32f40xx.s. Соглашаемся.
В итоге получили:
Переименуем папку Source Group 1 (в которую программа поместила файл конфигурации микроконтроллера startup_stm32f40xx.s) в startup. Для этого щелкаем один раз левой кнопкой мыши по имени папки и нажимаем F2 – имя папки теперь доступно для переименования. Аналогичным образом переименовываем имя проекта из Target 1 в 00_Test.
Добавляем в проект папку user:
Добавим ранее созданный файл main.c. в папку user. Для этого дважды щелкаем левой кнопкой мыши по заголовку папки (или при помощи правой кнопки вызываем контекстное меню).
Итак, мы создали на жестком диске папку проекта 00_Test. В этой папке создали еще две папки: Project и user.
Project – тут программа будет размещать свои служебные файлы и главный файл проекта Test.uvproj
user – тут мы будем размещать файлы кода, который будем загружать в микроконтроллер.
В среде программирования Keil uVision4 создали новый проект 00_Test. В структуре проекта сейчас две папки: startup и user
startup – в этой папке находится файл конфигурации микроконтроллера
user – в этой папке содержатся файлы из папки user, которая была создана ранее на жестком диске.
На жестком диске больше никаких папок создавать не будем. Но в среде программирования в структуре проекта создадим еще две папки: CMSIS и StdPeriphLib. В этих папках будут содержаться наши библиотеки.
Подключим к этим папкам необходимые файлы из папки _Lib.
Для CMSIS:
_Lib
↓
CMSIS
↓
Device
↓
ST
↓
STM32F4xx
↓
Source
↓
Templates
↓
system_stm32f4xx.c
Для StdPeriphLib:
_Lib
↓
STM32F4xx_StdPeriph_Driver
↓
src
↓
все файлы (кроме файла stm32f4xx_fmc.c)
В опциях проекта необходимо указать пути к этим папкам библиотек
В папке user откроем файл main.c, щелкаем правой кнопкой мыши по #include «stm32f4xx.h», и выбираем Open…
Далее снимаем комментарии в тех местах кода, как показано ниже
Далее необходимо настроить проект:
Запускаем компиляцию проекта – F7.
Если все правильно, то ошибок не должно быть.
Напишем несложный код для мигания светодиодом
Обращаю внимание, что код должен заканчиваться пустой строкой (строка №45).
Запустим компиляцию (F7). Теперь можно “зашить” проект в микроконтроллер:
Если все было сделано правильно, то на тестовой плате должен мигать зеленый светодиод. Чтобы выйти из окна отладчика, нажимаем Ctrl+F5.
УРА!!!
Продолжение следует…
- CMSIS против HAL против стандартной библиотеки периферийных устройств
Чтобы узнать, как это работает, вы не хотите использовать ничего из вышеперечисленного. Получите кросс-компилятор arm и документацию от st, готово. Начать кодирование. эти чипы, как правило, очень легко программировать. документация сообщает вам, какие биты в каких регистрах и что делают.
Любые / все эти библиотеки предназначены для того, чтобы избавить вас от этого понимания / бремени / работы и заставить его чувствовать себя просто вызовом API-интерфейса, подобного опыту программирования приложений.Этого хотят многие люди. Вы можете использовать весь исходный код этих библиотек, чтобы понять, но по мере того, как вы совершенствуетесь, вы обнаруживаете дыры и проблемы в библиотеках, иногда очень страшный код. код, собранный вместе, написанный в общем виде и грубо перенесенный с одного чипа на другой, возможно, поддерживает функции, которых нет у вашего чипа, и т.д. От 10 до 100 раз больше кода для задачи, конечно, большая его часть может быть оптимизирована, но зачем вообще он нужен?
Независимо от того, используете ли вы свою собственную или одну из этих библиотек, вам все равно следует смотреть в исходный код используемых вами библиотек, чтобы убедиться, насколько вам комфортно то, что они делают, если это имеет смысл, соответствует ли это документации чипа и т. Д.Когда что-то пойдет не так, вам, вероятно, придется копаться в их материалах так же, как и в ваших, чтобы выяснить, почему.
Обратите внимание, что документация по микросхеме тоже не идеальна, это часть удовольствия.
Я не понимаю, почему сборка поднимается в дискуссиях о программировании на голом железе. Вы можете обойтись очень небольшой сборкой. Для этих чипов cortex-m вам технически понадобится только столько asm для загрузки:
.globl _start
_Начало:
.word 0x20001000
.word main
Вы не можете полагаться ни на данные, ни на bss, и вы не можете вернуться из main с этим минимальным asm.Но это все, что вам НЕОБХОДИМО для самого голого металла. Теперь, если вы хотите обрабатывать прерывания, вам нужно больше записей в таблице векторов. больше строк .word. Я рекомендую больше asm, но может быть на 10 или 20 строк больше.
- это обычно все, что я использую.
.cpu cortex-m0
.большой палец
.thumb_func
.global _start
_Начало:
stacktop: .word 0x20001000
.word сбросить
.word повесить
.word повесить
.word повесить
.word повесить
.word повесить
.word повесить
.word повесить
.word повесить
.word повесить
.word повесить
.word повесить
.слово повесить
.word повесить
.word повесить
.thumb_func
сброс настроек:
bl notmain
б повесить
.thumb_func
повесить: б.
.выровнять
.thumb_func
.globl PUT16
PUT16:
strh r1, [r0]
bx lr
.thumb_func
.globl PUT32
PUT32:
str r1, [r0]
bx lr
.thumb_func
.globl GET32
GET32:
ldr r0, [r0]
bx lr
.thumb_func
.globl GET16
GET16:
ldrh r0, [r0]
bx lr
.thumb_func
.globl фиктивный
дурачок:
bx lr
.конец
Да, там написано cortex-m0, но это настоящая начальная загрузка для моего кода m4. Я предпочитаю, чтобы это был большой палец, а не большой палец2.И я просто повторно использую этот код из одного cortex-m в другой, при необходимости меняя адрес указателя стека, так что он работает для m0, m3 и m4. У меня еще нет m7, и я его особо не исследовал.
Для включения fpu может потребоваться еще несколько строк asm, поскольку требуются конкретные инструкции. Но дело в том, что не путайте низкоуровневое программирование и asm. В C есть все необходимое для настройки микросхемы, а также для написания приложения. Библиотеки, о которых вы говорите, написаны на C, а не на asm, поэтому очевидно, что им также не нужно использовать asm.
Если вы хотите изучить внутреннюю работу, напишите свой собственный код. Не используйте эти библиотеки иначе, как для справки. Иногда проще просто взломать его, чем пытаться прочитать их код. (не только ST, но и всех поставщиков. У одного из поставщиков была строка кода, настолько тревожная, что я использую ее как вопрос для собеседования, нет, я не собираюсь публиковать ее здесь).
ST определенно, но и у других производителей, чтобы сэкономить электроэнергию, включили синхронизацию для частей микросхемы, поэтому, прежде чем вы войдете и попытаетесь моргнуть светодиодом, вам нужно найти бит включения для этого блока gpio и посмотреть, появится ли он. вне сброса включен, если нет, то включите его, разговаривая с этой логикой gpio без включения часов, просто зависает процессор, поскольку он ожидает ответа от логики, которая никогда не ответит.О таких возможностях не всегда рассказывают. После включения они иногда проводят вас через init для определенного периферийного устройства. Документы ST довольно хороши. Исходя из микрочипа, который получил довольно плохую оценку за документацию, у вас не должно быть проблем.
CMSIS
CMSIS-RTOS: Детерминированное выполнение программного обеспечения в реальном времени
Концепция суперцикла подходит только для простых встроенных приложений. Микроконтроллеры Cortex-M предназначены для операционных систем реального времени, которые позволяют контролировать ресурсы и время.
CMSIS-RTOS - это API, который обеспечивает согласованные программные уровни с промежуточным программным обеспечением и компонентами библиотеки. Keil RTX5 основан на CMSIS-RTOS и работает на каждом устройстве Cortex-M. Это проверенная эталонная реализация, которую легко изучить и использовать. Адаптация FreeRTOS с использованием CMSIS-RTOS API доступна на GitHub.
CMSIS-NN: набор эффективных ядер нейронных сетей
Нейронные сети и машинное обучение - это функции, которые передаются конечному узлу в приложениях Интернета вещей.
Ядра нейронных сетей библиотеки CMSIS-NN помогают максимизировать производительность и минимизировать объем памяти, занимаемый нейронными сетями на ядрах процессоров Cortex-M.
CMSIS-DSP: быстрая реализация цифровой обработки сигналов
Разработка системы цифровой обработки сигналов (DSP) в реальном времени не является тривиальной задачей, поскольку алгоритмы DSP в значительной степени полагаются на сложные математические операции, которые даже критичны по времени.
Библиотека CMSIS-DSP - это богатый набор функций DSP, оптимизированных ARM для различных процессорных ядер Cortex-M.CMSIS-DSP широко используется в промышленности и позволяет также оптимизировать генерацию кода C из MATLAB®. Конструктор фильтров ASN генерирует код CMSIS-DSP, который вы можете напрямую использовать в своем приложении.
Драйвер CMSIS: общие периферийные интерфейсы для промежуточного программного обеспечения и кода приложения
Взаимодействие периферийных устройств микроконтроллера с промежуточным программным обеспечением или общим кодом приложения может быть сложной задачей, поскольку каждое устройство отличается.
Готовый к использованию CMSIS-Driver Интерфейсы сегодня доступны для многих семейств микроконтроллеров и позволяют избежать громоздкого и трудоемкого переноса драйверов.Обратитесь к CMSIS Workshop для получения дополнительной информации.
CMSIS-CORE: согласованный запуск системы и доступ к периферии
Запуск системы, доступ к ядру процессора и определения периферийных устройств важны для каждого встраиваемого приложения.
Стандартизированный CMSIS-CORE реализован для устройств на базе Cortex-A и Cortex-M и упрощает начало работы с новым устройством или перенос программного обеспечения между устройствами. См. «Использование CMSIS во встроенных приложениях» для получения дополнительной информации.
CMSIS-Pack: легкий доступ к многократно используемым программным компонентам
Раньше программные модули было трудно интегрировать, поскольку исходные и заголовочные файлы имели нечеткие требования, несовместимую документацию или отсутствующую информацию о лицензии.
CMSIS-Pack упрощает повторное использование программного обеспечения, поскольку определяет структуру пакета программного обеспечения . Эта коллекция файлов включает исходные файлы, файлы заголовков и библиотек, а также документацию, зависимости от другого программного или аппаратного обеспечения, шаблоны исходного кода и примеры проектов.
CMSIS-SVD: единое представление устройства и периферийных устройств
Отладчик µVision предлагает для каждого поддерживаемого микроконтроллера подробные представления периферийных устройств устройства, которые отображают текущее состояние регистров.
Эти представления доступны в файлах CMSIS-SVD , которые предоставляются поставщиками микросхем. Эти файлы гарантируют, что представление отладчика соответствует фактической реализации периферийных устройств устройства.
CMSIS-DAP: возможность подключения к недорогому оценочному оборудованию
Недорогие платы разработки доступны от многих поставщиков микроконтроллеров.Часто в комплект входит недорогой модуль отладки, но для разных интерфейсов требуется настройка специального инструмента.
CMSIS-DAP - это стандартизированный интерфейс для порта доступа отладки (DAP) Cortex, который используется многими стартовыми наборами и поддерживается различными отладчиками. ΜVision Debugger включает простой в использовании интерфейс CMSIS-DAP для поддержки флэш-программирования и отладки с контролем выполнения.
CMSIS-Zone: Упростите настройку современных встроенных систем
Сегодня многие микроконтроллеры предлагают несколько ядер и дополнительные MPU.Современные микроконтроллеры на базе Armv8-M обеспечивают большую гибкость при работе с безопасным и небезопасным программированием. Таким образом, разбиение системы на разделы может стать сложной задачей.
CMSIS-Zone определяет методы для описания системных ресурсов и разделения этих ресурсов на несколько проектов и областей выполнения.
ПрограммированиеKeil и STM32 - Устранение проблем в библиотеках CMSIS | Санскар Бисвал | TheTeamMavericks
STMicroelectronics имеет собственный набор инструментов разработки, таких как STMCube IDE и STMCubeMX.Хотя CubeMX - отличный инструмент, позволяющий избежать мелких деталей, таких как инициализация на уровне регистров часов и системных периферийных устройств, Keil предоставляет несколько встроенных инструментов, таких как библиотеки CMSIS. CubeMX имеет возможность включать библиотеки CMSIS, однако они кажутся устаревшими или неполными. Таким образом, некоторые функции в конечном файле сборки отсутствуют. Кроме того, Keil - это знакомый интерфейс и инструмент разработки для нескольких разработчиков встраиваемых систем, поэтому нет смысла переходить на новую IDE только для одной платформы.
Что такое CMSIS и почему это важно?
Рис. 1 Архитектура CMSISСтандарт программного интерфейса микроконтроллера Cortex ( CMSIS ) - это библиотека скомпилированного и исполняемого кода, которая может значительно улучшить общую производительность устройств ARM. Наиболее популярными среди них являются CMSIS-NN и CMSIS-DSP.
Эти библиотеки используются для оптимизации производительности в операциях нейронных сетей и цифровой обработки сигналов. CMSIS-DSP имеет функции для среднего, стандартного отклонения, среднего, расстояния и классификации SVM.Это не только помогает сократить время разработки, но и при использовании библиотек CMSIS операции выполняются в 10–30 раз быстрее.
Таким образом, это вполне понятно, если некоторые функции live SVM не инициализируются при инициализации проекта из CubeMX. Таким образом, в следующем разделе я представлю подробный подход, чтобы избежать этой проблемы, при этом используя возможность генерации кода CubeMX.
Создание нового проекта
Традиционно создание проекта выполняется напрямую с помощью CubeMX, но в этом случае мы создадим пустой проект в Keil, а затем будем использовать CubeMX для генерации файлов внутри.
Рис.2 Создание нового проекта в KeilВыберите создать папку для вашего проекта и сохраните имя проекта. В моем случае я называю его init .
Рис.3 Выбор целевого устройстваSTEP.1 Мастер создания проекта попросит вас выбрать целевое устройство. В моем случае я использую плату обнаружения STM32F4. Таким образом, целевым устройством является STM32F407VGtx. Нажмите OK , чтобы перейти к следующему шагу.
Рис.4 Управление средой выполненияSTEP.2 На следующем шаге появится мастер Manage Runtime . На этом этапе нам нужно добавить файлы и библиотеки CMSIS.
- В разделе «Цель сборки» выберите STM32F4-Discovery.
- Откройте параметры CMSIS и выберите CORE, DSP и NN. Я предпочитаю установить для параметра DSP значение «Библиотека», но вы можете оставить его на уровне «Источник». Однако это приведет к увеличению размера сборки, поэтому вам придется выбирать в соответствии с вашими требованиями.
STEP.3 В разделе «Параметры устройства» -> «STM32Cube Framework» выберите вариант STM32CubeMX.
Рядом с ним вы увидите небольшую кнопку воспроизведения. Щелчок по нему запустит программное обеспечение CubeMX, и мы сможем объявить конфигурацию контактов как обычно.
В этом проекте я не буду инициализировать какое-либо периферийное устройство, но вы можете так же легко выполнить инициализацию любого периферийного устройства, такого как SPI или UART. Только кнопка пользователя (PA0) и светодиоды на плате (PD12 - PD15)
1Bitsy |
СТ STM32 |
STM32F415RGT |
168 МГц |
1 МБ |
128 КБ |
Контроллер 3D-принтера |
СТ STM32 |
STM32F407VET6 |
168 МГц |
512 КБ |
192 КБ |
Плата управления 3D-принтером |
СТ STM32 |
STM32F446RET6 |
180 МГц |
512 КБ |
128 КБ |
96Доски Argonkey (STEVAL-MKI187V1) |
СТ STM32 |
STM32F412CG |
100 МГц |
1 МБ |
256 КБ |
96Доски Neonkey |
СТ STM32 |
STM32F427VIT6 |
168 МГц |
1.99 МБ |
256 КБ |
96Доски Neonkey |
СТ STM32 |
STM32F411CE |
100 МГц |
512 КБ |
128 КБ |
Adafruit Feather STM32F405 |
СТ STM32 |
STM32F405RGT6 |
168 МГц |
1 МБ |
128 КБ |
AfroFlight Rev5 (8 МГц) |
СТ STM32 |
STM32F103CBT6 |
72 МГц |
128 КБ |
20 КБ |
Черный STM32F407VE |
СТ STM32 |
STM32F407VET6 |
168 МГц |
512 КБ |
128 КБ |
Черный STM32F407VG |
СТ STM32 |
STM32F407VGT6 |
168 МГц |
512 КБ |
128 КБ |
Черный STM32F407ZE |
СТ STM32 |
STM32F407ZET6 |
168 МГц |
512 КБ |
128 КБ |
Черный STM32F407ZG |
СТ STM32 |
STM32F407ZGT6 |
168 МГц |
1 МБ |
128 КБ |
BlackPill F103C8 |
СТ STM32 |
STM32F103C8T6 |
72 МГц |
64 КБ |
20 КБ |
BlackPill F103C8 (128 КБ) |
СТ STM32 |
STM32F103C8T6 |
72 МГц |
128 КБ |
20 КБ |
BlackPill F303CC |
СТ STM32 |
STM32F303CCT6 |
72 МГц |
256 КБ |
40 КБ |
Синий STM32F407VE Mini |
СТ STM32 |
STM32F407VET6 |
168 МГц |
512 КБ |
128 КБ |
BluePill F103C6 |
СТ STM32 |
STM32F103C6T6 |
72 МГц |
32 КБ |
10 КБ |
BluePill F103C8 |
СТ STM32 |
STM32F103C8T6 |
72 МГц |
64 КБ |
20 КБ |
BluePill F103C8 (128 КБ) |
СТ STM32 |
STM32F103C8T6 |
72 МГц |
128 КБ |
20 КБ |
Основная плата F401RCT6 |
СТ STM32 |
STM32F401RCT6 |
84 МГц |
256 КБ |
64 КБ |
Демо F030F4 |
СТ STM32 |
STM32F030F4P6 |
48 МГц |
16 КБ |
4 КБ |
Электросмит Дейзи |
СТ STM32 |
STM32H750IBK6 |
400 МГц |
512 КБ |
128 КБ |
Elektor Ядро узла LoRa F072C8 (128 кБ) |
СТ STM32 |
STM32F072C8T6 |
48 МГц |
128 КБ |
16 КБ |
Elektor Ядро узла LoRa F072C8 (64 КБ) |
СТ STM32 |
STM32F072C8T6 |
48 МГц |
64 КБ |
16 КБ |
Модуль Espotel LoRa |
СТ STM32 |
STM32F411RET6 |
100 МГц |
512 КБ |
128 КБ |
F407VG |
СТ STM32 |
STM32F407VGT6 |
168 МГц |
512 КБ |
128 КБ |
FK407M1 |
СТ STM32 |
STM32F407VET6 |
168 МГц |
512 КБ |
128 КБ |
FYSETC S6 |
СТ STM32 |
STM32F446VET6 |
168 МГц |
512 КБ |
128 КБ |
M200 V2 |
СТ STM32 |
STM32F070CBT6 |
48 МГц |
120 КБ |
14.81 КБ |
M300 |
СТ STM32 |
STM32F070CBT6 |
48 МГц |
120 КБ |
14.81 КБ |
Малян М200 В1 |
СТ STM32 |
STM32F103CBT6 |
72 МГц |
120 КБ |
20 КБ |
Клен |
СТ STM32 |
STM32F103RBT6 |
72 МГц |
108 КБ |
17 КБ |
Клен (RET6) |
СТ STM32 |
STM32F103RET6 |
72 МГц |
256 КБ |
48 КБ |
Maple Mini Bootloader 2.0 |
СТ STM32 |
STM32F103CBT6 |
72 МГц |
120 КБ |
20 КБ |
Кленовый мини Оригинал |
СТ STM32 |
STM32F103CBT6 |
72 МГц |
108 КБ |
17 КБ |
Microduino Core STM32 для флэш-памяти |
СТ STM32 |
STM32F103CBT6 |
72 МГц |
105.47 КБ |
16.60 КБ |
MultiTech xDot |
СТ STM32 |
STM32L151CCU6 |
32 МГц |
256 КБ |
32 КБ |
N2 + |
СТ STM32 |
STM32F405RGT6 |
168 МГц |
1 МБ |
192 КБ |
NAMote72 |
СТ STM32 |
STM32L152RC |
32 МГц |
256 КБ |
32 КБ |
OLIMEXINO-STM32 |
СТ STM32 |
STM32F103RBT6 |
72 МГц |
128 КБ |
20 КБ |
Olimex OLIMEXINO-STM32F3 |
СТ STM32 |
STM32F303RCT6TR |
72 МГц |
256 КБ |
40 КБ |
Olimex STM32-h203 |
СТ STM32 |
STM32F103RBT6 |
72 МГц |
128 КБ |
20 КБ |
Olimex STM32-P405 |
СТ STM32 |
STM32F405RGT6 |
168 МГц |
1 МБ |
192 КБ |
PYBSTICK26 Duino |
СТ STM32 |
STM32F072RB |
48 МГц |
128 КБ |
16 КБ |
PYBStick 26 Pro |
СТ STM32 |
STM32F412RE |
100 МГц |
512 КБ |
256 КБ |
PYBStick Lite 26 |
СТ STM32 |
STM32F401CEU6 |
84 МГц |
512 КБ |
96 КБ |
PYBStick Standard 26 |
СТ STM32 |
STM32F411CEU6 |
100 МГц |
512 КБ |
128 КБ |
Piconomix PX-HER0 |
СТ STM32 |
STM32L072RB |
32 МГц |
128 КБ |
20 КБ |
PrntrBoard V2 |
СТ STM32 |
STM32F407RE |
168 МГц |
512 КБ |
192 КБ |
RAK811 LoRa Tracker |
СТ STM32 |
STM32L151RBT6 |
32 МГц |
128 КБ |
16 КБ |
RAK811 LoRa Tracker |
СТ STM32 |
STM32L151RBT6 |
32 МГц |
128 КБ |
32 КБ |
RHF 76 052 |
СТ STM32 |
STM32L051C8T6 |
32 МГц |
64 КБ |
8 КБ |
СТ STM32G0316-ДИСКО |
СТ STM32 |
STM32G031J6 |
64 МГц |
128 КБ |
8 КБ |
STEVAL-FCU001V1 Оценочная плата блока полетного контроллера |
СТ STM32 |
STM32F401CCU6 |
84 МГц |
256 КБ |
64 КБ |
STM32-E407 |
СТ STM32 |
STM32F407ZGT6 |
168 МГц |
1 МБ |
128 КБ |
STM32-h507 |
СТ STM32 |
STM32F407ZGT6 |
168 МГц |
1 МБ |
128 КБ |
STM3210C-EVAL |
СТ STM32 |
STM32F107VCT6 |
72 МГц |
256 КБ |
64 КБ |
STM32373C-EVAL |
СТ STM32 |
STM32F373VCT6 |
72 МГц |
256 КБ |
32 КБ |
STM32F072-EVAL |
СТ STM32 |
STM32F072VBT6 |
48 МГц |
128 КБ |
16 КБ |
STM32F103C4 (6 КБ ОЗУ.16k Flash) |
СТ STM32 |
STM32F103C4T6 |
72 МГц |
16 КБ |
6 КБ |
STM32F103C6 (ОЗУ 10 КБ, флэш-память 32 КБ) |
СТ STM32 |
STM32F103C6T6 |
72 МГц |
32 КБ |
10 КБ |
STM32F103C8 (20 КБ ОЗУ.64k Flash) |
СТ STM32 |
STM32F103C8T6 |
72 МГц |
64 КБ |
20 КБ |
STM32F103CB (ОЗУ 20 КБ, флэш-память 128 КБ) |
СТ STM32 |
STM32F103CBT6 |
72 МГц |
128 КБ |
20 КБ |
STM32F103R4 (6 КБ ОЗУ.16k Flash) |
СТ STM32 |
STM32F103R4T6 |
72 МГц |
16 КБ |
6 КБ |
STM32F103R6 (ОЗУ 10 КБ, флэш-память 32 КБ) |
СТ STM32 |
STM32F103R6T6 |
72 МГц |
32 КБ |
10 КБ |
STM32F103R8 (20 КБ ОЗУ.64 вспышки) |
СТ STM32 |
STM32F103R8T6 |
72 МГц |
64 КБ |
20 КБ |
STM32F103RB (ОЗУ 20 КБ, флэш-память 128 КБ) |
СТ STM32 |
STM32F103RBT6 |
72 МГц |
128 КБ |
20 КБ |
STM32F103RC (48 КБ ОЗУ.256k Flash) |
СТ STM32 |
STM32F103RCT6 |
72 МГц |
256 КБ |
48 КБ |
STM32F103RD (ОЗУ 64 КБ, флэш-память 384 КБ) |
СТ STM32 |
STM32F103RDT6 |
72 МГц |
384 КБ |
64 КБ |
STM32F103RE (ОЗУ 64 КБ.512k Flash) |
СТ STM32 |
STM32F103RET6 |
72 МГц |
512 КБ |
64 КБ |
STM32F103RF (96 КБ ОЗУ, 768 КБ флэш-памяти) |
СТ STM32 |
STM32F103RFT6 |
72 МГц |
768 КБ |
96 КБ |
STM32F103RG (96 КБ ОЗУ.1024k Flash) |
СТ STM32 |
STM32F103RGT6 |
72 МГц |
1 МБ |
96 КБ |
STM32F103T4 (ОЗУ 6 КБ, флэш-память 16 КБ) |
СТ STM32 |
STM32F103T4U6 |
72 МГц |
16 КБ |
6 КБ |
STM32F103T6 (10 КБ ОЗУ.32k Flash) |
СТ STM32 |
STM32F103T6U6 |
72 МГц |
32 КБ |
10 КБ |
STM32F103T8 (ОЗУ 20 КБ, флэш-память 64 КБ) |
СТ STM32 |
STM32F103T8U6 |
72 МГц |
64 КБ |
20 КБ |
STM32F103TB (20 КБ ОЗУ.128k Flash) |
СТ STM32 |
STM32F103TBU6 |
72 МГц |
128 КБ |
20 КБ |
STM32F103V8 (ОЗУ 20 КБ, флэш-память 64 КБ) |
СТ STM32 |
STM32F103V8T6 |
72 МГц |
64 КБ |
20 КБ |
STM32F103VB (20 КБ ОЗУ.128k Flash) |
СТ STM32 |
STM32F103VBT6 |
72 МГц |
128 КБ |
20 КБ |
STM32F103VC (48 КБ ОЗУ, 256 КБ флэш-памяти) |
СТ STM32 |
STM32F103VCT6 |
72 МГц |
256 КБ |
48 КБ |
STM32F103VD (64 КБ ОЗУ.384k Flash) |
СТ STM32 |
STM32F103VDT6 |
72 МГц |
384 КБ |
64 КБ |
STM32F103VE (ОЗУ 64 КБ, флэш-память 512 КБ) |
СТ STM32 |
STM32F103VET6 |
72 МГц |
512 КБ |
64 КБ |
STM32F103VF (96 КБ ОЗУ.768k Flash) |
СТ STM32 |
STM32F103VFT6 |
72 МГц |
768 КБ |
96 КБ |
STM32F103VG (96 КБ ОЗУ, 1024 КБ флэш-памяти) |
СТ STM32 |
STM32F103VGT6 |
72 МГц |
1 МБ |
96 КБ |
STM32F103ZC (48 КБ ОЗУ.256k Flash) |
СТ STM32 |
STM32F103ZCT6 |
72 МГц |
256 КБ |
48 КБ |
STM32F103ZD (ОЗУ 64 КБ, флэш-память 384 КБ) |
СТ STM32 |
STM32F103ZDT6 |
72 МГц |
384 КБ |
64 КБ |
STM32F103ZE (64 КБ ОЗУ.512k Flash) |
СТ STM32 |
STM32F103ZET6 |
72 МГц |
512 КБ |
64 КБ |
STM32F103ZF (96 КБ ОЗУ. 768 КБ флэш-памяти) |
СТ STM32 |
STM32F103ZFT6 |
72 МГц |
768 КБ |
96 КБ |
STM32F103ZG (96 КБ ОЗУ.1024k Flash) |
СТ STM32 |
STM32F103ZGT6 |
72 МГц |
1 МБ |
96 КБ |
STM32F303CB (32 КБ ОЗУ, 128 КБ флэш-памяти) |
СТ STM32 |
STM32F303CBT6 |
72 МГц |
128 КБ |
32 КБ |
STM32F373RC (32 КБ ОЗУ.256k Flash) |
СТ STM32 |
STM32F373RCT6 |
72 МГц |
256 КБ |
32 КБ |
STM32F401CB (ОЗУ 64 КБ, флэш-память 128 КБ) |
СТ STM32 |
STM32F401CBU6 |
84 МГц |
128 КБ |
64 КБ |
STM32F401CC (64 КБ ОЗУ.256k Flash) |
СТ STM32 |
STM32F401CCU6 |
84 МГц |
256 КБ |
64 КБ |
STM32F401CD (ОЗУ 96 КБ, флэш-память 384 КБ) |
СТ STM32 |
STM32F401CDU6 |
84 МГц |
384 КБ |
96 КБ |
STM32F401CE (96 КБ ОЗУ.512k Flash) |
СТ STM32 |
STM32F401CEU6 |
84 МГц |
512 КБ |
96 КБ |
STM32F401RB (ОЗУ 64 КБ, флэш-память 128 КБ) |
СТ STM32 |
STM32F401RBT6 |
84 МГц |
128 КБ |
64 КБ |
STM32F401RC (64 КБ ОЗУ.256k Flash) |
СТ STM32 |
STM32F401RCT6 |
84 МГц |
256 КБ |
64 КБ |
STM32F401RD (96 КБ ОЗУ, 384 КБ флэш-памяти) |
СТ STM32 |
STM32F401RDT6 |
84 МГц |
384 КБ |
96 КБ |
STM32F401RE (96 КБ ОЗУ.512k Flash) |
СТ STM32 |
STM32F401RET6 |
84 МГц |
512 КБ |
96 КБ |
STM32F405RG (128 КБ ОЗУ, 1024 КБ флэш-памяти) |
СТ STM32 |
STM32F405RGT6 |
168 МГц |
1 МБ |
128 КБ |
STM32F407IG (192 КБ ОЗУ.1024k Flash) |
СТ STM32 |
STM32F407IGT6 |
168 МГц |
1 МБ |
192 КБ |
STM32F407VE (192 КБ ОЗУ, 512 КБ флэш-памяти) |
СТ STM32 |
STM32F407VET6 |
168 МГц |
502.23 КБ |
128 КБ |
STM32F407VG (128 КБ ОЗУ.1024k Flash) |
СТ STM32 |
STM32F407VGT6 |
168 МГц |
1 МБ |
128 КБ |
STM32F410C8 (32 КБ ОЗУ, 64 КБ флэш-памяти) |
СТ STM32 |
STM32F410C8T6 |
100 МГц |
64 КБ |
32 КБ |
STM32F410CB (32 КБ ОЗУ.128k Flash) |
СТ STM32 |
STM32F410CBT6 |
100 МГц |
128 КБ |
32 КБ |
STM32F410R8 (32 КБ ОЗУ, 64 КБ флэш-памяти) |
СТ STM32 |
STM32F410R8T6 |
100 МГц |
64 КБ |
32 КБ |
STM32F410RB (32 КБ ОЗУ.128k Flash) |
СТ STM32 |
STM32F410RBT6 |
100 МГц |
128 КБ |
32 КБ |
STM32F411CC (ОЗУ 128 КБ, флэш-память 256 КБ) |
СТ STM32 |
STM32F411CCU6 |
100 МГц |
256 КБ |
128 КБ |
STM32F411CE (128 КБ ОЗУ.512k Flash) |
СТ STM32 |
STM32F411CEU6 |
100 МГц |
512 КБ |
128 КБ |
STM32F411RC (128 КБ ОЗУ, 256 КБ флэш-памяти) |
СТ STM32 |
STM32F411RCT6 |
100 МГц |
256 КБ |
128 КБ |
STM32F411RE (128 КБ ОЗУ.512k Flash) |
СТ STM32 |
STM32F411RET6 |
100 МГц |
512 КБ |
128 КБ |
STM32F412CE (ОЗУ 256 КБ, флэш-память 512 КБ) |
СТ STM32 |
STM32F412CEU6 |
100 МГц |
512 КБ |
256 КБ |
STM32F412CG (256 КБ ОЗУ.1024k Flash) |
СТ STM32 |
STM32F412CGU6 |
100 МГц |
1 МБ |
256 КБ |
STM32F412RE (ОЗУ 256 КБ, флэш-память 512 КБ) |
СТ STM32 |
STM32F412RET6 |
100 МГц |
512 КБ |
256 КБ |
STM32F412RG (256 КБ ОЗУ.1024k Flash) |
СТ STM32 |
STM32F412RGT6 |
100 МГц |
1 МБ |
256 КБ |
STM32F413CG (320 КБ ОЗУ, 1024 КБ флэш-памяти) |
СТ STM32 |
STM32F413CGU6 |
100 МГц |
1 МБ |
320 КБ |
STM32F413CH (320 КБ ОЗУ.1536k Flash) |
СТ STM32 |
STM32F413CHU6 |
100 МГц |
1,50 МБ |
320 КБ |
STM32F413RG (320 КБ ОЗУ, 1024 КБ флэш-памяти) |
СТ STM32 |
STM32F413RGT6 |
100 МГц |
1 МБ |
320 КБ |
STM32F413RH (320 КБ ОЗУ.1536k Flash) |
СТ STM32 |
STM32F413RHT6 |
100 МГц |
1,50 МБ |
320 КБ |
STM32F415RG (128 КБ ОЗУ, 1024 КБ флэш-памяти) |
СТ STM32 |
STM32F415RGT6 |
168 МГц |
1 МБ |
128 КБ |
STM32F417VE (128 КБ ОЗУ.512k Flash) |
СТ STM32 |
STM32F417VET6 |
168 МГц |
512 КБ |
128 КБ |
STM32F417VG (128 КБ ОЗУ, 1024 КБ флэш-памяти) |
СТ STM32 |
STM32F417VGT6 |
168 МГц |
1 МБ |
128 КБ |
STM32F423CH (320 КБ ОЗУ.1536k Flash) |
СТ STM32 |
STM32F423CHU6 |
100 МГц |
1,50 МБ |
320 КБ |
STM32F423RH (320 КБ ОЗУ. 1536 КБ флэш-памяти) |
СТ STM32 |
STM32F423RHT6 |
100 МГц |
1,50 МБ |
320 КБ |
STM32F446RC (128 КБ ОЗУ.256k Flash) |
СТ STM32 |
STM32F446RCT6 |
180 МГц |
256 КБ |
128 КБ |
STM32F446RE (ОЗУ 128 КБ, флэш-память 512 КБ) |
СТ STM32 |
STM32F446RET6 |
180 МГц |
512 КБ |
128 КБ |
STM32F4 Штамп F405 |
СТ STM32 |
STM32F405RGT6 |
168 МГц |
1 МБ |
192 КБ |
SensorTile.ящик |
СТ STM32 |
STM32L4R9ZI |
120 МГц |
2 МБ |
640 КБ |
Спарки V1 F303 |
СТ STM32 |
STM32F303CCT6 |
72 МГц |
256 КБ |
40 КБ |
ThunderPack v1.0 |
СТ STM32 |
STM32L072KZ |
32 МГц |
192 КБ |
20 КБ |
ThunderPack v1.1+ |
СТ STM32 |
STM32F411CEU6 |
100 МГц |
512 КБ |
128 КБ |
Крошечный STM103T |
СТ STM32 |
STM32F103TBU6 |
72 МГц |
128 КБ |
20 КБ |
VAkE v1.0 |
СТ STM32 |
STM32F446RET6 |
180 МГц |
512 КБ |
128 КБ |
VCCGND F103ZET6 Mini |
СТ STM32 |
STM32F103ZET6 |
72 МГц |
512 КБ |
64 КБ |
VCCGND F407ZGT6 Mini |
СТ STM32 |
STM32F407ZGT6 |
72 МГц |
512 КБ |
64 КБ |
Waveshare Open 103Z |
СТ STM32 |
STM32F103ZET6 |
72 МГц |
512 КБ |
64 КБ |
WeAct Studio BlackPill V2.0 (STM32F401CC) |
СТ STM32 |
STM32F401CCU6 |
84 МГц |
256 КБ |
64 КБ |
WeAct Studio BlackPill V2.0 (STM32F411CE) |
СТ STM32 |
STM32F411CEU6 |
100 МГц |
512 КБ |
128 КБ |
WeAct Studio BlackPill V3.0 (STM32F401CE) |
СТ STM32 |
STM32F401CEU6 |
84 МГц |
512 КБ |
96 КБ |
Призрак V1 ESC |
СТ STM32 |
STM32F051K6 |
48 МГц |
32 КБ |
7.75 КБ |
Начало работы с STM32 | СТМ32-базовый проект
Добро пожаловать в первое руководство из серии руководств.Это руководство предназначено для новичков (любителей, студентов), которые хотят начать работу с микроконтроллерами STM32, но не знают , как , или , где , чтобы начать работу.
Это руководство дает вам обзор доступного аппаратного и программного обеспечения для работы с микроконтроллерами STM32. Кроме того, он кратко познакомит вас с семейством микроконтроллеров STM32.
Все руководства, кроме этого, предполагают, что вы будете использовать проект на основе STM32. Чтобы следовать приведенным ниже руководствам, вам потребуется базовое понимание языка программирования C.Предварительный опыт работы со встроенной платформой не требуется.
Введение в STM32
STM32 не относится к одному конкретному микроконтроллеру. Это название, которое STMicroelectronics дала семейству микроконтроллеров на базе ARM Cortex-M. Само семейство STM32 можно разделить на несколько групп, которые, в свою очередь, можно разделить на серии.
В настоящее время семейство STM32 состоит из пятнадцати серий. Эти серии сгруппированы в четыре группы: High Performance, Mainstream, Ultra Low Power и Wireless.В следующем списке кратко описывается каждая серия:
- STM32F0 (Mainstream)
На базе процессора Arm Cortex-M0. Оптимизирован для низкой стоимости. Создан для конкуренции с 8-битными и 16-битными платформами. - STM32F1 (Mainstream)
На базе процессора Arm Cortex-M3. Общее назначение. - STM32F2 (высокая производительность)
На базе процессора Arm Cortex-M3. Общее назначение. Оптимизирован для высокой производительности. - STM32F3 (Mainstream)
На основе процессора Arm Cortex-M4 с инструкциями FPU и DSP.Оптимизирован для приложений со смешанными сигналами. - STM32F4 (высокая производительность)
На основе процессора Arm Cortex-M4 с инструкциями FPU и DSP. Оптимизирован для высокой производительности. - STM32F7 (высокая производительность)
На основе процессора Arm Cortex-M7 с инструкциями FPU и DSP. Оптимизирован для высокой производительности. Контактная совместимость с серией STM32F4. - STM32G0 (Mainstream)
На базе процессора Arm Cortex-M0 +.Оптимизирован для повышения эффективности. Создан для конкуренции с 8-битными и 16-битными платформами. - STM32G4 (Mainstream)
На основе процессора Arm Cortex-M4 с инструкциями FPU и DSP. Оптимизирован для приложений со смешанными сигналами. Преемник серии STM32F3. - STM32H7 (высокая производительность)
На основе процессора Arm Cortex-M7 с инструкциями FPU и DSP. Некоторые устройства имеют второй сопроцессор на базе Arm Cortex-M4. - STM32L0 (сверхнизкое энергопотребление)
На базе процессора Arm Cortex-M0 +.Оптимизирован для приложений с низким энергопотреблением. - STM32L1 (сверхнизкое энергопотребление)
На базе процессора Arm Cortex-M3. Оптимизирован для приложений с низким энергопотреблением. - STM32L4 (сверхнизкое энергопотребление)
На основе процессора Arm Cortex-M4 с инструкциями FPU и DSP. Оптимизирован для приложений с низким энергопотреблением. - STM32L4 + (сверхнизкое энергопотребление)
На основе процессора Arm Cortex-M4 с инструкциями FPU и DSP. Оптимизирован для приложений с низким энергопотреблением.Более высокая производительность, чем у серии STM32L4. - STM32L5 (сверхнизкое энергопотребление)
На базе процессора Arm Cortex-M33. Оптимизирован для приложений с низким энергопотреблением. Повышенная безопасность. - STM32WB (беспроводной)
На основе процессора Arm Cortex-M4 с инструкциями FPU и DSP. Имеет второй процессор Arm Cortex-M0 + в качестве сетевого процессора. Поддерживает стандарты беспроводной связи Bluetooth 5 и IEEE 802.15.4.
Оборудование
Для начала вам понадобится хотя бы одна плата разработки.Без платы разработки вы не сможете правильно запускать или отлаживать свой код. Если у вас уже есть макетная плата, вы можете пропустить эту главу.
Микроконтроллеры
Семейство STM32 состоит из множества различных микроконтроллеров. Новичку сложно выбрать один. К счастью, большинство вещей, которые вам нужно изучить в первую очередь, являются общими для всех микроконтроллеров семейства STM32. Это означает, что вы можете начать практически с любого микроконтроллера STM32.
Есть две серии, которые лучше подходят для начинающих, чем другие серии.Серии STM32F1 и STM32F4. Причина проста:
Обе серии существуют уже давно и до сих пор популярны среди любителей. Это означает, что для устройств этой серии доступно много ресурсов. Кроме того, устройства серии STM32F1 не такие сложные, как большинство других частей.
Платы для разработки
Большинство плат для разработки предназначены для работы с минимальным количеством компонентов. Они разработаны таким образом, чтобы быть максимально дешевыми и никоим образом не ограничивать пользователя.Есть также платы с дополнительными компонентами, такими как светодиоды, датчики и память.
Большинство контактов, если не все, микроконтроллера открываются через заголовки для облегчения доступа. Также имеется как минимум один выделенный заголовок для подключения отладчика.
Макетные платы производятся разными партиями. STMicroelectronics предлагает три различных диапазона плат для разработки:
- Платы Nucleo
Эти платы очень похожи на платы Arduino.В них есть только микроконтроллер и встроенный отладчик ST-Link. Доступны три форм-фактора. - Комплекты Discovery
Все эти платы содержат устройства ввода и вывода в дополнение к микроконтроллеру. Эти платы также поставляются со встроенным отладчиком ST-Link. - Оценочные платы
Эти платы очень обширны и содержат множество дополнительных устройств и интерфейсов в дополнение к микроконтроллеру.
Есть также много плат, которые можно купить на Ebay и AliExpress.Самыми популярными из них являются Blue Pill и Black Pill. Последний является улучшенной версией первого.
Рекомендации
Платы Nucleo и Discovery очень хорошо подходят для абсолютных новичков. Они гарантированно работают правильно и включают встроенный отладчик. И все это по доступным ценам. Если у вас очень ограниченный бюджет, вы можете купить одну из китайских плат для разработки. Для начинающих рекомендуются следующие доски:
- NUCLEO-F103RB
На этой плате установлено устройство STM32F103RBT6 с 128 КБ флэш-памяти. - STM32F407G-DISC1
На этой плате установлено устройство STM32F407VGT6 с 1024 КБ флэш-памяти. - Black Pill
На этой плате установлено устройство STM32F103C8T6 с 64 КБ флэш-памяти. Не забудьте также купить клон ST-Link для отладки и прошивки.
Программное обеспечение
Если вы хотите начать работу с проектом на базе STM32, вам не нужно делать много выбора со стороны программного обеспечения. Проект на базе STM32 разработан для использования с GNU Arm Embedded Toolchain.STM32-base можно использовать с любимым редактором кода. Рекомендация для редактора - Visual Studio Code.
Другое программное обеспечение, обсуждаемое в этой главе, можно использовать, если вы не хотите использовать проект на базе STM32. Другое программное обеспечение обсуждается, чтобы дать вам лучший обзор всего доступного программного обеспечения для микроконтроллеров STM32.
IDE
IDE - это интегрированная среда разработки. Обычно это означает, что после установки IDE готова к использованию без каких-либо дополнительных действий.IDE устанавливают все необходимое программное обеспечение, такое как компиляторы и драйверы, после их установки.
Некоторые IDE бесплатны, для других требуется покупка лицензии. Перечисленные здесь IDE потенциально интересны новичкам и любителям, поскольку они бесплатны. Полный обзор доступных IDE см. На веб-сайте ST.
- Arm Keil MDK - Бесплатно для серий STM32G0, STM32F0 и STM32L0 (Windows)
- PlatformIO IDE - Бесплатная (Windows, Linux, macOS)
- STM32CubeIDE - Бесплатно (Windows, Linux, macOS)
- Segger Embedded Studio - бесплатно для некоммерческого использования (Windows, Linux, macOS)
- SW4STM32 - Бесплатно (Windows, Linux, macOS)
Платформы
Платформыпредлагают, помимо IDE, собственный API для управления устройством.Подобные платформы обычно предназначены для создания прототипов. Для микроконтроллеров STM32 доступны две платформы.
Первый - STM32duino. Эта платформа реализует хорошо известный Arduino API для микроконтроллеров STM32. Его можно использовать с Arduino IDE.
Второй - Arm Mbed. Эта платформа поддерживает не только микроконтроллеры STM32. Он поддерживает широкий спектр устройств от разных производителей. Mbed включает ОС, специально разработанную для приложений Интернета вещей.Он имеет как облачную IDE, так и загружаемый вариант.
Другое
ST предлагает CMSIS и HAL для каждой серии устройств. CMSIS содержит все определения регистров и периферии, необходимые для использования доступных периферийных устройств на микроконтроллере. HAL - это библиотека более высокого уровня, которая предлагает переносимость кода между различными сериями. Код CMSIS и HAL распространяется в так называемых пакетах STM32Cube.
Популярная альтернатива официальной CMSIS с открытым исходным кодом - libopencm3.Этот проект направлен на создание библиотеки прошивки с открытым исходным кодом для микроконтроллеров Arm Cortex-M. Поддерживаются не все серии STM32.
libopencm3 для чувствительного к лицензии разработчика Cortex-M
Я думал о запуске нового проекта с открытым исходным кодом, который должен работать на платах STM32, и понял, что для этого потребуется много низкоуровневого кода, который обращается ко многим различным периферийным устройствам. Одна из первых библиотек, которая приходит на ум, и я уверен, что она одинакова для многих разработчиков Cortex-M, - это ARM CMSIS.
ARM создала CMSIS, что означает стандарт программного интерфейса микроконтроллеров Cortex, чтобы дать спецификацию того, как разрабатывать и распространять код, который обращается к оборудованию. Такие продукты, как STM32, предлагают собственные программные пакеты, соответствующие CMSIS и обеспечивающие доступ ко всем регистрам и функциям чипа. ST Microelectronics, например, предоставляет стандартную периферийную библиотеку STM32F10x, а в последнее время - STM32CubeF1.
До недавнего времени CMSIS распространялась с ограничением ARM EULA; в частности, это соглашение содержит пункт, который дает разработчику лицензию на:
(ii) использовать, копировать, изменять и сублицензировать Исходный код (в форме исходного или объектного кода) исключительно с целью разработки, разработки, производства, изготовления, предложения к продаже, продажи, поставки или иного распространения продуктов, которые соответствовать Спецификации, при условии, что вы сохраните все уведомления об авторских правах, включенные в Исходный код.
Похоже, это заставляет разработчиков соблюдать спецификацию CMSIS при создании программы, использующей библиотеку CMSIS. В настоящее время ситуация изменилась, поскольку исходный код CMSIS (не спецификация) был выпущен ARM под гораздо менее жесткой лицензией BSD. Эта лицензия позволяет, например, использовать код CMSIS в проекте с открытым исходным кодом с единственным требованием сохранить уведомление об авторских правах, условия лицензии и отказ от ответственности в отношении этих файлов. Это также позволяет использовать код в проекте с закрытым исходным кодом при условии, что вы документируете использование и авторские права на исходный код CMSIS при распространении двоичного файла.Чтобы загрузить из ARM пакет CMSIS (содержащий исходный код), вам необходимо зарегистрироваться, поэтому можно сказать, что загрузка не «бесплатна», так как вы должны «заплатить» своими учетными данными и контактной информацией. Но тот факт, что часть исходного кода пакета находится под лицензией BSD, означает, что любой может законно распространять эту часть под той же лицензией, например, ее можно бесплатно получить из репозитория ARM-CMSIS-BSD GitHub без регистрации.
Пакет CMSIS, созданный ARM, обеспечивает доступ к функциям микроконтроллера Cortex-M, но любой микроконтроллер имеет другие периферийные устройства и память внутри чипа; по этой причине существуют библиотеки для конкретных микросхем.Стандартная периферийная библиотека STM32 распространяется (может быть загружена бесплатно) компанией ST Microelectronics без лицензии, и для получения лицензии вам необходимо связаться с ST. Но этот код был заменен их инициативой «Куб», которая предлагает те же (или обновленные) функциональные возможности в библиотеке HAL (Hardware Abstraction Layer), распространяемой по лицензии BSD, следуя пути, который ARM пошла с кодом CMSIS.
Согласно терминологии GNU (поддерживаемой Free Software Foundation) лицензия BSD не является лицензией без авторского лева, потому что она позволяет распространять код с более строгими ограничениями, например, распространяя его в продукт в двоичной форме, вы практически запрещаете пользователю от просмотра исходного кода.Для ARM и ST имеет смысл распространять свой код под такой лицензией, потому что пользователи кода CMSIS и библиотек STM32 иногда являются компаниями, которые разрабатывают проприетарные программные продукты и продают их в двоичной форме вместе с оборудованием, и именно эти компании покупают фишки и приносить им прибыль. С другой стороны, лицензия BSD позволяет любителям, студентам и т. Д. Использовать код и микроконтроллеры, тем самым повышая популярность, базу пользователей и программную экосистему аппаратного продукта.В моей интерпретации их философии FSF сказал бы, что такая свобода нежелательна, и одна из причин заключается в том, что она позволяет распространять открытый исходный код в двоичный код, и мы не можем (легко) узнать, является ли исходный код открытый исходный код был изменен или даже есть там. Злоумышленник может продать код, не выдавая кредита, или потенциально может внедрить уязвимости в наши устройства. Вместо этого FSF предложит лицензии GPL.
Можно разработать, независимо от ARM или ST и их кода, низкоуровневую библиотеку для доступа к периферийным устройствам Cortex-M и STM32 и выпустить ее под лицензией GPL, что вынуждает любого, кто разрабатывает программу с этим кодом, использовать GPL, когда распространение программы.Так что эту библиотеку можно использовать только в проектах с открытым исходным кодом. Это было намерением libopenstm32 (выпущенного под GPL3), намерение, которое не было полностью воспринято: GPL является «вирусным» и ограничительным в определенном смысле, потому что вынуждает разработчика сохранять исходный код открытого кода, а также распространять его модификации, и использовать одну и ту же лицензию для всего кода, который ее связывает.
Исходя из практических последствий этих ограничений, FSF рекомендует следующее:
Если разработчики уже используют установленную альтернативную библиотеку, выпущенную под несвободной лицензией или слабой лицензией, мы рекомендуем использовать Стандартную общественную лицензию ограниченного применения GNU (LGPL).
Это так, потому что библиотеки CMSIS и STM32Cube выпускаются под «слабой» лицензией, такой как лицензия BSD. Возможно, по этой причине проект libopenstm32 принял другой оборот: он был переименован в libopencm3 с целью охвата различных микроконтроллеров, а не только STM32, и был выпущен под «меньшей» LGPL3. «Меньшие» лицензии GPL особенно полезны для программных библиотек и позволяют связывать библиотеку как с закрытыми, так и с открытыми программами, при условии, что библиотека и ее модификации выпускаются под LGPL, а также предоставляют что-то весьма своеобразное для встроенной разработки. что требует пояснения:
Применение лицензии LGPL3 вполне естественно для разделяемых (динамических) библиотек Linux, которые распространяются в виде файлов отдельно от основной программы.Но когда мы разрабатываем микроконтроллеры, мы (почти всегда) создаем единый двоичный файл, который содержит все библиотеки, связанные статически. FSF объясняет в FAQ по GPL, какую дисциплину следует принять:
(1) Если вы статически связываетесь с библиотекой LGPL’d, вы также должны предоставить свое приложение в объектном (не обязательно исходном) формате, чтобы у пользователя была возможность изменить библиотеку и повторно связать приложение.
Итак, если кто-то будет использовать библиотеку LGPL3 в своей собственной программе с закрытым исходным кодом, он также должен предоставить пользователю возможность переделать связывающую часть.Иногда это может быть проблемой (предоставить архив объектов, сценарий компоновщика и команду компоновщика; удалить символы отладки; знать о инструментальной цепочке), но в общих случаях это кажется выполнимым.
В заключение, разработчик Cortex-M в настоящее время имеет множество вариантов, если они хотят использовать существующую низкоуровневую библиотеку для доступа к периферийным устройствам. Существуют библиотеки CMSIS и STM32Cube, которые выпускаются под лицензией BSD, поэтому их можно использовать в любом проекте и изменять по желанию, и эти модификации могут быть закрыты в двоичном формате и не переданы сообществу открытого исходного кода.Кроме того, существует библиотека libopencm3, которая используется совместно с LGPL3 и поэтому ее можно использовать в любом проекте, изменения должны быть переданы обратно, если они распространяются, и связывание должно быть возможным даже при использовании для программ с закрытым исходным кодом. Оба варианта допустимы, я надеюсь, что этот пост позволит разработчикам принять более обоснованное решение.
В настоящее время я пробую libopencm3, который кажется довольно богатым и развитым для поддержки многих микроконтроллеров; Я скоро напишу об этом.
Нравится:
Нравится Загрузка ...
Связанные
Как запустить модель глубокого обучения на микроконтроллере с CMSIS-NN
Сообщение от: Chengwei 2 года, 11 месяцев назад
(Комментарии)
TL; DR Вы узнаете, как запустить модель классификации изображений CIFAR10 на микроконтроллере ARM, таком как на плате обнаружения STM32F4 или аналогичном.
Зачем запускать модель глубокого обучения на микроконтроллере?
Если вы раньше играли с Arduino, легко может сложиться впечатление, что это маленькие микросхемы с ограниченными вычислительными ресурсами и ресурсами памяти, но исключительные, когда речь идет о сборе данных с различных датчиков или управлении сервоприводом на руке робота.
Многие микроконтроллеры работают либо в операционной системе реального времени, такой как FreeRTOS, либо в ее «голом железе» без ОС. Оба способа делают их достаточно стабильными и отзывчивыми, особенно в критических ситуациях.
Однако по мере того, как с помощью датчиков собиралось все больше и больше данных, два наиболее распространенных типа данных - звук и изображение - требовали значительного количества вычислительных ресурсов для обработки и получения полезных результатов. Эта задача обычно выполняется путем запроса микроконтроллера загрузки данных на подключенный к сети сервер, и сервер отправляет обработанные результаты обратно на границу, затем микроконтроллер будет выполнять определенные действия, такие как ответ с приветствием и включение света.
Возможно, вы уже заметили некоторые недостатки этого плана.
- Конфиденциальные данные попадают в облако, фотографии и аудиозаписи.
- Компания, которая продает это, может взимать плату за использование своих услуг и, что еще хуже, продавать ваши личные данные.
- Он не будет работать без сетевого подключения к серверу.
- Обмен данными между устройством и сервером приводит к задержке.
- Требуются сетевые и беспроводные аппаратные компоненты в схемотехнике, которые увеличивают стоимость.
- Это могло привести к потере полосы пропускания на отправку бесполезных данных.
Разве не было бы неплохо, если бы все было автономно прямо внутри микроконтроллера, что экономило бы полосу пропускания, мощность и стоимость, но также было бы с низкой задержкой, невероятной надежностью и конфиденциальностью?
Обзор CMSIS-NN
CMSIS-NN - это набор оптимизированных функций нейронной сети для микроконтроллеров ядра ARM Cortex-M, позволяющий передавать нейронные сети и машинное обучение в конечный узел приложений IoT.
В нем реализованы популярные типы слоев нейронной сети, такие как свертка, свертка с разделением по глубине, полносвязный, опрос и активация. С его служебными функциями также можно создавать более сложные модули NN, такие как LSTM и GRU.
Для модели, обученной с помощью популярного фреймворка, такого как TensorFlow, Caffe. Веса и смещения сначала квантуются до 8-битных или 16-битных целых чисел, а затем передаются в микроконтроллер для вывода.
Вывод нейронной сети на основе ядер CMSIS-NN требует достижения 4.6-кратное улучшение времени выполнения / пропускной способности и 4,9-кратное улучшение по сравнению с базовой реализацией. Наилучшая производительность была достигнута за счет использования функций SIMD-инструкций ЦП для улучшения параллелизма, доступного для микроконтроллеров ядра Cortex-M4 и Cortex-M7, хотя эталонная реализация для Cortex-M0 и Cortex-M3 также доступна без инструкций DSP.
Запуск модели на микроконтроллере
В этом разделе мы запустим модель классификации изображений CIRAR10 на плате обнаружения STM32F4 или аналогичной с Keil MDK-ARM.
Перед тем, как продолжить, вам понадобится:
- ПК с Windows с установленным Keil MDK-ARM. Вы можете найти инструкцию по приобретению и установке программного обеспечения в моем репозитории GitHub.
- Плата микроконтроллера ядра Cortex-M4 или Cortex-M7, предпочтительно плата обнаружения STM32F4, выбранная для этого руководства.
Включите плату в первый раз,
- Не , а подключить плату к ПК! Перейдите в C: \ Keil_v5 \ ARM \ STLink \ USBDriver и дважды щелкните stlink_winusb_install.bat , чтобы установить драйверы для встроенного USB ST-Link / V2.
- Подключите USB-блок питания к порту USB ST-Link / V2 к компьютеру с помощью кабеля Mini USB. Windows распознает устройство ST-Link / V2 и автоматически установит драйверы.
Встроенный микроконтроллер STM32F407VGT6 оснащен 32-битным ARM® Cortex® -M4 с ядром FPU, 1-мегабайтной флеш-памятью и 192-килобайтной оперативной памятью при максимальной потребляемой мощности 465 мВт.
Несмотря на то, что проект в моем GitHub настроен и готов к запуску на плате, это полезно, если вы хотите знать, как он настроен, или если вы хотите запустить на другой цели.
Проект основан на официальном примере CMSIS-NN CIFAR10, поэтому загрузите все репозиторий CMSIS_5 с GitHub.
Вы можете получить доступ к примеру проекта по адресу
. \ CMSIS \ NN \ Примеры \ ARM \ arm_nn_examples \ cifar10
Добавить новую цель
Откройте проект arm_nnexamples_cifar10.uvprojx
с помощью Keil MDK-ARM. Изначально проект был настроен для работы только на симуляторе, мы начнем с добавления новой цели. Проект можно настроить для работы на разных микроконтроллерах / платах, и Keil MDK-ARM организует их с помощью «целей».
Щелкните правой кнопкой мыши текущую цель, затем нажмите кнопку « Manage Project Items » в меню.
Создайте новую цель и назовите ее, например, «STM32F407DISCO», чтобы помочь вам запомнить ее цель. Выделите новую цель и нажмите « Установить как текущую цель », затем « OK ».
Настроить параметры цели
Откройте целевые параметры и перейдите на вкладку « Device », чтобы выбрать целевой микроконтроллер.Если вы не можете найти "STM32F407", то необходимо получить его из установщика пакетов вручную или открыв существующий проект, настроенный с помощью платы STM32F4 DISCO, тогда IDE предложит установить его.
Перейдите на вкладку « Target » и измените частоту внешнего кристалла на 8 МГц, а также области памяти на кристалле, чтобы они совпадали с таковыми на плате.
На вкладке «C / C ++» добавьте «HSE_VALUE = 8000000» в качестве предопределенного символа, чтобы сообщить компилятору, что частота внешнего кристалла составляет 8 МГц.Это то же самое, что и определение следующей строки в исходном коде C / C ++, за исключением того, что предопределенные символы позволяют скомпилировать проект для различных целевых конфигураций без изменения исходного кода.
#define HSE_VALUE ((uint32_t) 8000000)
При желании можно отключить оптимизацию компилятора, чтобы улучшить процесс отладки. Оптимизация компилятора более высокого уровня с одной стороны улучшает код, заставляя программное обеспечение потреблять меньше ресурсов, но с другой стороны сокращает отладочную информацию и изменяет структуру кода, что затрудняет отладку кода.
На вкладке « Debug » выберите «ST-Link Debugger», поскольку он доступен на плате STM32F4 DISCO, нажмите кнопку «Настройки», чтобы настроить его.
Если плата подключена, адаптер отладчика ST-LINK / V2 появится в новом окне и проверьте, что выбран порт «SW».
На вкладке «Trace» введите правильную частоту CPU Core Clock , как указано в вашем проекте. Установите флажок Trace Enable .Trace позволяет просматривать сообщения printf через SWO (однопроводной вывод), который представляет собой однополюсный асинхронный последовательный канал связи, доступный на Cortex-M3 / M4 / M7 и поддерживаемый основными зондами отладчика. Эта функция аналогична функции Arduino « Serial.printf » для распечатки отладочной информации, за исключением бесплатного порта UART.
На вкладке « Flash Download » добавьте алгоритм программирования «STM32F4xx Flash», чтобы вы могли загрузить двоичный файл в его флэш-память.
Теперь подтвердите изменения и закройте окно «Параметры для цели ».
Настроить для работы на частоте 168 МГц
Есть еще один шаг для настройки микроконтроллера для работы на частоте 168 МГц в файле запуска.
Самый простой способ - заменить мой файл запуска из GitHub вашим, при этом стоит упомянуть некоторые моменты, чтобы узнать, как работают системные часы микроконтроллера в целом.
/ ******************** Параметры ФАПЧ ****************** / / * PLL_VCO = (HSE_VALUE или HSI_VALUE / PLL_M) * PLL_N = 8000000/8 * 336 = 336 МГц * / // PLL_M = HSE_VALUE (в Гц) / 1 МГц = 8000000/1000000 = 8 #define PLL_M 8 #define PLL_N 336 / * SYSCLK = PLL_VCO / PLL_P = 336 МГц / 2 = 168 МГц * / #define PLL_P 2 / * USB OTG FS, SDIO и тактовая частота RNG = PLL_VCO / PLLQ = 336 МГц / 7 = 48 МГц * / #define PLL_Q 7
Нам нужно установить параметр «PLL_M» равным 8, чтобы в конечном итоге получить системную тактовую частоту 168 МГц.
Pretty Little Liars, сокращенно PLL, подождите, я имею в виду, цикл фазовой синхронизации - это механизм генерации тактовых импульсов в микроконтроллере, который используется для генерации тактовой частоты, намного превышающей внутреннюю или внешнюю кварцевую частоту. Если вы играли с платой Arduino, такой как Leonardo, вы уже знакомы с PLL, хотя ваш код Arduino работает с системной частотой 16 МГц, но его шина USB2.0 имеет повышенную частоту 48 МГц от встроенной PLL. С установленными параметрами PLL, вот диаграмма общей конфигурации часов для STM32F4.Он показывает, как системные часы 168 МГц выводятся из начальных 8 МГц высоких частот речи (HSE).
Сборка и отладка
Теперь, когда плата подключена к вашему ПК, мы готовы, просто создайте и отладьте приложение.
Включите представление трассировки сообщений printf и запустите код, вы увидите вывод модели CIFAR10.
С цветным изображением 32x32 пикселя в качестве входных данных, которое затем классифицируется моделью в один из 10 выходных классов.
Поскольку значение является выходом уровня softmax, каждое число обозначает вероятность для одного из 10 классов изображений. В следующем случае метка 5 соответствует метке «собака» с наибольшим номером, что означает, что модель нашла собаку на входном изображении.
В следующем разделе я покажу вам, как наполнить модель вашим пользовательским изображением.
Создание новых входных изображений
IMG_DATA в arm_nnexamples_cifar10_inputs.h определяет входные данные изображения.Массив изображений сохраняется в формате HWC или в формате «высота-ширина-канал», цветное изображение 32x32 RGB с 32 x 32 x 3 = 3072 значениями.
Можно ли использовать на входе изображение с более высоким разрешением? Да, но сначала необходимо изменить размер и обрезать это изображение, чего можно добиться с помощью следующего фрагмента кода Python.
из keras. Предварительная обработка изображения импорта из PIL import Image, ImageOps импортировать numpy как np def resizeImage (srcfile, new_width = 32, new_height = 32): '' ' Измените размер и обрежьте изображение до желаемого разрешения и верните данные как массив numpy в формате HWC.srcfile: путь к файлу исходного изображения. new_width: новая желаемая ширина. new_height: новая желаемая высота. '' ' pil_image = Image.open (srcfile) pil_image = ImageOps.fit (pil_image, (новая_ширина, новая_высота), Image.ANTIALIAS) pil_image_rgb = pil_image.convert ('RGB') вернуть np.asarray (pil_image_rgb) .flatten ()
Функция вернет массив numpy, содержащий 3072 числа, которые затем будут обрезаны до чисел int8 и записаны в файл заголовка в правильном формате.
Резюме и дополнительная литература
Хотите перейти на исходный код и узнать, как все работает? Это будет мой следующий пост в блоге.
А пока вот некоторые ресурсы, которые я считаю полезными, чтобы узнать о микроконтроллерах ARM Cortex-M, STM32, CMSIS-NN, Keil-MDK и т. Д.
ARM Cortex-M WiKi
STM32F4-Discovery Краткое руководство по началу работы
Пример платы STM32F4DISCOVERY, код
Программная библиотека CMSIS NN doc
Arm's Project Trillium - Машинное обучение процессоров
Не забудьте проверить исходный код на моей странице GitHub.