Все картинки в этой статье кликабельны.

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Int main() { return 0; }

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

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

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

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

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

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

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

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

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

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

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

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

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

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

#include "stm32f4xx_hal.h"

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

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

#include "stm32f4xx_hal.h" int main() { HAL_Init(); return 0; }

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

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

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

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

Ссылки

  1. Скринкаст «Eclipse и GNU Tools для разработки под ARM-микроконтроллеры «.
  2. Микроконтроллер STM32F407VG .
  3. Отладочная плата STM32F4-Discovery .
  4. Библиотека STM32CubeF4 .

В последние годы 32 разрядные микроконтроллеры (МК) на основе процессоров ARM стремительно завоёвывают мир электроники. Этот прорыв обусловлен их высокой производи тельностью, совершенной архитектурой, малым потреблением энергии, низкой стоимостью и развитыми средствами программирования.

КРАТКАЯ ИСТОРИЯ
Название ARM является аббревиатурой Advanced RISC Machines, где RISC (Reduced Instruction Set Computer) обозначает архитектуру процессоров с сокращённым набором команд. Подавляющее число популярных МК, а пример семейства PIC и AVR, также имеют архитектуру RISC, которая позволила увеличить быстродействие за счёт упрощения декодирования инструкций и ускорения их выполнения. Появление совершенных и производительных 32 разрядных ARMмикроконтроллеров позволяет перейти к решению более сложных задач, с которыми уже не справляются 8 и 16 разрядные МК. Микропроцессорная архитектура ARM с 32 разрядным ядром и набором команд RISC была разработана британской компанией ARM Ltd, которая занимается исключительно разработкой ядер, компиляторов и средств отладки. Компания не производит МК, а продаёт лицензии на их производство. МК ARM – один из быстро развивающихся сегментов рынка МК. Эти приборы используют технологии энергосбережения, поэтому находят широкое применение во встраиваемых системах и доминируют на рынке мобильных устройств, для которых важно низкое энергопотребление. Кроме того, ARM микроконтроллеры активно применяются в средствах связи, портативных и встраиваемых устройствах, где требуется высокая производительность. Особенностью архитектуры ARM является вычислительное ядро процессора, не оснащённое какими либо дополнительными элементами. Каждый разработчик процессоров должен самостоятельно до оснастить это ядро необходимыми блоками под свои конкретные задачи. Такой подход хорошо себя зарекомендовал для крупных производителей микросхем, хотя изначально был ориентирован на классические процессорные решения. Процессоры ARM уже прошли несколько этапов развития и хорошо известны семействами ARM7, ARM9, ARM11 и Cortex. Последнее делится на подсемейства классических процессоров CortexA, процессоров для систем реального времени CortexR и микропроцессорные ядра CortexM. Именно ядра CortexM стали основой для разработки большого класса 32 разрядных МК. От других вариантов архитектуры Cortex они отличаются, прежде всего, использованием 16разрядного набора инструкций Thumb2. Этот набор совмещал в себе производительность и компактность «классических» инструкций ARM и Thumb и разрабатывался специально для работы с языками С и С++, что существенно повышает качество кода. Большим достоинством МК, построенных на ядре CortexM, является их программная совместимость, что теоретически позволяет использовать программный код на языке высокого уровня в моделях разных производителей. Кроме обозначения области применения ядра, разработчики МК указывают производительность ядра CortexM по десятибалльной шкале. На сегодняшний день самыми популярными вариантами являются CortexM3 и CortexM4. МК с архитектурой ARM производят такие компании, как Analog Devices, Atmel, Xilinx, Altera, Cirrus Logic, Intel, Marvell, NXP, STMicroelectronics, Samsung, LG, MediaTek, MStar, Qualcomm, SonyEricsson, Texas Instruments, nVidia, Freescale, Миландр, HiSilicon и другие.
Благодаря оптимизированной архитектуре стоимость МК на основе ядра CortexM в некоторых случаях даже ни же, чем у многих 8разрядных приборов. «Младшие» модели в настоящее время можно приобрести по 30 руб. за корпус, что создаёт конкуренцию предыдущим поколениям МК. МИКРОКОНТРОЛЛЕРЫ STM32 Рассмотрим наиболее доступный и широко распространённый МК семейства STM32F100 от компании STMicroelectronics , которая является одним из ведущих мировых производителей МК. Недавно компания объявила о начале производства 32битного МК, использующего преимущества индустриального
ядра STM32 в недорогих приложениях. МК семейства STM32F100 Value line предназначены для устройств, где не хватает производительности 16разрядных МК, а богатый функционал «обычных» 32разрядных приборов является избыточным. Линейка МК STM32F100 базируется на современном ядре ARM CortexM3 с периферией, оптимизированной для применения в типичных приложениях, где использовались 16разрядные МК. Производительность МК STM32F100 на тактовой частоте 24 МГц превосходит большинство 16разрядных МК. Данная линейка включает приборы с различными параметрами:
● от 16 до 128 кбайт флэшпамяти программ;
● от 4 до 8 кбайт оперативной памяти;
● до 80 портов ввода вывода GPIO;
● до девяти 16разрядных таймеров с расширенными функциями;
● два сторожевых таймера;
● 16канальный высокоскоростной 12разрядный АЦП;
● два 12разрядных ЦАП со встроенными генераторами сигналов;
● до трёх интерфейсов UART с поддержкой режимов IrDA, LIN и ISO7816;
● до двух интерфейсов SPI;
● до двух интерфейсов I2С с поддержкой режимов SMBus и PMBus;
● 7канальный блок прямого доступа к памяти (DMA);
● интерфейс CEC (Consumer Electronics Control), включённый в стандарт HDMI;
● часы реального времени (RTC);
● контроллер вложенных прерываний NVIC.

Функциональная схема STM32F100 представлена на рисунке 1.

Рис. 1. Архитектура МК линейки STM32F100

Дополнительным удобством является совместимость приборов по выводам, что позволяет, при необходимости, использовать любой МК семейства с большей функциональностью и памятью без переработки печатной платы. Линейка контроллеров STM32F100 производится в трёх типах корпусов LQFP48, LQFP64 и LQFP100, имеющих, соответственно, 48, 64 и 100 выводов. Назначение выводов представлено на рисунках 2, 3 и 4. Такие корпуса можно устанавливать на печатные платы без применения специального оборудования, что является весомым фактором при мелкосерийном производстве.


Рис. 2. МК STM32 в корпусе LQFP48 Рис. 3. МК STM32 в корпусе LQFP64


Рис. 4. МК STM32 в корпусе LQFP100

STM32F100 – доступный и оптимизированный прибор, базирующийся на ядре CortexM3, поддерживается развитой средой разработки МК семейства STM32, которая содержит
бесплатные библиотеки для всей пе риферии, включая управление двига телями и сенсорными клавиатурами.

СХЕМА ВКЛЮЧЕНИЯ STM32F100C4
Рассмотрим практическое использование МК на примере самого простого прибора STM32F100C4, который, тем не менее, содержит все основные блоки линейки STM32F100. Принципиальная электрическая схема включения STM32F100C4 представлена на рисунке 5.


Рис. 5. Схема включения МК STM32F100C4

Конденсатор С1 обеспечивает сброс МК при включении питания, а конденсаторы С2-С6 фильтруют напряжение питания. Резисторы R1 и R2 ограничивают сигнальный ток выводов МК. В качестве источника тактовой частоты используется внутренний генератор, поэтому нет необходимости применять внешний кварцевый резонатор.


