Arduino STM32
Здравствуйте.
Речь пойдёт о плате Blue Pill (в простонародье Arduino STM32), построенной на базе микроконтроллера STM32F103C8T6, которая по своим размерам и цене сравнима с Arduino Nano, но значительно превосходит её по возможностям и может программироваться в
Основные тех. характеристики
• ARM Cortex M3
• Разрядность — 32-х битный
• Частота — 72МГц
• Flash-память — 64КБ / 128КБ
• Оперативная память — 20КБ
• SPI — две штуки
• I2C — две штуки
• UART — три аппаратных UART'а + USB (то есть получается четыре интерфейса)
• CAN-шина
• АЦП — 12-и битный
• ШИМ — 16-и битный
• Напряжение питания — от 2 до 3.6В (то есть можно запитать от двух «пальчиковых» батареек)
• Внутренние часы реального времени (на плате есть специальный пин — Vbat, для подключения батарейки)
Распиновка
ещё вариант
Повторяющиеся названия, например Serial1, говорят о том, что этот интерфейс можно запрограммировать для работы на одних либо на других «ножках».
По умолчанию, Serial1 «сидит» на «ножках» РА9 и РА10, на «ножках» РВ6 и РВ7 I2C1, а на РВ8 и РВ9 CAN-шина. Однако ничто не мешает перенастроить эти пины (равно как и любые другие, в том числе «аналоговые») на работу в дискретном режиме, то есть как обычные «цифровые».
Будьте осторожны с пинами РА11 и РА12 — это USB, если что-то пойдёт не так, то помимо потери возможности прошивки МК по usb, можно ещё и комп повредить.
К пинам РС14 и РС15 подключён внешний кварц для часов (32.768).
Другие пины могут выдать максимум 20мА, рекомендуется 8мА. Общая максимальная нагрузка не должна превышать 150мА.
Не смотря на то, что напряжение питания ~3В, половина «ножек» терпимы к пяти вольтам. Что конечно же значительно облегчает использование различной периферии.
Светодиод РС13 (который у ардуины D13) включается не плюсом, а минусом. Это на всякий случай, чтоб у Вас не произошло когнитивного диссонанса, когда напишите — digitalWrite(PC13, HIGH), а диод погаснет.
Негативные моменты
У МК отсутствует EERPOM, но это решается подключением внешней флешки по I2C или SPI. Помимо этого можно эмулировать EEPROM используя встроенную flash-память. Есть в примерах
Вот здесь, говорится о том, что стандарт USB требует подтяжки линии D+ резистором 1.5kΩ, вместо этого почему то ставят 10kΩ или 4.7kΩ. Его рекомендуют заменить либо добавить резистор на 1.8kΩ между PA12 и 3.3V.
На моей плате стоит 10kΩ и я ничего не менял.
И ещё, когда будете припаивать
Подготовка к работе
Описание будет сделано для и
Среда программирования IDE Arduino 1.8.5
Изначально, заливать скетчи через встроенный USB не получится, для этого нужно прошить специальный загрузчик
Если такой штуковины нет, то есть два варианта превращения ардуины в конвертер…
1. Замкнуть RESET на GND (может не прокатить).
2. Загрузить в неё вот такой незамысловатый скетч:
void setup()
{
pinMode(0, INPUT);
pinMode(1, INPUT);
}
void loop()
{}
проверить
Чтобы проверить работает ли ардуина в качестве конвертера, замкните RX и TX, откройте и отправьте какие-нибудь символы. Если они вернулись, значит всё работает.
Далее переставляем джамперы на платке вот так:
Соединяем конвертер и STM следующим образом…
картинка
Конвертер RX <-> PA9 STM
Конвертер TX <-> PA10 STM
Конвертер GND <-> GND STM
… и подключаем конвертер и STM к компьютеру.
Железки подготовили, теперь займёмся
Папку ArduinoSTM32 (это ядро stm, взято отсюда) нужно положить в ../arduino-1.8.5/hardware/…
Справедливо для windows и linux, только пути разные (философская фразочка получилась).
Далее запускаем среду и открываем «Менеджер плат...»
В «Менеджере плат» нужно установить пакет Arduino SAM Boards (32-bits ARM Cortex-M3)
Всё, среду тоже подготовили, теперь перейдём к установке загрузчика.
Инструкция по прошивке загрузчика для
Первый вариант — из командной строки.
Открываем терминал и переходим в папку с утилитой 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 — это порт на котором висит конвертер.
Всё, загрузчик прошит. С помощью этой утилиты можно выполнять любые действия — загружать bin-файлы, очищать МК, читать прошивку и т.д. Посмотреть справку — stm32flash.exe --help
Второй вариант — с помощью программы Flash Loader Demonstrator.
Переходим в папку Flash Loader Demonstrator и запускаем Flash Loader Demonstrator.exe
Выбираем СОМ-порт конвертера и жмем Next...
Если светофор даёт
Жмем Next...
В пункте Download to device указываем файл — generic_boot20_pc13.bin (он есть в архиве) и жмем Next...
Прошивка прошла успешно. Закрываем программу, больше она не нужна.
Теперь идём в папку ..\Drivers\win\ (из архива) и от имени администратора запускаем файл install_drivers.bat, это установит драйвера для платы.
Инструкция по прошивке загрузчика для
Перейдите в папку…
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
Всё, загрузчик прошит. С помощью этой утилиты можно выполнять любые действия — загружать bin-файлы, очищать МК, читать прошивку и т.д. Посмотреть справку — ./stm32flash --help
Позже, при попытке залить скетч, я столкнулся с тем, что IDE не видела устройства…
Вылечил следующим образом…
Установил утилиту 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"
Перегружаем правила:
sudo udevadm control --reload-rules
Да, проверьте состоит ли Ваш пользователь в группе plugdev (сделать это можно через пункт меню «Настройки» ⇨ «Пользователи и группы», после добавления пользователя необходимо перелогиниться).
Это решение я нашёл в сети, а позже обнаружил, что файлик 45-maple.rules есть в папке ../ArduinoSTM32/tools/linux64/, ну это опять же, просто к сведению.
Далее идёт описание для обоих ОС
Возвращаем джампер в исходное положение…
… подключаем USB и нажимаем кнопочку RESET на плате. Светодиод начнёт часто мигать.
Запускаем
Здесь есть несколько пунктов, которые требуют пояснения…
Во-первых, у Вас ещё пока не появился usb-порт «Maple mini» (будет только порт конвертера), но об этом ниже.
Во-вторых, пункт — Variant: «STM32F103C8 (20k RAM.64k Flash)»…
Если внимательно посмотреть на картинки из главы про прошивку загрузчика, то будет видно, что в варианте прошивки через «командную строку», утилита stm32flash.exe показала — Flash: 128KiB, а в варианте с Flash Loader Demonstrator было — 64КВ.
Вот здесь
Ещё один пункт, который может показаться непонятным — Optimize: «Smallest(default)». Он отвечает за уровень оптимизации при компиляции и добавление отладочных символов, если Вы не знаете что это такое, то оставьте как на картинке.
Теперь про порт «Maple mini». Чтобы он появился, нужно один раз загрузить любой скетч. Вот здесь
Выберите в
… и прошейте этот скетч:
void setup()
{
pinMode(PC13, OUTPUT);
}
void loop()
{
digitalWrite(PC13, HIGH);
delay(40);
digitalWrite(PC13, LOW);
delay(40);
}
Загрузка прошла успешно.
После загрузки сразу же появится порт «Maple mini». Возня с загрузчиками на этом закончена, тернистый путь Вы прошли.
Отключите конвертер (или не отключайте, как хотите), выбирайте «Maple mini» и загружайте свои скетчи.
На картинке видно ошибку — error resetting after download: usb_reset: could not reset device, win error:
На работу это не влияет.
Иногда происходят вот такие ошибки…
МК не хочет прошиваться. Помогает нажатие RESET.
Если не помогает, тогда зажмите RESET, отпустите его, и спустя мгновение нажмите кнопку Должно прошиться.
описание проблемы
Не отрабатывает авторесет МК.
Эта проблема описана здесь(в разделе Software installation) . Для Linux (про win ничего не говорят) предлагается увеличить задержку после ресета в файле maple_upload из папки ../ArduinoSTM32/tools/linux/.
Речь идёт об этой строчке — "${DIR}/upload-reset" ${dummy_port_fullpath} 750
Я «поигрался» этим значением, но в силу того, что ошибка проявляется редко, так и не понял, помогает это или нет.
Linux у меня 64-х битный, но файлик всё равно используется из папки /linux/, а не /linux64/. Проверить это легко, просто добавьте в самый конец строчку — echo istarik.ru.
Собственно это и проблемой то нельзя назвать, не такой уж и великий труд нажать иногда кнопку ресет. На работу МК это никак не влияет.
Эта проблема описана здесь
Речь идёт об этой строчке — "${DIR}/upload-reset" ${dummy_port_fullpath} 750
Я «поигрался» этим значением, но в силу того, что ошибка проявляется редко, так и не понял, помогает это или нет.
Собственно это и проблемой то нельзя назвать, не такой уж и великий труд нажать иногда кнопку ресет. На работу МК это никак не влияет.
Примеры
В разделе «Примеры» есть различные примеры
В примерах указаны неправильные обозначения «ножек», например в скетче Blink прописан пин PB1, это связано с тем, что примеры делались для платы Maple Mini, поэтому сверяйтесь с распиновкой.
Небольшое пояснение функции Serial.println();
Serial.println() — печать в USB.
Serial1.println() — печать в UART 1.
Serial2.println() — печать в UART 2.
Serial3.println() — печать в UART 3.
Настройка скорости .
Для Serial (USB) функцию .
Реальная скорость USB может зависеть от различных факторов, от принимающей стороны (какую максимальную скорость поддерживает устройство), от посылаемых данных (например длиная строка или побайтно). Примерная скорость — от 1Мбит/с. до 5Мбит/с.
Большой размер занимаемой скетчем памяти, связан с подгружаемыми библиотеками.
Про джамперы и bootloader
Bootloader (загрузчик) – это обычная программа, которая в момент старта МК решает, что должно происходить дальше…
Сейчас, когда у Вас уже всё сделано, процесс работы выглядит так: как только Вы подали питание или нажали кнопку RESET, в дело вступает прошитый bootloader (файлик generic_boot20_pc13.bin). В течении первой секунды он ожидает заливки новой прошивки (по USB), если новой прошивки не поступает (то есть Вы ничего не заливаете в МК), тогда bootloader проверяет есть ли в МК какая-либо прошивка и если есть, то передаёт управление ей. Если ничего нет, то ничего и не происходит.
Когда Вы в своей IDE нажимаете кнопку , в МК посылается спец. сигнал вызывающий программный RESET и пошло-поехало.
Джамперы
Обычный режим. За загрузку программ отвечает установленный нами bootloader. Если его не установить, то прошить МК можно только в режиме «системного bootloader'а».
Режим «системного bootloader'а». Системный bootloader ожидает прошивку — можно загружать в МК всё что угодно. Либо через IDE Arduino, выбрав Upload method: «Serial» и порт конвертера, либо утилитой stm32flash, либо Flash Loader Demonstrator'ом.
В этом режиме, с помощью специального программатора, можно заливать прошивку в оперативную память. Это продлевает жизнь Flash при отладке программ.
В разделе Option bytes хранятся некоторые настройки, с помощью которых можно защитить Flash от записи/чтения и вкл/откл watchdog. Для установки воспользуйтесь Flash Loader Demonstartor или stm32flash.
Руководство (рус.) по stm32
Datasheet
Reference Manual RM0008
Programming Manual PM0056
Схема
Полезные ресурсы:
Форум (рус.)
www.stm32duino.com/index.php
www.avislab.com/blog/stm32_st_link_ru/
На этом первая часть окончена…
Вторая часть — Arduino STM32 — внешние прерывания
Телеграм-чат istarik
Телеграм-чат STM32
Следите за обновлениями ядра (это то, что лежит в папке ArduinoSTM32).
- 0
- stD
103041
Поддержать автора
Комментарии (3)