Хотите прокачать ваши Arduino проекты? Заставить их работать быстрее, измерения и регулировку сделать точнее, ну и добавить баги(с новыми девайсами они неизбежны). Тогда эта статья для Вас.
Arduino тема всё больше захватывает умы человечества, но рано или поздно мы встречаемся с тем, что нам чего-то не хватает, например бюджета/размеров/
Хорошие люди это понимают, и потихоньку начинают приобщать STM32 к ардуино теме, ибо восьмибитные AVR микроконтроллеры, на которых основано немало ардуино плат, не всегда могут справиться с поставленными задачами.
Краткое изложение данной статьи в видео формате:
Ладно, меньше лирики и ближе к теме. В этой статье, я буду рассматривать дешёвую отладочную плату, которая основана на базе микроконтроллера STM32F103C8T6:
Для начала, сравним основные параметры STM32 платы, и её аналога по цене — Arduino Nano V3.0:
- Рабочая частота 72 МГц, против 16 у ардуино;
- Объем Flash памяти 64 Кбайта, против 32;
- Оперативной памяти, она же RAM(где хранятся переменные), у STM32 целых 20 Кбайт, у ардуинки всего лишь 2;
- Быстрый 12-ти битный АЦП, в то время как у Arduino плат, что на базе AVR микроконтроллеров(это как правило большинство) используется 10-ти битный. Это означает, что в случае STM32, функция analogRead(*); будет возвращать 0..4095 против 0..1023, что в первом случае ведёт к более точным измерениям;
- 16-ти битный аппаратный ШИМ, против 8-ми у Arduino плат, то есть, функция
analogWrite(*);pwmWrite(*); может принимать значение 0..65535, против убогих 0..255. Это позволит ещё точнее управлять нашими двигателями, сервами и прочими девайсами, которые рулятся при помощи ШИМ; - Аппаратная работа с USB, чем не может похвастаться не одна Arduino плата стоимостью менее 2 долларов;
- Напряжение питания — от 2 до 3.6В(прямо таки заточено под 2 AA батарейки), против 2.7...5В у ардуино плат;
- Цены на момент написания статьи — 1.9 доллара против 1.8(алиэкспресс).
Очевидно, что отладочная плата на базе STM32 выигрывает по всём параметрам у Arduino Nano, исключением является разве что стоимость, но согласитесь 10 центов — хорошая цена за большую производительность, а про периферию, которой нафарширован STM32, так я вообще молчу, чего только стоят DMA или интегрированные в микроконтроллер часы реального времени.
Всё это в сумме делает данную плату крайне привлекательной во всём, кроме одного — новичку, как например мне, тема STM32 кажется слишком затратной по времени, есть целые сайты посвящённые программированию этих микроконтроллеров. А вот если подружить STM32 с Arduino IDE, то порог вхождения опускается до крайне низкого уровня. Хотя, как говориться, «В каждой бочке мёда, есть ложка дёгтя», но об этом чуть ниже.
Приступим к подготовке платы, для работы с Arduino IDE. Первое что необходимо сделать — залить в микроконтроллер специальный загрузчик, который позволит прошивать плату через аппаратный USB, причём прямо из среды разработки. Для этого необходимо перевести верхний джампер(он же «BOOT0»), в положение «1»:
Дальше нам понадобиться переходник с USB на UART. Стоит помнить, что STM32, это 3.3 В логика, совместимость с 5-ти вольтовой не гарантируется, поэтому рекомендовано использовать USB to UART, у которого есть возможность выбора режимов работы с 3.3/5В логикой. Я использовал дешёвый переходник на базе CH340G:
* как видно, производитель не стал заворачиваться со смывкой флюса, на работу, конечно, никак не влияет.
Плату подключил к USB to UART переходнику следующим образом:
G <-> GND;
5V <-> 5V;
PA10 <-> TXD;
PA9 <-> RXD.
* PA10/PA9 на плате подписаны просто как A10/A9 — эти порты являются первым аппаратным USART'ом, всего их на плате 3, так же тут 2 аппаратных I2C и 2 SPI.
Ради удобства запитал плату от 5 В, для питания от 3.3 В на плате есть пин «3.3». Внимание, 5 В может запросто вывести микроконтроллер из строя, так что уделите должное внимание подключению.
Качаем, устанавливаем и запускаем Flash Loader Demonstrator(есть в архиве к статье):
Выбираем номер COM-порта нашего переходника, в моём случае это COM43, потом нажимаем «Next»:
Так как у меня микроконтроллер новый, ещё
Жмём «OK»:
Так как моя отладочная плата основана на микроконтроллере STM32F103C8 — здесь 64 Кбайт Flash памяти, есть ещё STM32F103CB микроконтроллер, где в два раза больше Flash.
Дальше кликаем «Next»:
Опять «Next», и видим следующее окно:
Выбираем «Download to device» и жмём на "...":
Меняем тип файлов на *.bin и открываем файл «generic_boot20_pc13.bin»(тоже присутствует в архиве) который можно взять из проекта STM32duino-bootloader.
Дальше кликаем на кнопку «Next», после прошивки загрузчика мы увидим зелёный свет:
Потом надо скачать, для среды разработки Arduino IDE, специальное STM32 ядро(так же есть в архиве к статье).
Проверенна работоспособность ядра на Arduino IDE версии 1.6.9.
Дальше разархивируем содержимое по адресу Мои Документы\Arduino\hardware:
В моём случае полный путь выглядит вот так — «C:\Users\RSK\Documents\Arduino\hardware»
Разумеется, что система устройство определить не сумеет, поэтому надо ещё установить драйвера на плату. Заходим в папку «Мои Документы\Arduino\hardware\Arduino_STM32\drivers\win»(или «drivers\win», в случае архива к статье), и запускаем от имени администратора файл «install_drivers.bat»:
После этого верхний джампер(тот что «BOOT0»), переводим в положение «0» и подключаем плату к компьютеру через microUSB кабель:
Она должна в диспетчере устройств определиться или как «Maple DFU» или «Maple Serial (COM*)»:
Не совсем понятно почему после первого подключения плата определяется по-разному, на разных компьютерах, но не суть, приступаем к настройке Arduino IDE.
Запускаем среду разработки, дальше Инструменты -> Плата -> Boards Manager:
Здесь нужно установить ядро для платы Arduino Due. Выбираем последнюю версию и нажимаем «Install»:
Потом Инструменты -> Плата -> «Generic STM32F103C», дальше Variant: «STM32F103C8 (20k RAM. 64k Flash)», Upload Method: «STM32duino bootloader», Порт — номер COM-порта платы, вообщем всё как на скрине:
Всё, плата готова к прошивке и программированию в среде разработки Arduino IDE. Давайте прошьём какой-то скетч из примеров, которые «вшиты» в ядро, заходим Файл -> Папка со скетчами -> hardware -> Arduino_STM32 -> STM32F1 -> libraries -> A_STM32_Examples -> Digital -> Blink:
Классический «Hello World» в мире микроконтроллеров. Изменяем PB1 на PC13, так как светодиод, что на плате, подключен к этому порту:
* К стати, загорается он по низкому уровню на ножке PC13.
Нажимаем кнопку «Вгрузить», после прошивки среда разработки выдаст что-то типа:
«Done!
Resetting USB to switch back to runtime mode
error resetting after download: usb_reset: could not reset device, win error: Не удается найти указанный файл.».
Но прошивка то загрузилась успешно, хотя не всегда так, иногда Arduino IDE выдаёт другие сообщения.
«dfu-util — © 2007-2008 by OpenMoko Inc.
Couldn't find the DFU device: [1EAF:0003]
This program is Free Software and has ABSOLUTELY NO WARRANTY»
Это означает, что плату прошить не удалось.
«Searching for DFU device [1EAF:0003]…
Assuming the board is in perpetual bootloader mode and continuing to attempt dfu programming...»
И больше ничего не происходит, попробуйте в этот момент перезагрузить плату клацнув кнопку ресет. По аналогии это как с Arduino Pro Mini.
А теперь про «ложку дёгтя», о которой я писал вначале статьи, почему-то не всегда получается прошить плату в среде разработки, даже больше, она не всегда определяется компьютером. Я для себя это решил следующим образом, перед тем как загрузить прошивку(перед нажатием кнопки «Вгрузить»), клацаю «Reset» на плате, и после прошивки, ещё раз перезагружаю плату. В этом случае процент вероятности, что плата прошьется, равен 99%. Непонятно почему работает именно так, но факт. Думаю, что рано или поздно этот косяк поправят, и всё будет автоматом перезагружаться как нужно. А чтобы это быстрее поправили, надо чтобы комьюнити этой замечательной STM32 отладочной платы росла, поэтому делитесь этой статьей с друзьями, особенно с друзьями программистами.
По поводу распиновки:
(с) www.stm32duino.com/viewtopic.php?p=11137
К порту нужно обращаться по полному имени, например:
digitalWrite(PB0, LOW);
analogRead(PA0);
LiquidCrystal lcd(PB0, PA7, PA6, PA5, PA4, PA3);
Ещё рекомендую зайти на сайт docs.leaflabs.com/docs.leaflabs.com/index.html там есть много чего интересного по теме программирования в Arduino IDE, правда на английском языке.
Я порылся в файлах ядра, и нашёл один интересный файл:
Documents\Arduino\hardware\Arduino_STM32\STM32F1\variants\generic_stm32f103c\board.cpp
Там прописаны все порты, которые поддерживают:
- ШИМ, то есть функция
analogWrite();pwmWrite(); — PB0, PA7, PA6, PA3, PA2, PA1, PA0, PB7, PB6, PA10, PA9, PA8, а это далеко не все, которые размечены на распиновке чипа; - АЦП, аля analogRead(); — PB0, PA7, PA6, PA5, PA4, PA3, PA2, PA1, PA0.
Так что имейте это ввиду. Хотя этого более чем достаточно от платы, стоимостью в 1.9 доллара.
Ещё заметил, что пины PA12/PA11 подключены к D+/D- USB, их лишний раз лучше вообще не трогать, ибо чуть что, на кону не 2-х долларовый кусок стеклотекстолита с чипом, а материнская плата компьютера.
Схема отладочной платы:
Ну и на последок:
//https://github.com/mk90/LiquidCrystalRus
//STM32 в массы!
#include <LiquidCrystalRus.h>
LiquidCrystalRus lcd(PB9, PB8, PB7, PB6, PB5, PB4);
void setup() {
lcd.begin(16, 2);
lcd.print("Привет");
lcd.setCursor(0, 1);
lcd.print("geektimes.ru");
}
void loop() {
lcd.setCursor(14, 1);
lcd.print(millis() / 1000);
}
Ссылки:
Архив к статье;
Сайт товарища Roger Clark, посвящённый портированию STM32, вопросы/предложения/благодарности, всё туда;
https://github.com/rogerclarkmelbourne/Arduino_STM32;
http://docs.leaflabs.com/docs.leaflabs.com/index.html — именно этот проект был взят Роджером за основу, поэтому там много чего полезного, правда, на английском языке;
Arduino IDE версии 1.6.5-r5 скачать можно тут;
Моя статья, в какой-то мере пересекается с "STM32 vs Arduino" товарища RaJa ;
Даташит на STM32F103C8T6;
Все мои публикации на geektimes.
UPD 15.07.2016
Проверенна работоспособность ядра на Arduino IDE версии 1.6.9:
geektimes.ru/post/277928/#comment_9436620
P.S.
Тут почти ничего нет, стабилизатор и немного резисторов с конденсаторами.
Так же не рассказал, что дополнительно пропаивал microUSB разъем:
Потому что не особо внушала доверие пайка, точнее, её полное отсутствие.
Комментарии (97)
ElectricFromUfa
08.07.2016 07:02Интересно, из arduino ide возможно использовать, например, DMA и и всякие хитрые циклические режимы сбора с АЦП? Понимаю, что скорее всего нет, но всё же.
Как вообще проживает проект maple? Не забрасывают его разработчики?abstracto
08.07.2016 07:04+1maple помер давным-давным давно. у меня даже одна плата лежит которую я не могу использовать потому, что… винда x64 :/
HWman
08.07.2016 07:06Проект maple всё ещё жив благодаря товарищу Roger Clark, вот эго форум http://www.stm32duino.com/index.php
igor_suhorukov
08.07.2016 18:03Вроде как mbed сейчас успешно заменяет maple. Работал и с тем и с тем. Года 4 назад адаптировал maple bootloader для своей платы в STM32F103RBT.
Anthrax_Beta
08.07.2016 07:22+1По поводу отсутствия EEPROM частично не соглашусь. Да в явном виде она отсутствует, но у ST есть дока goo.gl/WKsbA3 в которой говорится как эмулировать EEPROM используя встроенную flash память.
melodictsk
08.07.2016 08:02Для использования со средой ардуино лучше использовать именно клоны Maple Mini а не обычные демоплатки, что бы не дёргать их вручную.
Не все библиотеки можно использовать в прямую, приходится допиливать на ходу.
На винде7 х64 всё живёт прекрасно.HWman
08.07.2016 08:30Клон Maple Mini стоит 5 баксов, а это почти как Arduino Mega 2560.
melodictsk
08.07.2016 09:40во первых стоит 4. Для разовых поделок это не имеет никакого значения. А если предполагается изготовление продукта большим количеством, то для отладки всё равно проще взять мэпл мини, отладить на ней без лишних танцев с бубном и потом эту прошивку закинуть уже на что подешевле.
ElectricFromUfa
08.07.2016 08:45Расскажите, что конкретно приходилось допиливать и с какими отличиями плат это было связано?
melodictsk
08.07.2016 09:51Платы идентичные (мэпл мини и минимальная отладочная), отличие только в распиновке и авторебут для заливки прошивки у мэпл мини.
У стм32 на ардуино иде i2c работает постоянно с глюками, особенно если использовать обе шины.
ШИМ другой, если использовать для чего то более серьёздного чем просто поморгать.
Надо несколько костылей для корректного использования ком порта через усб.
Вообще мой путь начинался с ардуино на авр, потом ардуино дуэ (арм), стм32. Начиная с арм, почти всегда приходится лезть в кишки библиотек и что-нибудь допиливать. Код постепенно обрастает ассемблерными вставками заточенными на проц.Winnie_The_Pooh
08.07.2016 09:58как Вы решили вопрос с глюками I2C?
melodictsk
08.07.2016 10:05Оооо, это великое колдунство… Неделя ковыряния и что-нибудь происходит и она начинает работать.
Сейчас у меня завис проект усилителя. Там темброблок управляется по и2ц, никак не могу победить. Похоже придётся переходить на авр :( и отказыватся от ряда функций.nafikovr
08.07.2016 11:09для ненагруженного i2c проще сделать софтовую реализацию.
melodictsk
08.07.2016 11:17От авр не подходит, те что для стм32 работают криво.
У вас есть опыт софт и2ц на стм32 в ардуино иде? Если есть нормальная рабочая либа?nafikovr
08.07.2016 11:19софтовая реализация достаточная для редкого чтения/записи нескольких байт пишется простым ногодрыгом за пол часа. какие еще либы тут нужны?
Sun-ami
12.07.2016 01:54Сталкивался с темброблоком, который не поддерживает 400КГц по I2C, только 100. Может в этом причина?
KonstantinSoloviov
08.07.2016 08:05ядро не работает на версиях среды разработки свыше 1.6.5
— это странно, у меня на 1.6.9 все работает, проверял буквально пару дней назад на чистой виртуалке.
Так же не понял танцев с загрузкой «STM32duino-bootloader» — в МК встроенный загрузчик есть, хотя тут не поручусь — т.к. со своей платой уже проводил эксперименты раньше.
В качестве отправной точки использовалась эта статья (похоже — перепечатка, но оригинала я не нашел)HWman
08.07.2016 08:19У меня ничего не компилируется на версии 1.6.7:
А встроенный загрузчик есть, он он не даёт возможность прошивать плату по аппаратному USB.KonstantinSoloviov
08.07.2016 08:52+1Вы хочите пруфов?
Их есть у меня! :)HWman
15.07.2016 03:51Действительно, на версии 1.6.5 библиотека OLED_I2C заработала:
Но LCD дисплей перестал выводить русские буквы. В версии 1.6.5 всё было гладко:
Заголовок спойлера
Alexeyslav
08.07.2016 14:40Загрузчик есть, но он слыхом не слыхивал про какую-то там ардуину, и ждёт совсем других протоколов для прошивки поэтому его надо менять.
Bismuth208
08.07.2016 09:06+2Есть чуть более простой способ.
Можно не прошивать загрузчик. Нужен ST-Link и тот же репозиторий от Роджера.
В папке с библиотеками (точнее в папке Arduino, где лежат библиотеки) создать рядом папку hardware и туда поместить все содержимое репозитория.
Настройка для 103С8T6:
Выбрать палату: Generic STM32F103C series
В опциях платы выбрать метод загрузки: STLink
На этом все, и не нужно будет мучатся с ресетом, устанавливать драйвера, прошивать загрузчик.
Бонусом на будущее будет программатор, но это будущее, и сами потом поймете зачем :)KonstantinSoloviov
08.07.2016 09:24ST-Link неизбежно появится у всех кто захочет чуть серъезнее заняться stm32 (- быстрая прошивка, отладка, незанятые пины), но в качестве задела сойдет и загрузка по uart
>На этом все, и не нужно будет мучатся с ресетом, устанавливать драйвера, прошивать загрузчик.
лукавите — драйвер понадобится уже для ST-Link'а )nafikovr
08.07.2016 11:12китайцы кстати торгуют вполне годными стлинками по 2-3 бакса. купил пол дюжины после того как один оригинальный помер после небольшого чиха.
Bismuth208
08.07.2016 11:25Да вы правы. Запамятовал, что под виндой ставились вместе с IAR. Под OSX ничего не ставил, а так как это было недавно, то и осталось в памяти.
Winnie_The_Pooh
08.07.2016 09:41+1У меня была проблема с аппаратным интерфейсом I2C. Раз в секунду читались датчики — первое чтение правильное, остальные ерунду давали.
dernuss
08.07.2016 09:58+1STM32F103C8T6 хитовый микроконтроллер, с отличной периферией по отличной цене.
Думаю лучше всё таки научиться программировать его с помощью обычных библиотек (HAL, SPL или libopencm3).
Тогда можно раскрыть все возможности микроконтроллера.
Ещё один хит от стм, это STM8S003, очень дешёвый. Применяю его там, где STM32 явно избыточны.
softmart
08.07.2016 12:38В STM32 есть BKPSRAM — 4 КБ энергонезависимой SRAM (питается от батарейки часов). Правда в моделях постарше, а не в бюджетном STM32F103C8T6.
dernuss
08.07.2016 12:48BKP register есть и в STM32F103C8T6, ну только их мало.
softmart
08.07.2016 12:51BKP register и BKP SRAM — разные вещи. С практической точки зрения сильно разные объемы (84 B и 4 КБ)
dernuss
08.07.2016 12:58Ну с практической да, объем конечно меньше. С другой стороны 84 байта, они есть:)
Всё зависит от задачи, я всего 1 байт использую, только для того чтобы флаг загрузчику передать.softmart
08.07.2016 13:05Я 4 KB использую как буфер значений датчика. При отключаниях питания буфер не стирается, этим гарантируется непрерывный мониторинг.
Ну и плюс в этих 4 KB хранится запись SytemHealth, там вся инфа о возникших ошибках/ассертах, срабатываниях вочдога и т.д. за все время работы. Очень помогает увидеть качество работы устройства в реальных условиях у заказчика. А то может быть ситуация когда девайс у заказчика перезагружается по вочдогу, а разработчик об этом никогда и не узнает.
madf
08.07.2016 16:52- сколько можно уже сравнивать устаревшие АТмеги и СТМ? Ближайший родственник ХМега и то приблизительный...
- У СТМ наиотвратительнейшая документация (против Атмеловской), с этим не раз соглашались сами разработчики на СТМ (и сам же производитель, выпустивший визард). По поводу Дунь: так вообще черный ящик, вы на СТМ одну только периферию замучаетесь настраивать, придется юзать всякие Кубы и полученные данные не сможете толком прикрутить к проекту, т.к. это уже другой уровень разработки, выходит, что если "дядя вася" не напишет готовую библиотеку, вы ничего сделать не сможете.
- Ценовой диапазон плат пока конкурентен...
- Чип весьма не маленький, для весьма простых задач — избыточно. Но да, поморгать светодиодиком можно.)))
HWman
08.07.2016 17:54Можно и квадкоптер сделать, при желании:
https://youtu.be/Ze6q6NidS5w?t=27madf
08.07.2016 18:12при желании можно и утюг включать, а квадры и на дуня/атмегах тоже делают) https://www.youtube.com/watch?v=Dk_ni3oX-KE
и в робототехнике используют: https://youtu.be/PL4174oBPTs?t=2m25s
и CNC/3D принтеры фигачат)))HWman
08.07.2016 18:49+1Вообщем как говорил Сократ, «Кто хочет, тот ищет возможности, а кто не хочет — причины».
nafikovr
08.07.2016 23:00ардуино в классическом виде даст на стм32 сделать ровно столько же, сколько и на авр. Если надо большего — нужно просто забыть об ардуино. А искать возможности сделать именно на ардуино — это как искать иголку в стогу сена при том что рядом стоит ведро с иголками
HWman
09.07.2016 00:54Как минимум 12-ти битный АЦП и 16-ти битный ШИМ на 12-ти портах, вот чем эта плата заметно отличается от Arduino плат основанных на AVR-ках.
Alexeyslav
10.07.2016 22:46+1Есть один такой интересный чип, для светодиодов предназначенный и с интерфейсом SPI — 24-битный ШИМ 12 каналов с 6-битной индивидуальной регулировкой тока по каждому выходу. И наращивай сколько хочешь таких выходов… интерфейс ведь SPI.
HWman
11.07.2016 03:28Конечно есть, но это ведь отдельная железка, тем более, как Вы говорите, специализированная.
А так, всё под рукой и на одной платке.Alexeyslav
11.07.2016 08:38+1Так и эти чипы можно развести на одной платке, сколько душе угодно а не строго фиксированное количество.
nafikovr
11.07.2016 07:46если для 12-бит АЦП я применения еще и смогу найти, то для 16-бит ШИМ — вряд ли.
Alexeyslav
11.07.2016 10:04+1Управлять светодиодами, 8 бит довольно мало — слишком заметный шаг между уровнями что сразу становится заметным на плавных переходах яркости. А 16 бит уже позволяет развернуться.
nafikovr
11.07.2016 10:11хм. при наличии гамма-коррекции 8 бит обычно хватает.
Alexeyslav
11.07.2016 11:49Гамма-коррекция делает переходы ещё сильнее, и она нужна будет в любом случае.
HWman
11.07.2016 12:20Как я говорил в ролике — цифровой ЛБП может получится отличный.
nafikovr
11.07.2016 13:56в ЛАБОРАТОРНЫЙ блок питания можно думаю и на цап раскошелиться.
HWman
11.07.2016 16:37Посмотрим, я то всё не перестаю думать про тему ЛБП на этой STM32 плате…
nafikovr
12.07.2016 07:52вообще я для себя решил что цифровой лабораторник плохая идея, особенно самодельный. пользуемся rigol dp832 только когда нужны конкретно фишки цифрового, в других случаях берем аналоговых собратьев ибо удобнее.
GarryC
11.07.2016 14:39«интегрированные в микроконтроллер часы реального времен» — не следует некритически повторять неудачные фразы из рекламных листовок, нет их там.
dernuss
11.07.2016 16:13+1Странно, а в даташите написано что есть.
Да и народ вроде как использует http://golf2109.blogspot.ru/2014/05/backup-domain-control-register-rccbdcr.htmlSun-ami
11.07.2016 16:27+2RTC там есть, но упрощенные, по сути — микропотребляющие генератор и 32-битный счётчик с предделителем, с возможностью отдельного питания от батареи. Вопрос только в том, можно ли это считать RTC. По определению которое даёт википедия — нельзя. Но я считаю — можно, раз это специально предназначено для счёта реального времени.
GarryC
11.07.2016 17:07DS12887 — вот это часы реального времени, то есть собственно модуль счета времени, модуль учета даты, таймер прерываний, и, конечно же, модуль переключения питания + встроенная резервная батарейка на весь срок службы (10 лет).
Sun-ami
11.07.2016 18:03+2На самом деле представление времени в виде 32-битного или 64-битного числа секунд даже удобнее. Когда нужно выполнять какие-либо расчёты времени — его всё равно придётся преобразовывать к этому формату. Такой формат компактен и потому удобен для меток времени в логах. Кроме того он избавляет от заморочек с переводом времени — привязываемся к UTC и тогда временные уставки и таймстампы не сбиваются при переводе часов. А для конвертирования можно использовать стандартные функции C, лучше 64-битные чтобы избежать проблемы 2038 года. Мне RTC в STM32F1xx нравится даже больше чем «полноценные» RTC в STM32F2xx и STM32F4xx — они более универсальны, их можно настроить так чтобы считать и доли секунды. А регистр будильника и прерывание есть и там и там.
dernuss
11.07.2016 21:43DS12887A со встроеным кварцем и батарейкой вероятно хорошая… микросборка. Но! Она дорогая и большая.
Sun-ami
Всем хорош STM32, одно плохо — EEPROMа в нём нет. Ну и не все порты 5 вольт-толерантны, да и нагрузочная способность у портов меньше.
HWman
Sun-ami Ну… По поводу нагрузочной способности, я бы не сказал что всё так плохо:
У ATmega328, если мне не изменяет память, столько же.
А вот отсутствие EEPROM — да, смущает немного. Хотя слыхал про Backup Domain:
http://mcu8.ru/wp-gull/mylinks/2012/04/08/stm32-sohranenie-parametrov/
Пока что не разобрался особо, но как понял — специальная память, которая питается от отдельного источника, например как ионистора, и в паре с часами реального времени она себе работает и кушает какие-то микроамперы.
LineAir
Отсутствие EEPROM компенсируется циклической записью во FLASH (под 1 байт полезной информации резервируется, например, 10 байт памяти, зависит от частоты записи и срока службы), благо флеш-памяти на STM32 хватает.
Специальная память — это Backup registers (BKP). Позволяет хранить 84 байта, пока имеется питание на Vbat.
nafikovr
да не так то уж и много этой флеш памяти в конкретно этой стмке. что не делай, но бинарник получается поувесистее чем на той же меге и 64кб на стм32 сравнимы с 32кб на меге.
LineAir
Все, в конечном счете, зависит от задачи, которую необходимо решить микроконтроллером. Хорошо, когда выбор есть и обоими инструментами умеешь пользоваться.
LineAir
Память не единственный решающий параметр. Например в этом STM32 есть USB, он и дороже поэтому. Есть STM32F100 без USB, памяти столько же, + еще есть ЦАП и дешевле, чем ATMEGA328.
nafikovr
речь идет о плате, которая целиком дешевле чем эта же стмка с usb в рознице
compdemon
А сколько ее надо, той EEPROM (объем)?
Конечно, удобно когда «на борту», но если «стремно» за флеш и нужно долговременно хранить данные можно прицепить внешнюю EERPOM по, например, I2C и нужные данные хранить там.
Microchip-Technology 24AA08T-I-OT
Memory Type EEPROM
Memory Size 8K (4 x 256 x 8)
Speed 100kHz, 400kHz
Interface I?C, 2-Wire Serial
Voltage — Supply 1.7 V ~ 5.5 V
Operating Temperature -40°C ~ 85°C (TA)
Package / Case SC-74A, SOT-753
розница порядка $0,23 за штуку.
Sun-ami
Прицепить конечно можно, но здесь речь идёт о девайсах, собираемых из дешевых готовых плат, без пайки. К тому же I2C — это дополнительные сложности. Ниже по теме описано как народ отказавшись от аппаратного ST-шного I2C свои чисто программные реализации пишет. Я тоже сталкивался с тем, что при сбоях в обмене по I2C с термодатчиком DS1621 удаётся восстановить обмен с ним только вручную, переводя линии I2C в режим GPIO (хотя это — недостаток DS1621).
compdemon
Про проблемы с I2C тоже видел ниже. Но не совсем понял — это конкретно глюк аппаратной реализации у STM/конкретного МК, или это все же недоработка библиотек ST-DUINO? В первое не сильно верится.
Касательно дешевых плат — за все в этой жизни приходится платить. :) Тем более, что все же в МК есть флеш-память.
Если без пайки — в принципе, есть EEPROM-шилды для ардуины с Serial-интерфейсом. Конечно по цене получается сравнимо с самой платой (где-то от $1,6 и до наглости продавца), зато EEPROM, шилд (без пайки) и объем 128-256 кбит, хватит надолго. Их еще часто и каскадом несколько штук можно прицепить.
Для прототипирования покатит, а в готовом девайсе развести память которая подходит.
Sun-ami
С другими микросхемами (EEPROM, цифровые потенциометры, усилитель) у меня проблем с I2C не было. И испытания на ЭМС нормально проходит. Я использую свой драйвер на основе драйвера из SPL. Так что дело, похоже, не в железе. Хотя с F103 я не работал, у меня F217, F407, F427
nafikovr
а при чем тут EEPROM? вы наверно веткой ошиблись.
compdemon
Почему ошибся? Выше есть «претензия», что у STMок нет EEPROM.
Но во-первых у них есть флеш, а во-вторых, если нужен именно EEPROM для долговременного хранения неких данных, а ограничения по количеству перезаписей флеша встроенного в МК мало, то есть микросхемы внешнего EEPROM, которые при необходимости можно прицепить по I2C или SPI. Если брать чисто микросхему, то микруха будет от $0,2 за 8Кбит за голый чип (правда не в самом удобном для новичков корпусе) до $1.5 за ардуино-совместимый «шилд» на 256 Кбит. О чем я и написал.
Sun-ami
Насчёт нагрузочной способности я конечно придрался, но все же нужно иметь ввиду — у ATmega328 максимальный ток порта — 40 мА и 200 на чип.
HWman
40 это абсолютный максимум, долго порт так не проработает ;)
Pakila
Вместо EEPROM в STM32 можно использовать Flash.
HWman
Pakila А как насчёт энергонезависимости?
Pakila
Flash не трбует питания для хранения данных, это часть памяти программ. Flash хуже eeprom только по циклам перезаписи.
ElectricFromUfa
С Flash другие нюансы.
— Меньший ресурс, чем у eeprom.
— Необходимость писать блоками, даже если нужно записать 1 байт
LineAir
Меньший ресурс — да, но компенсируется объемом.
1 байт, действительно, не запишешь. Но во флеш можно писать по 2 или 4 байта за раз. А вот чтобы стереть 1 байт, необходимо стирать всю страницу (1кБ или 2кБ). Ниже Anthrax_Beta уже дал ссылку на апнот AN2594 — там есть методика, как использовать флеш вместо eeprom.
zloe_morkoffko
EEPROM есть, но в L1 серии (и L0 вроде)