Входы BOOT0 и BOOT1 позволяют выбрать способ загрузки МК при включении питания в соответствии с таб лицей. Вход BOOT0 подключён к шине нулевого потенциала через резистор R2, который предохраняет вывод BOOT0 от короткого замыкания при его использовании в качестве выход ного порта PB2. С помощью соединителя J1 и одной перемычки можно из менять потенциал на входе BOOT0, определяя тем самым способ загрузки МК – из флэшпамяти или от встроенного загрузчика. При необходимости загрузки МК из оперативной памяти аналогичный соединитель с перемычкой можно подключить и к входу BOOT1.
Программирование МК осуществляется через последовательный порт UART1 или через специальные программаторы – отладчики JTAG или STLink. Последний входит в состав популярного отладочного устройства STM32VLDISCOVERY , изображённого на рисунке 6. На плате STM32VLDIS COVERY 4контактный разъём программатора – отладчика STLink – имеет обозначение SWD. Автор статьи предлагает программировать МК через последовательный порт UART1, поскольку это значительно проще, не требует специального оборудования и не уступает в скорости JTAG или ST Link. В качестве управляющего устройства, способного формировать команды и отображать результаты работы про граммы МК, а также в качестве программатора можно использовать любой персональный компьютер (ПК), имеющий последовательный COM порт или порт USB с преобразователем USBRS232.

Для сопряжения COMпорта ПК с МК подойдет любой преобразователь сиг налов RS232 в уровни логических сигналов от 0 до 3,3 В, например, микросхема ADM3232. Линия передачи TXD последовательного порта компьютера, после преобразователя уровней, должна подключаться к входу PA10 микроконтроллера, а линия приёмника RXD, через аналогичный преобразователь, – к выходу PA9.

При необходимости использования энергонезависимых часов МК, к нему следует подключить элемент питания типа CR2032 с напряжением 3 В и кварцевый резонатор на частоту 32768 Гц. Для этого МК оснащён выводами Vbat/GND и OSC32_IN/OSC32_OUT. Предварительно вывод Vbat необходимо отключить от шины питания 3,3 В.

Оставшиеся свободными выводы МК можно использовать по необходимости. Для этого их следует подключить к разъёмам, которые расположены по периметру печатной платы для МК, по аналогии с популярными устройствами Arduino и отладочной платой STM32VLDISCOVERY .


Рис. 6. Отладочное устройство STM32VLDISCOVERY


Схема электрическая принципиальная STM32VLDISCOVERY.

Таким образом, в зависимости от назначения и способа применения МК, к нему можно подключать необходимые элементы, чтобы задействовать другие функциональные блоки и пор ты, например, ADC, DAC, SPI, I2C и т.п. В дальнейшем эти устройства будут рас смотрены подробнее.

ПРОГРАММИРОВАНИЕ
Сегодня многие компании предлагают средства для создания и отладки программ микроконтроллеров STM32. К их числу относятся Keil от ARM Ltd, IAR Embedded Workbench for ARM, Atol lic TrueStudio, CooCox IDE, GCC и Eclipse IDE. Разработчик может выбрать про граммные средства по своему пред почтению. Ниже будет описан инструментарий Keil uVision 4 от компании Keil , который поддерживает огромное число типов МК, имеет развитую систему отладочных средств и может быть использован бесплатно с ограничениями размера генерируемого кода 32 кбайт (что, фактически, максимально для рассматриваемых МК).

Простой и быстрый старт с CooCox CoIDE.

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

CooCox CoIDE — среда разработки, на базе Eclipse, которая помимо STM32 поддерживает кучу других семейств микроконтроллеров: Freescale, Holtek, NXP, Nuvoton, TI, Atmel SAM, Energy Micro и др. С каждой новой версией CoIDE список МК постоянно пополняется. После успешной установки CoIDE запускаем:

Появится стартовое окно Step 1, в котором необходимо выбрать производителя нашего микроконтроллера. Нажимаем ST и переходим к Step 2 (выбор микроконтроллера), в котором необходимо выбрать конкретную модель. У нас STM32F100RBT6B, поэтому нажимаем на соответствующую модель:

Справа, в окне Help отображаются краткие характеристики каждого чипа. После выбора нужного нам микроконтроллера переходим к третьему шагу Step 3 — к выбору необходимых библиотек для работы:

Давайте создадим простейший проект для мигания светодиодом, как это принято для изучения микроконтроллеров.

Для этого нам понадобится библиотека GPIO, при включении которой, CoIDE попросит создать новый проект. На это предложение нажимаем Yes, указываем папку где будет храниться наш проект и его название. При этом, CoIDE подключит к проекту 3 другие, необходимые для работы библиотеки, а также создаст всю необходимую структуру проекта:

Чем еще хорош CoIDE, это тем, что в нем есть возможность загружать примеры прямо в среду разработки. В вкладке Components вы можете видеть, что почти к каждой библиотеке есть примеры, нажимаем на GPIO (with 4 examples) и видим их:

Туда можно добавлять и свои примеры. Как видно на скриншоте выше, в примерах уже присутствует код для мигания светодиодом GPIO_Blink. Можно нажать кнопку add и он добавиться в проект, но как подключаемый файл, поэтому мы сделаем по другому просто скопируем весь код примера в файл main.c. Единственное, строку void GPIO_Blink(void) замените на int main(void). Итак, нажимаем F7 (или в меню выбираем Project->Build), чтобы скомпилировать проект и… не тут то было!

Среде нужен компилятор GCC, а у нас его нет. Поэтому идем на страничку GNU Tools for ARM Embedded Processors , справа выбираем тип вашей ОС и качаем последнюю версию тулчайна. Затем запускаем файл и инсталируем gcc toolchain. Далее, в настройках CoIDE укажем правильный путь к тулчайну:

Опять нажимаем F7 (Project->Build) и видим, что компиляция прошла успешно:

Осталось прошить микроконтроллер. Для этого при помощи USB подключаем нашу плату к компьютеру. Затем, в настройках дебаггера необходимо поставить ST-Link, для этого в меню выбираем Project->Configuration и открываем вкладку Debugger. В выпадающем списке выбираем ST-Link и закрываем окно:

Попробуем прошить МК. В меню выбираем Flash->Program Download (или на панели инструментов щелкаем по соответствующей иконке) и видим, что МК успешно прошит:

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

Также, в CoIDE работают различные режимы отладки, для этого нажимаем CTRL+F5 (или в меню Debug->Debug):

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

Одна из причин популярности микроконтроллеров STM32 производства STMicroelectronics – разнообразие инструментов разработки и отладки. Это касается как аппаратных, так и программных средств. Существует возможность создания и отладки резидентного ПО для STM32 без материальных затрат с помощью набора бесплатных программ . В статье дан обзор наиболее значимых бесплатных программных инструментов разработки: ST MCU Finder, STM32CubeMX, SW4STM32, STM32 Studio .

Компания STMicroelectronics (ST) является крупнейшим производителем микроконтроллеров в мире, при этом большая часть приходится на семейства STM32. При разработке новых линеек контроллеров STMicroelectronics преследует несколько стратегических целей:

  • повышение производительности;
  • повышение уровня интеграции: рост объема памяти, расширение перечня периферии;
  • снижение потребления;
  • снижение стоимости.

Для любого инженера очевидно, что эти цели очень часто оказываются взаимоисключающими. По этой причине STMicroelectronics выпускает семейства и линейки микроконтроллеров с акцентом на то или иное из приведенных выше свойств. В настоящее время номенклатура STM32 включает десять семейств, каждое из которых имеет свои достоинства и занимает определенную нишу на рынке (рисунок 1).

Дадим краткую характеристику семействам микроконтроллеров STM32 от ST.

Малопотребляющие микроконтроллеры семейств STM32L. Данная группа объединяет семейства, ориентированные, в первую очередь, на достижение минимального уровня потребления. Для этого используются различные методы: динамическое управление напряжением питания, гибкая система тактирования, специализированная периферия (LP-Timer, LP-UART), развитая система режимов пониженного потребления и так далее.

