Arduino STM32






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

Речь пойдёт о плате 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, для подключения батарейки)



Распиновка


ещё вариант


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



Warning!

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

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

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




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

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



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

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

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

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




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


Описание будет сделано для   и

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


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



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

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

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

проверить
Чтобы проверить работает ли ардуина в качестве конвертера, замкните RX и TX, откройте   и отправьте какие-нибудь символы. Если они вернулись, значит всё работает.


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


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

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



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



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

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



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




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


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



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


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



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



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




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


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

Опишу этот вариант не смотря на то, что это противоречит мировоззрению большинства поклонников 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 — это порт на котором висит конвертер.



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




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


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


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




Если светофор даёт зеленый свет, то смело жмите 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"

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


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

sudo udevadm control --reload-rules


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

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





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


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



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


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



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

Во-первых, у Вас ещё пока не появился 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 любой порт…





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

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.



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





Примеры

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





В примерах указаны неправильные обозначения «ножек», например в скетче 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 нажимаете кнопку  , в МК посылается спец. сигнал вызывающий программный RESET и пошло-поехало.



Джамперы



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




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

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





В этом режиме, с помощью специального программатора, можно заливать прошивку в оперативную память. Это продлевает жизнь 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
  • 100695
Поддержать автора


Telegram-чат istarik

Задать вопрос по статье
Telegram-канал istarik

Известит Вас о новых публикациях






Комментарии (3)

Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.