Сен 162020
 

Arduino STM32

Arduino
79a817.png

Здравствуйте.

Речь пойдёт о плате Blue Pill (в простонародье Arduino STM32), построенной на базе микроконтроллера STM32F103C8T6, которая по своим размерам и цене сравнима с Arduino Nano, но значительно превосходит её по возможностям и может программироваться в IDE Arduino.

Основные тех. характеристики

• ARM Cortex M3
• Разрядность — 32-х битный
• Частота — 72МГц
• Flash-память — 64КБ / 128КБ
• Оперативная память — 20КБ
• SPI — две штуки
• I2C — две штуки
• UART — три аппаратных UART’а + USB (то есть получается четыре интерфейса)
• CAN-шина
• АЦП — 12-и битный
• ШИМ — 16-и битный
• Напряжение питания — от 2 до 3.6В (то есть можно запитать от двух «пальчиковых» батареек)
• Внутренние часы реального времени (на плате есть специальный пин — Vbat, для подключения батарейки)

Распиновка

ec9377.pngещё вариант

Повторяющиеся названия, например Serial1, говорят о том, что этот интерфейс можно запрограммировать для работы на одних либо на других «ножках».
По умолчанию, Serial1 «сидит» на «ножках» РА9 и РА10, на «ножках» РВ6 и РВ7 I2C1, а на РВ8 и РВ9 CAN-шина. Однако ничто не мешает перенастроить эти пины (равно как и любые другие, в том числе «аналоговые») на работу в дискретном режиме, то есть как обычные «цифровые».

Warning!

Будьте осторожны с пинами РА11 и РА12 — это USB, если что-то пойдёт не так, то помимо потери возможности прошивки МК по usb, можно ещё и комп повредить.

К пинам РС14 и РС15 подключён внешний кварц для часов (32.768). 9a8677.png

Другие пины могут выдать максимум 20мА, рекомендуется 8мА. Общая максимальная нагрузка не должна превышать 150мА.

Не смотря на то, что напряжение питания ~3В, половина «ножек» терпимы к пяти вольтам. Что конечно же значительно облегчает использование различной периферии.

Светодиод РС13 (который у ардуины D13) включается не плюсом, а минусом. Это на всякий случай, чтоб у Вас не произошло когнитивного диссонанса, когда напишите — digitalWrite(PC13, HIGH), а диод погаснет. 407d92.jpg

Негативные моменты

У МК отсутствует EERPOM, но это решается подключением внешней флешки по I2C или SPI. Помимо этого можно эмулировать EEPROM используя встроенную flash-память. Есть в примерах IDE.

Вот здесь, говорится о том, что стандарт USB требует подтяжки линии D+ резистором 1.5kΩ, вместо этого почему то ставят 10kΩ или 4.7kΩ. Его рекомендуют заменить либо добавить резистор на 1.8kΩ между PA12 и 3.3V.
На моей плате стоит 10kΩ и я ничего не менял.

И ещё, когда будете припаивать «гребёнки», пропаяйте места крепления разъёма micro-usb.

Подготовка к работе

Описание будет сделано для 7465ad.png и 97c431.png

Среда программирования IDE Arduino 1.8.5

Изначально, заливать скетчи через встроенный USB не получится, для этого нужно прошить специальный загрузчик (про бутлоадер в конце статьи). Чтобы это осуществить, понадобится USB to UART конвертер (далее по тексту я буду часто использовать этот «термин»).

3ad8f5.jpg

Если такой штуковины нет, то есть два варианта превращения ардуины в конвертер…

1. Замкнуть RESET на GND (может не прокатить).
2. Загрузить в неё вот такой незамысловатый скетч:

void setup() { pinMode(0, INPUT); pinMode(1, INPUT); } void loop() {} 

проверить

В «этих ваших интернетах» пишут, что нужно согласовывать уровни напряжения (5v to 3.3v), но в этом нет смысла так как нужные нам ножки толерантны к 5v.

Далее переставляем джамперы на платке вот так:

Для чего это делается — прочтете в конце статьи.

b317a1.png

Соединяем конвертер и STM следующим образом…картинка

Конвертер RX <-> PA9 STM
Конвертер TX <-> PA10 STM
Конвертер GND <-> GND STM

… и подключаем конвертер и STM к компьютеру.

Железки подготовили, теперь займёмся средой. Скачайте архив STM32.zip и куда-нибудь его распакуйте.

faa1a8.png

Папку ArduinoSTM32 (это ядро stm, взято отсюда) нужно положить в ../arduino-1.8.5/hardware/…

2db5d1.png
Справедливо для windows и linux, только пути разные (философская фразочка получилась). 407d92.jpg

Далее запускаем среду и открываем «Менеджер плат…»

a08b7b.png
Если покрутить список вниз, то будет видно что наша платка уже появились — «Generic STM32F103C series».

В «Менеджере плат» нужно установить пакет Arduino SAM Boards (32-bits ARM Cortex-M3)

8c77ce.png

Всё, среду тоже подготовили, теперь перейдём к установке загрузчика.

Инструкция по прошивке загрузчика для 7465ad.png