Базовые семейства STM32F0, STM32F1, STM32F3. Данная группа включает семейства со сбалансированными характеристиками и компромиссным значением производительности/потребления/цены.

В свою очередь отдельные пакеты STMCube включают:

  • аппаратно независимые библиотеки HAL для работы с аппаратными средствами микроконтроллеров;
  • библиотеки промежуточного уровня. Например, в состав самого развитого пакета ПО STM32CubeF7 входят следующие библиотеки и стеки: CMSIS-RTOS на базе FreeRTOS, стек TCP/IP на базе LwIP, файловая система FAT на базе FatFs с поддержкой NAND Flash, StemWin – графический стек на базе SEGGER emWin, полный стек USB (Host и Device). Для ряда семейств доступна библиотека Touch Library для сенсорных приложений;
  • примеры и шаблоны проектов для различных сред и отладочных наборов (Discovery, Nucleo, Evaluation Boards).

Чтобы понять, как происходит взаимодействие между составляющими программной платформы STM32Cube, следует обратиться к примеру, представленному на рисунке 9. В этом примере пользователь конфигурирует микроконтроллер STM32F429ZIT с помощью STM32CubeMX. После окончания визуальной настройки (выводов, тактирования и прочего) STM32CubeMX генерирует С-код, для этого используются библиотеки из программного пакета STM32CubeF4. В результате пользователь получает завершенный С-проект, сформированный для конкретной интегрированной среды разработки: IAR™ EWARM, Keil™MDK-ARM, Atollic® TrueSTUDIO и AC6 System Workbench (SW4STM32). В этот проект уже включены все необходимые библиотеки и файлы.

Программа STM32CubeMX значительно упрощает работу программистов, однако ее возможности не безграничны. Прежде чем двигаться дальше, стоит отметить существующие ограничения :

  • генерируемый С-код охватывает только настройку блоков и периферии микроконтроллера. Это значит, что алгоритмическую часть программы автоматически сгенерировать нельзя, ее нужно будет дописать вручную;
  • STM32CubeMX поможет создать только стартовую конфигурацию. Иногда в процессе работы пользователю требуется изменить частоту работы периферийного блока или изменить конфигурацию вывода. Все это придется прописывать самостоятельно;
  • для генерации кода используются стандартные, разработанные ST, библиотеки нижнего уровня (HAL и LL) и промежуточного уровня, например, StemWin или STM32_USB_Device_Library;
  • в процессе генерации С-файл выстраивается таким образом, что для пользователя выделяются специальные секции, в которые он может помещать свой код. Если пользовательский код окажется вне этих рамок – он будет затерт при следующих генерациях;
  • существуют и другие ограничения для отдельных блоков, для более подробного ознакомления с которыми следует обратиться к руководству по STM32CubeMX.

Теперь, когда состав, принцип действия и ограничения STM32CubeMX описаны, можно привести пример работы с данной программой, создать «скелет» простейшего проекта и продемонстрировать работу отдельных утилит.

Создание простейшей программы с помощью STM32CubeMX

Рассмотрим подробнее создание скелета проекта в среде STM32CubeMX . Для начала требуется скачать саму среду STM32CubeMX. Это можно сделать абсолютно бесплатно с сайта ST. После установки на диске пользователя будут размещены как сам STM32CubeMX, так и папки с библиотеками STM32Cube.

Процесс создания скелета проекта выполняется по шагам.

Шаг первый. Скачивание актуальных версий библиотек с помощью специальной утилиты. Для этого вначале нужно настроить параметры сети (Help → Updater Settings) и далее запустить автоматическое обновление (Help → Check for Updates). Если ПК не подключен к сети – обновлять библиотеки придется вручную.

Шаг второй. После запуска STM32CubeMX на стартовом экране или в меню “File” необходимо создать новый проект, нажав “New Project”. Далее STM32CubeMX предложит выбрать целевую платформу: контроллер с заданными параметрами или отладочную плату. На рисунке 10 в качестве примера демонстрируется, как встроенный поиск подобрал список контроллеров по параметрам: семейство STM32F4, корпус TQFP100, объем Flash не менее 592 кбайт, ОЗУ более 214 кбайт.

Шаг третий. На третьем этапе разработчику предстоит определить назначение выводов с помощью Pin Wizard (рисунок 11). Данная утилита помогает создавать требуемую конфигурацию и проверять ее на ошибки. Стоит отметить и удобную систему подсветки, например, системные выводы закрашиваются бледно-желтым цветом.

Шаг четвертый. Настройка системы тактирования производится с помощью вкладки Clock Configuration (утилита Clock Wizard). При этом пользователь работает с визуализированным деревом тактирования (рисунок 12). С помощью Clock Wizard удается за нескольких щелчков мыши выбрать источник системного тактового сигнала, значения определителей и умножителей, а также источники тактирования периферийных блоков. При написании кода вручную для этого потребовалось бы приложить много усилий.

Шаг пятый. Создание С-кода начинается с выбора целевой интегрированной среды в настройках проекта (Project → Settings). В настоящий момент к услугам пользователя предлагаются: IAR™ EWARM, Keil™MDK-ARM, Atollic® TrueSTUDIO и AC6 System Workbench (SW4STM32) (рисунок 13). Далее на вкладке Code Generator следует определиться с составом копируемых в директорию проекта библиотек, настройками обработки пользовательского кода при регенерации (например, сохранять или удалять), настройками использования HAL (рисунок 13).

Для более детальной настройки генератора следует перейти на вкладку Advanced Settings (рисунок 14). Главной особенностью С-генератора в STM32CubeMX является возможность использования как HAL-, так и LL-драйверов. На этом моменте следует остановиться подробнее.

HAL – набор абстрактных драйверов, обеспечивающих максимальную кроссплатформенность среди контроллеров STM32. При этом некоторые драйверы являются абсолютно универсальными (подходят ко всем контроллерам STM32), а часть применима только к отдельным линейкам с соответствующими периферийными блоками (например, блоками шифрования). Главными достоинствами HAL являются :

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

Вместе с тем, у HAL есть и недостатки: значительный объем кода, недостаточная оптимизация выполнения задач, сравнительно малое быстродействие. Если эти недостатки являются критичными, то следует использовать LL-драйверы.

Low Layer APIs (LL) – аппаратно зависимые драйверы, позволяющие напрямую работать с периферией контроллера, в том числе – использовать inline-функции и выполнять атомарный доступ к регистрам . Такой подход не требует значительных затрат памяти, функции получаются максимально короткими и эффективными по скорости. Очевидными недостатками LL-драйверов являются снижение совместимости кода при переходе от одного контроллера к другому и необходимость глубокого знания особенностей архитектуры контроллера.

В рамках одно и того же проекта на STM32CubeMX можно одновременно использовать как HAL так и LL, но для разных периферийных блоков. Например, на рисунке 15 показаны настройки С-генератора, при которых для UART/TIM/RTC используются LL-драйверы, а для остальных блоков – HAL.

Шаг шестой. После настройки проекта следует выполнить генерацию кода, зайдя в меню Project → Generate Code. В результате этого в указанной директории проекта будет сгенерирован скелет проекта для заданной среды разработки.

Иногда возникает необходимость миграции проекта с одной платформы на другую. С помощью STM32CubeMX это можно сделать с минимальными затратами времени.

Миграция проектов с помощью STM32CubeMX

Для миграции проекта с одной платформы на другую используется дополнительная утилита File → Import Project (рисунок 15). В ней требуется указать тип нового микроконтроллера и режим миграции. После этого программа автоматически генерирует новый код либо, при наличии неполной совместимости ядер, указывает на возникшие сложности, предлагая пользователю их устранить.

Несовместимость, обнаруживаемая при миграции, может быть устранимой и неустранимой. Неустранимый случай возникает, когда состав периферии контроллеров значительно отличается. Например, ранее использовался модуль Ethernet, который отсутствует на новом МК (рисунок 15). Очевидно, что в таком случае миграция невозможна.

Но зачастую несовместимость имеет локальный характер, когда, например, необходимо всего лишь перенастроить параметры дерева тактирования, чтобы согласовать рабочие частоты, либо изменить номер канала АЦП или DMA и так далее (рисунок 16). В таких случаях STM32CubeMX предложит выполнить миграцию в ручном режиме с устранением появившихся сложностей с помощью редактирования проекта в рассмотренных выше утилитах. При этом STM32CubeMX будет сигнализировать пользователю о наличии проблем до их устранения.

После получения итогового скелета проекта останется добавить пользовательскую алгоритмическую часть кода, провести компиляцию и выполнить отладку. Для этого используются специализированные среды. Среда SW4STM32 для STM32 производства компании AC6 позволяет делать это абсолютно бесплатно.

AC6 System Workbench – бесплатная IDE для STM32

Для редактирования, компиляции и отладки программ предназначены специальные интегрированные среды IDE. Большая часть из них является коммерческими продуктами (IAR™ EWARM, Keil™MDK-ARM, Atollic® TrueSTUDIO и другие), но есть и бесплатные инструменты, например, System Workbench производства компании AC6. В рамках системы названий STMicroelectronics данная IDE носит название SW4STM32 .

Интегрированная среда SW4STM32 предназначена для работы с микроконтроллерами STM32. Она основана на базе платформы Eclipse и является бесплатной и кроссплатформенной. Основными ее достоинствами являются :

  • поддержка работы с микроконтроллерами STM32, аппаратными отладочными наборами (STM32 Nucleo, Discovery и Evaluation boards), с программными библиотеками (Standard Peripheral library и STM32Cube HAL);
  • отсутствие ограничений на объем программного кода;
  • бесплатный компилятор GCC C/C++;
  • свободный отладчик GDB (проект GNU);
  • открытая платформа Eclipse IDE с поддержкой групповой разработки встраиваемого ПО с системой контроля версий SVN/GIT;
  • совместимость с плагинами Eclipse;
  • поддержка ST-LINK;
  • мультиплатформенность и совместимость с Windows®, Linux и OS X®.

С помощью SW4STM32 можно редактировать, компилировать и отлаживать программы для STM32. Для этого удобно использовать скелеты программ, создаваемые в STM32CubeMX. Для их импорта следует выполнить простейшие операции: выбрать меню File -> Import, назначить тип импорта «Existing Projects into Workspace», указать директорию проекта, выбрать сам проект и нажать Finish.

При работе с проектами, созданными в STM32CubeMX, следует размещать пользовательский код в специальных секциях:

/*USER CODE BEGIN…*/

/*USER CODE END…*/

Это необходимо делать, чтобы при повторной генерации кода в STM32CubeMX не произошло затирание рукописной части программы. Повторная генерация необходима в двух случаях:

  • при перенастройке используемого МК;
  • при миграции с одного МК на другой.

Таким образом, при работе в связке STM32CubeMX + SW4STM32 пользователь может в любой момент перенастроить контроллер и произвести миграцию с сохранением пользовательского кода при минимальных затратах времени.

При отладке программ в SW4STM32 доступна возможность широкого мониторинга состояния памяти, регистров, переменных. Также среда имеет поддержку точек останова (рисунок 17). Для запуска процесса отладки требуется нажать значок “Debug” (в виде жука), выбрать тип проекта “Ac6 STM32 C/C++ Application”, определить тип отладчика и интерфейс, нажать кнопку “OK”.

SW4STM32 имеет поддержку систем контроля версий SVN/GIT. Это важно для больших проектов, над которыми работает несколько разработчиков. Система контроля версий позволяет: регистрировать все изменения, производимые в проекте; сравнивать версии проектов; восстанавливать предыдущие версии; разрешать конфликты при работе нескольких программистов над одним файлом; вести параллельно несколько версий и так далее.

В рамках данной статьи не имеет смысла углубляться в разбор тонкостей и различий между SVN и GIT. Скажем лишь, что GIT, являясь распределенной системой, позволяет программистам работать локально, имея на рабочей машине полный репозиторий проекта. При этом GIT сохраняет метаданные изменений, что упрощает слияние версий и переключение между версиями. SVN требует наличия сетевого соединения между разработчиками и сохраняет файлы целиком. SW4STM32 обеспечивает поддержку как SVN, так и GIT.

Рассмотрим последовательность действий при подключении проекта к SVN (рисунок 18).

  • в открытом проекте щелкнуть по его названию на панели директорий правой кнопкой мыши и пройти Team → Share Project(s) (рисунок 18а);
  • выбрать тип системы SVN/GIT и нажать “Next” (рисунок 18б);
  • выбрать директорию для SVN и нажать “Next” (рисунок 18в);
  • выбрать директорию хранения проекта в SVN нажать “Finish” (рисунок 18г);
  • на вкладке “General” (рисунок 18д) выбрать URL-адрес SVN, метку для репозитория, имя пользователя, пароль, нажать “Next”;
  • ввести комментарий для проекта, выбрать файл, помещаемый под контроль SVN, нажать “OK” (рисунок 18е).

В дальнейшем для синхронизации файла или всего проекта необходимо щелкнуть по его названию на панели директорий правой кнопкой мыши и выбрать Team → Commit. В открывшемся окне следует написать пояснение к изменениям и нажать “OK”.

Для отключения SVN следует использовать команду Team → Disconnect.

Для импорта проекта из SVN применяется команда меню Import → SVN → Project from SVN. Далее требуется выполнить ряд настроек по импорту во всплывающих диалоговых окнах.

SW4STM32 имеет очень широкие возможности, но у среды есть и недостатки, достаточно характерные для бесплатных сред:

  • отсутствие встроенного симулятора;
  • компилятор GCC проигрывает своим коммерческим собратьям по объему кода и быстродействию;
  • поддержка SW4STM32 со стороны разработчиков не будет столь оперативной, как в случае с платными средами.

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

Отладка кода может производиться не только в SW4STM32, но с помощью дополнительных средств. Рассмотрим некоторые из них.

STMStudio – простой способ отладки приложений на STM32

STM Studio – фирменная утилита производства компании STMicroelectronics, которая помогает проводить отладку программы и позволяет отслеживать значения пользовательских переменных при выполнении кода в реальном времени. Данная программа запускается под ОС Windows и использует отладчик ST-LINK для связи с микроконтроллером.

STM Studio имеет следующие возможности :

  • чтение переменных из ОЗУ «на лету», без влияния на работу пользовательской программы;
  • использование исполнительных файлов.elf, .out, .axf для импорта переменных;
  • вывод значений переменных в табличной и графической форме;
  • графический вывод в виде графиков или диаграмм;
  • возможность вывода зависимостей переменных, когда одна из переменных откладывается по оси Х, а вторая – по оси Y;
  • логирование данных в файл для последующего просмотра.

Окно STM Studio состоит из нескольких панелей (рисунок 19).

Работа с STM Studio начинается с импорта переменных. Для этого в программу необходимо загрузить тот же исполнительный файл, что находится в самом микроконтроллере. Для этого подойдут следующие форматы, которые генерируются при компиляции: .elf, .out, .axf. Далее необходимо выполнить команду File → Import variables. В диалоговом окне при выборе пункта “Expand table elements” пользователь сможет вручную выбрать из предлагаемой таблицы любые глобальные переменные. Для запуска отладки необходимо выполнить команду “Run”.

Как говорилось выше, STM Studio позволяет отображать переменные в трех формах: в виде текста, диаграммы и графика (рисунок 20). Настройка типа отображения может быть изменена в любое время. Кроме того, все данные дополнительно записываются в лог-файл для дальнейшего анализа. Интересной особенностью STM Studio является возможность отображения зависимостей одних переменных от других, а также построения выражений из переменных.

Популярным средством передачи отладочной информации является использование консоли и функции вывода printf().

Реализация терминального вывода printf() через USART

Использование стандартной функции printf() – один из наиболее популярных методов вывода отладочной информации. С помощью данной функции вывода пользователь может передавать любые данные на консоль среды разработки или терминал. Большинство интегрированных сред поддерживает эту возможность. При использовании STM32 есть два способа реализации этого метода: традиционный, с помощью UART, и дополнительный, через SWO-интерфейс с помощью отладчика ST-LINK. Реализация каждого из них максимально упрощается при использовании STM32CubeMX и SW4STM32.

Рассмотрим вначале первый вариант реализации – через UART. Для этого придется выполнить следующую последовательность действий:

  • обеспечить аппаратное подключение к ПК;
  • выполнить настройку UART в среде STM32CubeMX;
  • реализовать саму функцию printf() в среде SW4STM32.

Подключение к ПК можно выполнить тремя путями: через COM-порт и микросхему приемопередатчика RS-232; через USB-порт и микросхему конвертера UART-USB (например, FT232); с помощью USB-интерфейса отладчика ST-LINK. Вне зависимости от того, какой способ выбран, далее необходимо сконфигурировать аппаратный UART.

C помощью STM32CubeMX настройка UART выполняется в несколько кликов (рисунок 21). Сначала на вкладке Pin Wizard соответствующие выводы контроллера переводятся в режим работы UART. Далее во вкладке “Configuration” настраиваются параметры UART: тип обмена, скорость, наличие стоп-битов и так далее. После этого генерируется С-код.

В среде SW4STM32 необходимо подключить стандартную библиотеку и определить функции _io_putchar() и _write(), например, так:

/*USER CODE BEGIN Includes*/

#include

/*USER CODE END Includes*/

/*USER CODE BEGIN 1*/

int __io_putchar(int ch)

c = ch & 0x00FF;

HAL_UART_Transmit(&huart2,&*c,1,10);

int _write(int file, char *ptr, int len)

for (DataIdx = 0; DataIdx < len; DataIdx++)

Достоинствами такого подхода к передаче отладочной информации можно считать:

  • использование интерфейса UART, который присутствует во всех микроконтроллерах STM32 без исключения;
  • простоту настройки и привычность для программистов. Можно использовать старые наработки из проектов с другими контроллерами;
  • отсутствие сложного аппаратного обеспечения (за исключением моста UART-USB или приемопередатчика RS-232);
  • отсутствие сложного ПО. Работа производится со всеми IDE или терминальными программами.

Однако есть у этого метода и недостатки. Во-первых, придется пожертвовать каналом UART для отладки. А во-вторых, такая реализация влияет на работу контроллера, так как занимает ядро для обработки кода функции printf(). В случае с STM32 есть более специализированный, а главное – простой способ, который не занимает ресурсы микроконтроллера – использование связки SWO и ST-LINK.

Реализация терминального вывода printf() через SWO

При использовании связки SWO и ST-LINK создание терминального ввода/вывода оказывается еще проще, чем в рассмотренном выше методе с аппаратным UART. В этом случае связь с ПК осуществляется через интерфейс SWO и USB-интерфейс, используемый в ST-LINK. Последовательность действий остается примерно той же, что и в предыдущем случае.

Сначала с помощью STM32CubeMX происходит настройка выводов SWO-интерфейса во вкладках “Pin Wizard” и “Configuration” (рисунок 22). После этого происходит перегенерация кода для среды разработки.

Следующий шаг заключается в написании кода обработчика __io_putchar(int ch), например, так:

/*USER CODE BEGIN 1*/

int __io_putchar(int ch)

ITM_SendChar(ch);

/*USER CODE END 1*/

Для отладки удобно использовать утилиту STLink Utility (рисунок 23).

Достоинства метода:

  • не требует дополнительных ресурсов и не занимает коммуникационные интерфейсы;
  • работает параллельно с основной программой и не влияет на скорость ее выполнения, так как не использует ядро для вычислений;
  • идеальный выбор для отладочных наборов с ST-LINK на борту, так как представляет готовое решение.

Из недостатков этого метода реализации можно отметить аппаратную зависимость, так как требуется наличие ST-LINK.

Заключение

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

Важным преимуществом STM32 является наличие развитой системы средств отладки. К услугам разработчиков предлагается более ста отладочных плат (Nucleo, Discovery, Evaluation Boards). Еще большим подспорьем для программистов станет наличие полного набора бесплатного прикладного ПО для создания, компиляции и отладки программного кода:

ST MCU Finder – приложение для смартфонов, помогающее выбрать наиболее оптимальный МК для конкретного приложения;

STM32CubeMX – кроссплатформенный графический редактор для конфигурирования микроконтроллеров STM32 и автоматической генерации кода. STM32CubeMX также способен оказать помощь при выборе оптимального микроконтроллера, оценить потребляемую мощность и упростить миграцию проекта между различными МК.

SW4STM32 – кросплатформенная интегрированная среда разработки встраиваемого ПО для микроконтроллеров STM32.

STM32 Studio – утилита для отслеживания и графической визуализации значений переменных при выполнении кода в реальном времени.

ST-LINK Utility позволяет совместно с программатором ST-Link выполнять ввод и вывод отладочной информации через SWO-интерфейс.

Данный набор ПО позволяет выполнить полный цикл разработки резидентного ПО, не потратив ни единого рубля.

Литература

  1. Data brief. NUCLEO-XXXXKX. STM32 Nucleo-32 board. Rev 3. ST Microelectronics, 2016.
  2. Data brief. NUCLEO-XXXXRX. STM32 Nucleo-64 board. Rev 8. ST Microelectronics, 2016.
  3. Data brief. NUCLEO-XXXXZX. STM32 Nucleo-144 board. Rev 5. ST Microelectronics, 2017.
  4. UM1718. User manual. STM32CubeMX for STM32 configuration and initialization C code generation. Rev 18. ST Microelectronics, 2017.
  5. Виктор Чистяков. CUBEMX И WORKBENCH: СОЗДАНИЕ ПРОЕКТА НА БАЗЕ STM32 С ПОМОЩЬЮ БЕСПЛАТНОГО ПО. Новости Электроники №2/2016.
  6. UM1884. User manual. Description of STM32L4 HAL and Low-layer drivers. Rev 5. ST Microelectronics, 2016.
  7. UM1025. User manual. Getting started with STM-STUDIO. Rev6. ST Microelectronics, 2013.
  8. UM0892.User manual STM32 ST-LINK utility software description. Rev 22. ST Microelectronics, 2016.

О компании ST Microelectronics

Для мучений и изучений данного девайса. Сказано, сделано. Была собрана платка и пошло поехало. Ах да! Тема нашего разговора зашла о сравнении двух МК. Один выше сказанный против ATmega328. Почему именно они. Оба МК в корпусе TQFP-32. (Правда ATmega328 бывает и в DIP корпусе)
Теперь давайте рассмотрим по ближе их внутренности. Для большего понимания я собрал все необходимые данные в одну табличку.

Параметры ATmega328 STM32F030K6T6
Разрядность 8 бит 32 бита
FLASH 32кб 32кб
SRAM 1кб 4кб
EEPROM 512б -
Таймер 8 бит 2 шт -
Таймер 16 бит 1 шт 16 шт
ШИМ 3 канала 6 каналов
USART 1 шт 1 шт
SPI 1 шт 1 шт
I2C 1 шт (TWI) 1 шт
АЦП 8 каналов 10 бит 16 каналов 12 бит
Питание 2,7 - 5,5 2,4 - 3,6
Скорость 0 - 16МГц 48МГц при внешних 4 - 32МГц
Стоимость 160 - 170 руб. 80 - 140 руб.
Как видно из таблицы, STM32 довольно интереснее и богаче чем AVR. Есть правда одна мелочь. У STM32 нет EEPROM, но зато есть DMA которое просто убивает AVR напрочь. Правда AVR может похвастаться Ардуиной и простатой программирования. Да не спорю, но у STM32 есть STM32Cube, который генерит код для IAR и берет на себя всю рутину настройки периферии. И последний гвоздь в "гроб" AVR это RTOS. Да, на AVR тоже можно установить, но с ней надо разбираться, а в STM32 ставим галочку "FREERTOS" и все. Система сама сделает все что нужно, а нам останется только создавать потоки и писать код в них. Ну это так для затравки. На самом деле там все немного сложнее. Короче STM32 мне нравится и для того чтобы окончательно склонить вас на эту платформу, бросив в ящик стола Ардуину, я создам от начала до конца плату и покажу как с ней работать. О, забыл. У всех STM32 есть отладчик SWD. Это три провода SWDIO, SWCLK, GND и можно скакать по строкам кода прямо в железе, а не как у ATmega328 виртуально в Протеусе. Для этого нужен всего лишь универсальный программатор ST-LINK. Его можно использовать если приобрести плату Discovery или отдельно программатор . А теперь от слов к делу.
Схема. Покрупнее
Данную плату я делал как модуль для своей отладочной платы под AVR. Но ее можно повторить разведя плату по своему усмотрению (Проект под DipTrace я выложу в конце статьи). Что на схеме. А на схеме простая обвязка как и для AVR. Кварц на 8МГц с двумя конденсаторами по 20p. Так же как и в AVR собрана схема питания для опорки АЦП. Цепь сброса как у AVR. Единственное отличие это цепь BOOT. В отличии от AVR у всех STM32 на борту есть железный загрузчик. По умолчанию он выведен на USART. То есть если прижать к питанию ножку BOOT0 и рестартануть МК, то при помощи программы Flash Loader Demonstrator можно прошить МК без программатора. Данная фишка полезна если у вас уже есть готовое и работающее устройство и необходимо обновить прошивку, то нужно лишь переходник USB USART. Многие не хотят связываться с STM32 из-за питания не более 3,6 вольт. Ерунда. Если посмотреть в таблицу пинов, то можно заметить что все ножки могут принимать на себя 5 вольт без последствий. Поехали дальше.

А так она выглядит установленная на плату.

Теперь подключаем программатор ST-LINK-GA к SWD разъему.

Теперь когда все готово, качаем свежую версию с сайта ST (ссылка в самом низу страницы). Устанавливаем и запускаем.

Жмем New Project. И в появившемся окне находим наш контроллер. Жмем Ок.

После небольших раздумий. программа выдаст вот такое окно.

Расписывать что и зачем я не буду, так как это тема отдельной статьи. Сейчас для примера просто сделайте то что я покажу. Что мы будем делать. Мы запустим операционную систему и в единственном потоке будем моргать светодиодом. Этакий "Хелой Ворд" из пушки.))) Для этого в левом окошке нажмите на плюс у надписи "FREERTOS" и в выпавшем списке поставте галочку.

Причем как только будет выбран внешний кварц, справа на контроллере подсветятся зеленым ножки на которые нужно его повесить. Следующим делом надо выбрать ножку на которой будет висеть светодиод. Я выбрал порт В и пин 0. И нашел граблю.Я с перепугу что ли, не знаю зачем, перевернул выводную гребенку первых четырех пинов к верху ногами. Отсюда неразбериха на порте В. Этот косяк касается только моей платы. Но ничего, от этого МК работать не перестал. И так как настроить пин. Дело в том что у STM все пины могут принимать кучу значений, но если касаться дискретного ввода/вывода, то на выход может быть три варианта. Выход в воздухе, выход с подтяжкой к плюсу питания, выход с подтяжкой к общей шине. По умолчанию STM32CubeMX вешает ножку в воздухе. Ну и пусть, нам же нужно просто проверить работу и продемонстрировать силу STM32. Для того чтобы настроить ножку, нужно щелкнуть по ней левой кнопкой мышки и в появившемся окне выбрать GPIO_Output. Если МК мелковат, то можно покрутить колесиком и увеличить его.)))

Следующим этапом нужно настроить тактование МК. Дело в том что у STM32 с этим делом очень мутно. В отличии от AVR у STM32 на входе стоит кварц с частотой от 4 до 32 МГц, а на шинах его можно разогнать до 48 МГц. Внутри МК очень сложная система тактования, но на помощь нам идет опять STM32CubeMX. Переходим во вкладку Clock Configuration и настраиваем как на картинке ниже.

Вот и все. Жмем на иконку с шестеренкой на верху.

Появится вот такое окно.

А вот тут я забыл сказать. Скачайте и установите себе IAR. Его можно скачать у официалов но урезанный по количеству кода, либо можно найти в торрентах. Либо если много лишних денег, то можно и прикупить лицензию. Ну я думаю многие пойдут по тропе с CodeVisionAVR. В общем это оставляю на ваше усмотрение. У меня версия 7.40. Возвращаемся к Кубу. В окошке назовите проект, но только латинскими, IAR не любит русские буквы в путях. И задайте где будет хрониться проект. В окне IDE нужно выбрать (а он по умолчанию) EWARM. Жмем Ок. Программа думает, а потом выдает вот такое окно. Бла-бла-бла. В общем жмем открыть проект (для тех кто в танке средняя кнопка).

Окно исчезнет, а вместо него запустится IAR и наш проект. Слева заходим в Aplication->User и запускаем main.c. Вот эта куча кода и есть то что нагенерил за нас STM32CubeMX.

И что теперь с этим ужасом делать? А вот для этого нужно целую серию статей))) А сейчас просто находим вот такой кусок кода.

Это и есть наш единственный поток. В теле цикла for(;;) удаляем единственную функция osDelay(1);, а вместо нее запишем вот такой код. HAL_GPIO_WritePin(GPIOB,GPIO_PIN_0,GPIO_PIN_SET);
osDelay(500);
HAL_GPIO_WritePin(GPIOB,GPIO_PIN_0,GPIO_PIN_RESET);
osDelay(500);

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

Если все правильно и без ошибок, то программа соберет весь проект, создаст все что нужно и загрузит прошивку в МК. После этого перейдет в режим отладки. Вот он родной. Мечта AVR-щика. Если есть не преодолимое желание поюзать, то можно прям на железе походить по шагам, строка за строкой. А если охота посмотреть как работает программа, то жмен на крестик сверху слева и наслаждаемся микание светодиода.

Вот и все. Микроконтроллеры можно купить по самой низкой цене аж по 78 рублей за штуку в магазине ЧипРезистор . Ну а если хочется по дешевле то есть и мелкий опт. От 35 штук уже по 50 руб.
Проект для DipTrace.
И конечно же видео.


гость 31.12.15 10:35

Недавно хотел сделать частотомер на АТМЕГА16 плюс внешний 8 бит счетчик на 74логике, -не хватило быстродействия.На ассемблере писать-голова не выдержит,городить внешний счетчик на 16 бит-геморойно.АВР - это прошлый век, недешевый контроллер.Поддержу автора, АВР это пройденый этап,я тоже купил чип stm32f100 плюс чип адаптера ЮСБ CP2103, скоро от АВР все откажутся.

Алексей 31.12.15 12:26

Я не согласен. Все таки еще развивается Arduino и многие на нее подсели, а последняя в свою очередь работает на AVR. Переход на STM это что-то вроде перехода на следующий уровень. Так сказать из Детсада в школу.

АНОНИМ 12.02.16 10:44

AVR и STM32 это процессоры не конкурирующие друг с другом. В вашей табличке нет самого главного параметра - это ток потребления!! А посмотрев на них - можно прослезится. Atmega 328 - – Active Mode: 0.2 mA – Power-down Mode: 0.1 µA – Power-save Mode: 0.75 µA (Including 32 kHz RTC) STM32F030K6T6 48 MHz - Active Mode: периферия включена 23.3 mA периферия выключена 11.5 mA - Stop Mode: 0.048 mA STM32 жрёт электричество нещадно - грубо говоря в 100 раз больше чем AVR. От батарейки девайс на STM32 не запитаешь. А вот AVR будут работать месяцами. Так что отказаться от AVR трудно. Удачи всем.

Алексей 12.02.16 10:54

А никто и не предлагает отказаться от AVR. Я лишь показа разницу в периферии. Я до сих пор поддерживаю библиотеку для AVR и до сих пор мой основной МК ATMega8A.

Сергей 24.02.16 18:02

На мой взгляд как то странно сравнивать свежие STM32 с пенсионерами AVR. Если хотите сравнивать STM32 с контролерами ATMEL, то сравнивайте их с семейством ATSAM но не как ни с AVR.

Андрей 24.02.16 18:06

Это кто это пенсионер? AVR жив и будет еще жить хрен знает сколько. И глядя в таблицу, сравнение по моему идет больше по периферии, а не по архитектуре.

Алексей 24.02.16 19:04

Ну начинается. Давайте теперь обсудим АМД и Интел.

Сергей 24.02.16 22:02

На хабре один "знаток" написал, что у AVR нет параллельной шины для подключения стандартного LCD, а у STM32 есть...

Алексей 24.02.16 22:36

Что значит стандартный LCD? Это про FSMC? Так это не только для дисплея, это и для памяти. Просто параллельная шина. У AVR тоже есть, например у Mega8515. К ней через регистр-защелку можно SRAM подключить.

Сергец 25.02.16 06:24

Алексей, ну а я про что?! Такое впечатление, что вы даже не пытаетесь вникнуть в смысл моих сообщений.

Алексей 25.02.16 09:38

Ну, а какой смысл сравнивать два одинаковых микроконтроллера разных фирм. Оба на ядре ARM. Если совсем придираться, то тогда уж надо сравнивать AVR с STM8. Я то придерживался приближенностью периферии, формфактора и цены. И как раз разной архитектуры.

Адлан 03.06.16 17:40

Здравствуйте. Помогите, пожалуйста, кто может. Установил последнюю версию Куба 4.15, Библиотеки F1 1.4.0. Созданный пустой проект в EWARM не компилируется - больше сотни ошибок. ЧТо может быть? Спасибо [email protected]

Алексей 03.06.16 20:48

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

Doc 18.07.16 21:51

"Правда AVR может похвастаться Ардуиной и простатой программирования." ЧЕМ может похвастаться? ;D

Алексей 19.07.16 11:41

Это глупое сравнение. Во первых у STM есть аналог ардуины под названием нуклео. Программы пишутся в онлайн IDE прямо через браузер. А вот если плюсы лично камня, то. Частота работы ядра 72МГц, AVR и не снилась такая скорость. Конечно если маргать светодиодом, то разницы никакой, а вот если запустить ось и кучу периферии, то AVR сдуется. Разряднось, 32 далеко не 8. Попериферии на STM может находиться 3 I2C, 3 SPI, 6 UART, USB, CAN, Ethernet. Почти все имеет возможность ремапится, то есть переноситься на другие ноги мк. Есть так же DMA, это независимый сопроцессор для работы с периферией. Так что прерывания у AVR нервно курят в сторонке. Есть аппаратный SDIO для полноценной работы с CD картами, а не костыльный ISP в AVR. В общем там много чего еще есть, но самый жирный камень в огород AVR, это помехоустойчивосиь. AVR выбить пролегающим рядом кабелем от электромортора как нефиг делать, а вот STM нужно постараться. Так что язвить с ардуиной я бы не советовал.

гость 11.08.16 23:27

MICROCHIP поглотила AVR!))))))))))

Алексей 12.08.16 08:35

Опоздали с новостью, уже как лет пять назад.

Владимир 17.08.16 22:56

Алексей! В январе 2016 года фирма Microchip покупает Atmel за 3,56 млрд долларов.Каких 5лет?

Алексей 18.08.16 10:30

Это деюро, а дефакто это тянется аж с 2008 года. Так что я действительно ошибся, не 5 лет, а 8 лет назад.))))

Владимир 18.08.16 23:53

Алексей!Стал переходитьна stm32 !А насчёт потребления в авотономном режиме советует всё не тактировать, тогда и снизится ток потребления.

Олег 09.11.16 22:31

В datashet на STM не нашел графиков потребления оттактовой CLK системной как у AVR - а по тем табличкам что есть - STM32 вчистую проигрывает акак в обычном режмие, так и в Idle. Да и нет у этого STM32 тактовой в 72Мгц - только 48 макс, ивсе, так что даже при 32 разрядах 8 битник AVR - лучше получается, и кстати производитель в datasheet не написал сколько тактов в STM32 машинный цикл у него, так что если окажется 2 такта против 1 у AVR - то считай что 48/2=24 реальных Мгца - почти те же самые что и у 20 Мгц у AVR. Вот и вопрос - а чудо-то где у этого STM32 о котором Вы все талдычете?

АНОНИМ 09.11.16 23:03
Алексей 10.11.16 00:23

Я даже не хочу спорить. Что лучше Интел или АМД? Или Жигули или Волга? У СТМ есть аппаратный USB, CAN, Ethernet, SDIO и еще куча периферии которой AVRу только может присниться во сне. В конце концов есть ДМА как самостоятельный сопроцессор с прямым доступом к памяти перед которым все прерывания AVR нервно покуривают в сторонке. Например у первых сериях на борту сразу 3 UARTа, 2 SPI, 3 I2C. Ремап портов есть и не нужно ломать башку как развести плату. Если вам по нраву работать с AVR, то работайте, кто вам мешает. Я по сей день под мелкие проекты леплю меги восьмые и не жалуюсь. Ай да, воткните AVR рядом с пускателем и посмотрите как ему башку снесет наводками. У AVR нет защиты от ЭМН. Поэтому в автосигнализации всегда ставили ПИКи, так как АВР умирает в таких условиях. Да чего спорить, дохлый номер.

Корнет 27.11.16 21:22

Ну кстати уже есть ардуино и на STM32. Это и Амперка и Espruino всякие на JS) Тем более если Микрочип взял Атмел ну нафиг их

Алексей 27.11.16 21:44

Название Espruino пародирует Arduino, самую известную на тот момент хобби-платформу, но Espruino не совместима с классической Arduino Uno ни механически, ни программно.(цитата из Амперки)
Еще у меня есть плата Нуклео и она тоже никаким боком к Arduino не относится, разве что геометрией самой платы)))
Вообще по сути я использую тот МК, который подходит для текущей задачи.

Андрей 20.12.16 22:50

Кому нравится переплачивать: стоит attiny2313-20 - 2Kb-flash /128bit-ram/16bit_ timer -1/8bit_ timer -1 =2.1$ против stm32f103c8t6 64Kb-flash/20Kb-sram/16BIT timer (+контроль мертвого времени для двухканального режима ШИМ) -4/ADC-2/72MHz CPU/=2.3$.По-моему сделать измеритель импеданса цепи RLC c помощью авр практически нереально,либо городить 10 камней.А с STM и БПФ можно сделать(ДМА помогает).Попытался как-то сделать на Меге10 частотомер (точность 1 герц)- банально не хватило быстродействия (либо городить внешний 32-битный счетчик с регистром сдвига-откуда габариты).От АВР отказался год назад, AVR- выходит, для небедных людей.

Andrey 20.12.16 22:53

АНОНИМ писал-"И вот еще, цитата из описания STM32 на русском - "...С
момента
получения
прерывания
до
начала
выполнения
первой
команды
обработчика
прерывания
затрачивается
только
двенадцать
циклов
тактового
сигнала"

Это правда.Но перемножьте два 32-битных числа на avr - явно 8-10 тактов!

Алексей 20.12.16 23:31

Да, я уже сожалею что этот халивар начал.))))

Александр 21.12.16 00:27

Почитал коменты и вспомнил.
Два малыша в песочнице
Один дудука!
Второй, бибика!
Первый, ДУдука! (интонация более грозная)
Второй, БИБИКА! (С еще более выразительной интонацией)
Первый ДУДУКА! (Уже крича)
Второй БИБИКА!!! (Чуть ли не плача)
....
Закончилось эта баталия, оба стоят и плачат, один громче другова.)))

Вал 10.02.17 01:43

Какая частота будет если зациклить без задержки
while (1)
{
HAL_GPIO_WritePin(GPIOB,GPIO_PIN_0,GPIO_PIN_SET);
HAL_GPIO_WritePin(GPIOB,GPIO_PIN_0,GPIO_PIN_RESET);
}

Алексей 10.02.17 10:07

Та что на шине APB

Игорь 08.06.17 22:33

Так давайте сразу ноутбуки во встраиваемые системы встраивать, они же лучше чем СТМ в сотни раз, и пееферии там ну просто охрененно сколько, там уже и вай фай есть и блютузы и даже программаторы не нужны, сразу и монитор есть с клавой чтобы писать прогу и сразу запустить, и программаторы не нужны и отладчики.
Всё равно что купить себе на дачу в личное пользование экскаватор для того чтобы ИНОГДА выкапывать пару ям глубиной в пол метра.
Ставить в термостат, часы, весы СТМ ну по моему это не нормально. Кстати да, как насчёт энергонезависимой памяти, вот делаю я термостат, выставляю температуру, тут вырубается свет, и что, настройки потеряны. А ведь во встроенные системы которые должны настраиваться 1 раз для дальнейшей работы, значения должны сохраняться навсегда

Алексей 09.06.17 08:25

Ну например в чип-дип STM32F030F4P6 стоит 48р, а прямой аналог ATtiny2313 98р. Я думаю для построения термостата любого из них будет достаточно. А компенсация памяти у STM может быть в любом датчике температуры. Да хотя бы в том же DS18B20. А что касается ноутов, так в любом терминале приема оплаты как раз установлен ПК с ОС и монитором. Так что даже такие системы есть. При выборе МК в первую очередь выбирают тот что дешевле. Это если хобби, то можно купить ардуину дабы не заморачиваться с пайкой, а когда систему планируется ввести на производство и выпускать сотнями, то считается каждая копейка. И переплата за МК 50 рублей при его цене в 48 это непозволительная роскошь.

Руслан 17.06.17 21:46
Я ее переделал под хол!
Но при подключении вилазят еррори!
Нужна информация как работать с не родними библиотеками!
В интернете ничего не нашел там только расказивают как подключать родние библиотеки.
Если "плохо искал" то дайте ссилку где можно посмотреть или почитать как ето делать!
А еще лучше сделайте видео, думаю многим начинающим (и не только) оно будет интересно посмотреть!
Заранее благодарен!
Алексей 05.08.17 10:19
Руслан 22.11.17 12:17

Я имел ввиду ето https://www.youtube.com/watch?v=wOIlhRd-vN8
5 - 7 минута!!!

Руслан 22.11.17 12:18

Алексей подскажите пожалуйста как работать с перечислениями "enum" а то нигде нету такой информации и в ваших видео "Си для самих маленьких" тоже нету а мне как раз очень надо!
Когда баловался AVR-ками то такоє чудо как перечисления не встречал а сейчас заинтересовался STM-ками а там их очень много! И нету информации как с ними работать!
Есть такой пример из реального кода:


StatusCode MIFARE_Read(byte blockAddr, byte * buffer, byte * bufferSize);

Где StatusCode ето перечисление:


enum StatusCode: byte {
STATUS_OK , // Success
STATUS_ERROR , // Error in communication
STATUS_COLLISION , // Collission detected
STATUS_TIMEOUT , // Timeout in communication.
STATUS_NO_ROOM , // A buffer is not big enough.
STATUS_INTERNAL_ERROR , // Internal error in the code. Should not happen ;-)
STATUS_INVALID , // Invalid argument.
STATUS_CRC_WRONG , // The CRC_A do es not match
STATUS_MIFARE_NACK = 0xff // A MIFARE PICC responded with NAK.
};

Ето из ардуиновской библиотеки(С++), но Keil ругается на ето!
Как правильно записать возврат функцией перечисления?

Руслан 22.11.17 12:29

И еще как обьявить в функции одним из аргументов которой есть перечисление:


void PCD_WriteRegister(PCD_Register reg, byte value);

Где PCD_Register перечислениє:


enum PCD_Register: byte {
// Page 0: Command and status
// 0x00 // reserved for future use
CommandReg = 0x01 << 1, // starts and stops command execution
ComIEnReg = 0x02 << 1, // enable and disable interrupt request control bits
DivIEnReg = 0x03 << 1, // enable and disable interrupt request control bits
ComIrqReg = 0x04 << 1, // interrupt request bits
...
};

А reg ето как я понял име перечисления но его нигде нету обьявленним в коде и откуда оно взялось мне не понятно!
Много страний перечитал в интернете и нашел информацию что ети перечисления можно заменить дефайнами но все же хотелось би узнать как с ними работать!!!

Руслан 22.11.17 12:35

С нетерпением жду ответа!
Может снимите видосик как с ними работать,чтоб и для других било, думаю видео будет очень полезним потому что таких видео нету(по крайней мере я не нашел)!

Дмитрий 28.11.17 22:02

"простатой программирования"

Интересный орган для программирования контроллеров. Вообще как можно было сравнивать 32-битные с 8-битными непонятно. Как Порш Каен с Зарпорожцем.

Алексей 29.11.17 10:24

Можно сравнивать, можно. Просто нужно учесть что в данном сравнении Порш стоит дешевле Запорожца. По поводу урологии, так пикантнее. Так что исправлять не буду.

Константин 23.12.17 00:06

Руслан, я не понимаю, как ты ищешь и ничего не находишь (видимо, не ищешь). Это самые-самые основы языка С (не только для МК, но и для компов). Почитай книгу Кернигана и Ритчи, там весь С прекрасно описан.
А на твои вопросы никто тебе отвечать не будет, это элементарщина.

АНОНИМ 11.02.18 16:27

Почему вы сравниваете 32разрядный МК ST с 8разрядным Atmel. Глупое сравнение. Равносильно сравнивать 32разрядный Atmel AT91SAM с 8разрядными STM8 учитывая даже что у Atmel есть 32 разрядники еще мощнее

Алексей 13.02.18 12:18

Потому что на момент написания статьи, 8-ми бинтных ST не было в продаже, а по цене мега и СТМ32 стоят одинаково.