20.03.2011

Кленовый лист

Maple - еще одна ArduinoCompatible плата - на этот раз, не совсем обычная.


Авторы-разработчики Leaf Labs использовали в качестве MCU STM32F103RB, 32-битный контроллер с ядром ARM Cortex-M3. Разумеется, ни о какой совместимости бинарных файлов речи идти не может; но благодаря использованию проектом базовых библиотек Arduino, удалось добиться неплохой совместимости. 

MCU

В отличие от 8-битных AVR, процессор Maple оперирует только 32-битными числами. Казалось бы: подобное расточительство приводит к учетверению объема необходимой памяти. Но если часто используются операции над величинами, которые не умещаются в один байт (например, отсчет АЦП или числа с плавающей точкой), то может случиться значительный выигрыш в быстродействии.

Характеристики микроконтроллера:
  • 64 пина, тактовая частота 72МГц, напряжение питания 2,0..3,6В
  • 128KB флеш-памяти
  • 20KB внутренней SRAM 
  • всего 38 GPIO
  • два 12-битных  АЦП, до 16 каналов
  • два интерфейса i2c (SMBus/PMBus)
  • интерфейс CAN 
  • три USARTS
  • два SPI
  • поддержка USB
Последний пункт означает, что на плате нет отдельного чипа USB - для загрузки используется специальный maple-bootloader, представляющийся системе в виде DFU-устройства (по этой причине под Windows требуется установка драйверов).

Пины ввода-вывода умеют подтягиваться не только к Vcc, но и к GND, а также вообще пребывать в режиме открытого стока - что существенно облегчает стыковку со схемами, имеющими иные логические уровни.

Таймеров - целых четыре штуки, ими можно управлять вполне осознанно. Это почти не мешает поддержке PWM: он не будет работать только на пине D10.

EEPROM отсутствует как класс, и авторы пока не решили, как правильно обеспечить совместимость с Arduino - то ли обеспечить эмуляцию записью во все тот же flash, то ли навесить дополнительную микросхему. Пока же есть отдельные решения от энтузиастов.

Board design


Плата выглядит довольно компактной, но за это пришлось заплатить 4-х слойным дизайном. Расположение пинов совместимо с Shield-платами Arduino, за исключением AREF - вместо него выведен дополнительный GPIO - D14. К верхним пинам дан дублирующий ряд отверстий с шагом 0.1" - прямо как в Seeeduino.

Питаться плата может от внешнего источника 7-18В (традиционный защитный диод присутствует), либо от USB, либо от литиевого аккумулятора со стандартным напряжением 3,7В - выбирается при помощи джампера. Аккумулятор можно подзаряжать от доступного источника, для этого также есть джампер и даже индикаторы заряда:


(маленькая квадратная микруха рядом с батарейным разъемом - это контроллер заряда аккумулятора).

В середине платы посадочное место для колодки JTAG. Очень мудрое и дальновидное решение для тех, кто собирается отлаживаться "по-взрослому". Кстати, такого понятия, как ISP-программирование для STM32 не существует (в отличие от AVR, когда в ATmega1280 есть одновременно и ISP, и JTAG).

В дополнении к сбросу, добавлена одна лишняя кнопка:


Учитывая питание от 3.3В, размер пассивных элементов - 0402. 

IDE


На момент написания статьи была доступна IDE на основе ArduinoIDE 0018. В качестве типа платы предлагается дла варианта - Maple Flash или Maple RAM. Разница - в скорости загрузки результата компиляции скетча и его перманентности. Загруженное в RAM будет забыто сразу после отключения питания, зато загрузка произойдет быстрее, чем во flash.

Но самая главная модификация скрыта от глаз пользователя, а именно - AVR toolchain заменена на аналогичную, но для ARM. В данном случае, это все тот же gcc от CodeSourcery для таргета ARM EABI (arm-non-eabi-gcc). 

Синтаксис

Ничего принципиального в синтаксис не превносится, однако надо помнить, что:
  • большинство базвых функций Arduino, которые возвращали 16-битное значение, в Maple вернут 32-битное;
  • pinMode принимает немного другие режимы работы - любой из пинов может быть OUTPUT, OUTPUT_OPEN_DRAIN, INPUT_FLOATING, INPUT_PULLUP, INPUT_PULLDOWN. Плюс - дополнительные режимы пинов с возможностью ШИМPWM и PWM_OPEN_DRAIN, а также пинов АЦП - INPUT_ANALOG;
  • последовательных портов - 4 штуки, почти как в Mega, но использовать просто Serial нельзя - всегда надо уточнять номер - Serial1..Serial3;
  • ШИМ в Maple 16-битный, это важно учитывать при задании константы в analogWrite() - отныне 255 не является граничным значением, используйте диапазон 0-65535;
  • АЦП возвращает 12-битные значения - следовательно, вместо диапазона 0-1023 мы будем получать 0..4095. 
Как видите, отличий довольно много. Но если требуется обработка данных на скорости, которую Arduino не в состоянии вам предоставить - Maple выглядит более привлекательным. При портировании скетчей и тем более библиотек придется потрудиться, но уверен, что в результате все получится ;)

8 комментариев:

  1. "GPIO переключаются на частоте до 18МГц" - уверены?

    ОтветитьУдалить
  2. Спасибо! (перепутал с максимальной скоростью SPI)

    ОтветитьУдалить
  3. Еще есть тоже похожий проект NetDuino - тоже 32бит контроллер и заточенный под .Net Micro Framework

    ОтветитьУдалить
  4. а какое-нибудь тестирование платы будет проводиться?

    ОтветитьУдалить
  5. Smit, могу включить в список авторов - сможете написать статью сами и порадовать заодно других читателей ;)

    ОтветитьУдалить
  6. Я к сожалению в этом деле совсем слабо разбираюсь. Так попробовал и забил и teensy и arduino валяются теперь без дела. Да и с программированием туго дела обстоят.

    ОтветитьУдалить