Первый вариант — из командной строки.

Опишу этот вариант не смотря на то, что это противоречит мировоззрению большинства поклонников windows.

Открываем терминал и переходим в папку с утилитой stm32flash.exe, у меня это — c:\arduino-1.8.5\hardware\ArduinoSTM32\tools\win\

cd c:\arduino-1.8.5\hardware\ArduinoSTM32\tools\win\

Копируем в эту папку файл generic_boot20_pc13.bin (он есть в архиве, взят отсюда) и даём команду…

stm32flash.exe -w generic_boot20_pc13.bin -v -g 0x0 COM12

COM12 — это порт на котором висит конвертер.

b4cbf4.png
Всё, загрузчик прошит. С помощью этой утилиты можно выполнять любые действия — загружать bin-файлы, очищать МК, читать прошивку и т.д. Посмотреть справку — stm32flash.exe —help

Второй вариант — с помощью программы Flash Loader Demonstrator.

Переходим в папку Flash Loader Demonstrator и запускаем Flash Loader Demonstrator.exe

4f044e.png
Выбираем СОМ-порт конвертера и жмем Next

7cb0b0.png
Если светофор даёт зеленый свет, то смело жмите Next

624373.png
Жмем Next

058569.png
В пункте Download to device указываем файл — generic_boot20_pc13.bin (он есть в архиве) и жмем Next

31f5bf.png
Прошивка прошла успешно. Закрываем программу, больше она не нужна.

Теперь идём в папку ..\Drivers\win\ (из архива) и от имени администратора запускаем файл install_drivers.bat, это установит драйвера для платы.

Инструкция по прошивке загрузчика для 97c431.png

Перейдите в папку…

cd /home/dima/arduino-1.8.5/hardware/ArduinoSTM32/tools/linux64/stm32flash/

Для 64-х битной системы.

cd /home/dima/arduino-1.8.5/hardware/ArduinoSTM32/tools/linux/stm32flash/

Для 32-х битной системы.

Забросьте в эту папку файл generic_boot20_pc13.bin (он лежит в архиве, взят отсюда) и дайте комаду…

./stm32flash -w generic_boot20_pc13.bin -v -g 0x0 /dev/ttyUSB0

d128fd.png
Всё, загрузчик прошит. С помощью этой утилиты можно выполнять любые действия — загружать bin-файлы, очищать МК, читать прошивку и т.д. Посмотреть справку — ./stm32flash —help

Позже, при попытке залить скетч, я столкнулся с тем, что IDE не видела устройства…

146ab1.png

Вылечил следующим образом…

Установил утилиту dfu-util

sudo apt install dfu-util

Так и не понял нужно ли это было делать. Попробуйте без этой команды.

Создал правило в /etc/udev/rules.d/

sudo nano /etc/udev/rules.d/45-maple.rules

Вот с таким содержимым:

ATTRS{idProduct}=="1001", ATTRS{idVendor}=="0110", MODE="664", GROUP="plugdev" ATTRS{idProduct}=="1002", ATTRS{idVendor}=="0110", MODE="664", GROUP="plugdev" ATTRS{idProduct}=="0003", ATTRS{idVendor}=="1eaf", MODE="664", GROUP="plugdev" SYMLINK+="maple" ATTRS{idProduct}=="0004", ATTRS{idVendor}=="1eaf", MODE="664", GROUP="plugdev" SYMLINK+="maple"

Так же это работает если заменить группу plugdev на dialout (это просто к сведению).

Перегружаем правила:

sudo udevadm control --reload-rules

Да, проверьте состоит ли Ваш пользователь в группе plugdev (сделать это можно через пункт меню «Настройки» ⇨ «Пользователи и группы», после добавления пользователя необходимо перелогиниться).

Это решение я нашёл в сети, а позже обнаружил, что файлик 45-maple.rules есть в папке ../ArduinoSTM32/tools/linux64/, ну это опять же, просто к сведению.

Далее идёт описание для обоих ОС

Возвращаем джампер в исходное положение…

761582.png

… подключаем USB и нажимаем кнопочку RESET на плате. Светодиод начнёт часто мигать.

Запускаем IDE Arduino, выбираем плату и всё остальное как на картинке…

2b4c01.png

Здесь есть несколько пунктов, которые требуют пояснения…

Во-первых, у Вас ещё пока не появился usb-порт «Maple mini» (будет только порт конвертера), но об этом ниже.

Во-вторых, пункт — Variant: «STM32F103C8 (20k RAM.64k Flash)»
Если внимательно посмотреть на картинки из главы про прошивку загрузчика, то будет видно, что в варианте прошивки через «командную строку», утилита stm32flash.exe показала — Flash: 128KiB, а в варианте с Flash Loader Demonstrator было — 64КВ.
Вот здесь (в разделе 128 KB flash on C8 version) пишут, что практически все протестированные ими (видимо имеется в виду ихний форум) микроконтроллеры имеют 128КБ флэша.

Ещё один пункт, который может показаться непонятным — Optimize: «Smallest(default)». Он отвечает за уровень оптимизации при компиляции и добавление отладочных символов, если Вы не знаете что это такое, то оставьте как на картинке.

Теперь про порт «Maple mini». Чтобы он появился, нужно один раз загрузить любой скетч. Вот здесь (в разделе Software installation) про это пишут, но причин не объясняют, поэтому давайте просто сделаем…

Выберите в IDE любой порт…

36dca0.png

bd8ffd.png

… и прошейте этот скетч:

void setup() { pinMode(PC13, OUTPUT); } void loop() { digitalWrite(PC13, HIGH); delay(40); digitalWrite(PC13, LOW); delay(40); }

c04b9a.png
Загрузка прошла успешно.

После загрузки сразу же появится порт «Maple mini». Возня с загрузчиками на этом закончена, тернистый путь Вы прошли. 5f887b.png

Отключите конвертер (или не отключайте, как хотите), выбирайте «Maple mini» и загружайте свои скетчи.

8733ee.png

На картинке видно ошибку — error resetting after download: usb_reset: could not reset device, win error:
На работу это не влияет.

Иногда происходят вот такие ошибки…

60026d.png

9b4021.png

89f9d9.png

МК не хочет прошиваться. Помогает нажатие RESET.
Если не помогает, тогда зажмите RESET, отпустите его, и спустя мгновение нажмите кнопку db334c.png Должно прошиться.
описание проблемыНе отрабатывает авторесет МК.

Эта проблема описана здесь (в разделе Software installation). Для Linux (про win ничего не говорят) предлагается увеличить задержку после ресета в файле maple_upload из папки ../ArduinoSTM32/tools/linux/.

Речь идёт об этой строчке — «${DIR}/upload-reset» ${dummy_port_fullpath} 750
Я «поигрался» этим значением, но в силу того, что ошибка проявляется редко, так и не понял, помогает это или нет.

Linux у меня 64-х битный, но файлик всё равно используется из папки /linux/, а не /linux64/. Проверить это легко, просто добавьте в самый конец строчку — echo istarik.ru.

69a23f.png

Собственно это и проблемой то нельзя назвать, не такой уж и великий труд нажать иногда кнопку ресет. На работу МК это никак не влияет.

Примеры

В разделе «Примеры» есть различные примеры a7d6b8.png

9f8a3b.png

В примерах указаны неправильные обозначения «ножек», например в скетче Blink прописан пин PB1, это связано с тем, что примеры делались для платы Maple Mini, поэтому сверяйтесь с распиновкой.

Небольшое пояснение функции Serial.println();

Serial.println() — печать в USB.
Serial1.println() — печать в UART 1.
Serial2.println() — печать в UART 2.
Serial3.println() — печать в UART 3.

Настройка скорости .begin(baud rate) действует только на Serial1,2,3 (UARTы).
Для Serial (USB) функцию .begin() прописывать не обязательно. В «Мониторе порта» можно указывать любую скорость.

Реальная скорость USB может зависеть от различных факторов, от принимающей стороны (какую максимальную скорость поддерживает устройство), от посылаемых данных (например длиная строка или побайтно). Примерная скорость — от 1Мбит/с. до 5Мбит/с.

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

Про джамперы и bootloader

Bootloader (загрузчик) – это обычная программа, которая в момент старта МК решает, что должно происходить дальше…

Сейчас, когда у Вас уже всё сделано, процесс работы выглядит так: как только Вы подали питание или нажали кнопку RESET, в дело вступает прошитый bootloader (файлик generic_boot20_pc13.bin). В течении первой секунды он ожидает заливки новой прошивки (по USB), если новой прошивки не поступает (то есть Вы ничего не заливаете в МК), тогда bootloader проверяет есть ли в МК какая-либо прошивка и если есть, то передаёт управление ей. Если ничего нет, то ничего и не происходит.

Когда Вы в своей IDE нажимаете кнопку db334c.png , в МК посылается спец. сигнал вызывающий программный RESET и пошло-поехало.

Джамперы

75c9b6.png
Обычный режим. За загрузку программ отвечает установленный нами bootloader. Если его не установить, то прошить МК можно только в режиме «системного bootloader’а». Спец. программаторы в статье не рассматриваются.

b317a1.png
Режим «системного bootloader’а». Системный bootloader ожидает прошивку — можно загружать в МК всё что угодно. Либо через IDE Arduino, выбрав Upload method: «Serial» и порт конвертера, либо утилитой stm32flash, либо Flash Loader Demonstrator’ом.

Системный bootloader зашивается в System memory на этапе производства, его нельзя удалить или изменить.

65d2fa.png
В этом режиме, с помощью специального программатора, можно заливать прошивку в оперативную память. Это продлевает жизнь Flash при отладке программ.

d81518.png

1274f6.png

В разделе Option bytes хранятся некоторые настройки, с помощью которых можно защитить Flash от записи/чтения и вкл/откл watchdog. Для установки воспользуйтесь Flash Loader Demonstartor или stm32flash.

Руководство (рус.) по stm32

Datasheet

Reference Manual RM0008

Programming Manual PM0056

Схема

Полезные ресурсы:

Понравилось? Поделитесь:

:

Sorry, the comment form is closed at this time.