Cmsis stm32: Штурмуем STM32 | Библиотека CMSIS

Содержание

Библиотека 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.

h:

Последнее, о чём нужно упомянуть, это перечисление 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

. После некоторого раздумия появляется окно выбора микроконтроллера, в моем случае это STM32F072RB в корпусе LQFP64, выбираю нужную строку, жму далее. Далее предлагается выбрать имя проекта, расположение, язык программирования C/C++, исполняемый файл/статическая библиотека и будет-ли проект сгенерирован с помощью CubeMX или сами с усами. Генерация кубом, в данном случае не нужна, поэтому тип проекта Empty — финиш.




Слева, в окне 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 в проект. Библиотека состоит из файлов ядра и файлов периферии. Файлы ядра начинаются с
core_
или cmsis_ они общие для всех микроконтроллеров, использующих данное ядро. Файлы периферии содержат в названии наименование микроконтроллера stm32 и специфичны для конкретного производителя, в данном случае, компании STM.

В распакованном виде архив содержит папку 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 логично было-бы к папкам

src, но если так сделать, то в дереве проекта будут отдельно добавлены эти папки. Чтобы не загромождать визуально дерево, в 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, мне пришлось перелопатить достаточно много мануалов, чтобы осознать вещи, кажущиеся сейчас очевидными.

Чем отличаются друг от друга CMSIS, STM32CubeMX и MBED | arm

По сути это все библиотеки для платформы ARM Cortex (STM32). CMSIS содержит низкоуровневые, не зависящие от производителя методы для доступа к аппаратуре микроконтроллеров ARM Cortex. Некоторые производители, например STM, предоставляют библиотеки поверх CMSIS или в дополнение к CMSIS, такие как STM32CUBE. Библиотеки MDED предоставляют высокоуровневый, независимый от производителя интерфейс программирования (C++ API) для аппаратуры микроконтроллеров различных производителей. Библиотека MBED может использовать соглашения по программированию CMSIS, вызовы функций CMSIS, или может быть функций STM32CUBE.

Детали реализации зависят от используемой части библиотеки и выбранной модели микроконтроллера.

В программе на основе MBED есть следующие уровни (если спускаться от высокого уровня к самому низкому):

6. Ваша программа на C++.
5. Библиотека MBED C++.
4. Слой HAL библиотеки MBED, нацеленный на определенную модель микроконтроллера.
3. Слой HAL библиотек, предоставленный производителем (такой как STM32CubeMX) - не обязательный слой.
2. Слой библиотек CMSIS, нацеленный на определенную модель микроконтроллера.
1. Микроконтроллер.

Слой CMSIS работает как легкая абстракция, находящаяся между остальным кодом и железом микроконтроллера. Изначально CMSIS представлял из себя только заголовочные файлы с описанием регистров, но потом были добавлены низкоуровневые функции. В основном CMSIS гарантирует, что доступ к регистрам CPU, прерываниям и т. п. будет (почти) одинаковым для всех поддерживаемых моделей микроконтроллеров. Тогда предоставленный производителем слой HAL (например STM32Cube) может использоваться для упрощения доступа к остальной периферийной части микроконтроллера. Слой MBED HAL предоставляет традиционный API на языке C для управления периферийными устройствами микроконтроллера, и он может использовать (а может и не использовать) для этого опциональный слой HAL от производителя микроконтроллера. Библиотека MBED C++ содержит обычные объекты C++ для различных периферийных устройств (например DigitalOut, SPI, Serial). Эти объекты используют традиционный API на языке C, предоставленный слоем HAL. И наконец, Ваша программа находится на самой вершине этого стека, и она использует объекты C++ для управления микроконтроллером на верхнем уровне, используя все эти промежуточные слои абстракции.

В сущности все эти слои позволяют программе быть независимой от выбранного микроконтроллера. То есть Вы не должны иметь дело с библиотекой STM32Cube, или с HAL API, используя вместо этого библиотеку MBED C++. В редких случаях понадобится использовать некоторые функции CMSIS, такие как __disable_irq() и NVIC_SystemReset().

[Ссылки]

1. STM32: аббревиатуры и термины.
2. Cortex Microcontroller Software Interface Standard.

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.

Роботы? Это просто!
Оказывается, ещё в январе, в стандартную библиотеку — 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 — представляет собой целое число, указывающее основание счисления.
Коэффициенты масштабирования передаются для смещения (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. 73.0.0)
*--------------------------------------------------------------------------------------------------
* 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, ориентированных на мультимедийные приложения.

На плате установлен 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 значение «Библиотека», но вы можете оставить его на уровне «Источник». Однако это приведет к увеличению размера сборки, поэтому вам придется выбирать в соответствии с вашими требованиями.
Рис.5 Инициализация устройства с помощью CubeMX

STEP.3 В разделе «Параметры устройства» -> «STM32Cube Framework» выберите вариант STM32CubeMX.

Рядом с ним вы увидите небольшую кнопку воспроизведения. Щелчок по нему запустит программное обеспечение CubeMX, и мы сможем объявить конфигурацию контактов как обычно.

В этом проекте я не буду инициализировать какое-либо периферийное устройство, но вы можете так же легко выполнить инициализацию любого периферийного устройства, такого как SPI или UART. Только кнопка пользователя (PA0) и светодиоды на плате (PD12 - PD15)

CMSIS - последняя документация PlatformIO

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.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *