Эксперимент с прикручиванию к дешевым микроконтроллерам ATTiny загрузчика и среды разработки Arduino был достаточно удачным. Конечно, с AVR неплохо живется и без Arduino. Но хорошо, когда есть возможность выбора. А потом я вляпался в STM32 и заковырялся в библиотеках и громоздких конструкциях инициализации портов. Спасением ARM-«чайника» стал проект ARM mbed. Лично мне он позволил просто взять и начать работать с STM32.
Но мигать светодиодом на плате Nucleo надоело очень быстро. Отложил я ее, ибо слишком много ножек и наворотов, и взялся за Maple Mini (STM32F103CBT6 с минимальной обвязкой). Тоже все довольно легко и просто — сервоприводы крутятся, датчики работают, экранчики показывают — все популярные библиотеки, знакомые ардуинщикам, в mbed имеются.
А третий заход отчасти повторял «Arduino за 1$». О нем я и расскажу подробно. Идея такая: хочу ARM за копейки. Открываю Aliexpress и нахожу STM32F030F4P6 за 55 центов за штучку при покупке пучка (10 чипов).
Данный чип кажется весьма неудобным для кустарного использования, поскольку выполнен в корпусе TSSOP20. Но это даже интересно, поскольку DIP-корпуса распаивать уже скучно, а сверлить отверстия в плате — лениво. Можно, кстати, использовать переходные платы TSSOP-DIP, но пока я ждал заветный китайский пакетик, сделал свою.
Помимо самого контроллера, на платке (односторонней) размещаются кварцевый резонатор, два конденсатора, три резистора и один джампер. Отдельно выведены пины для подключения отладчика. Стабилизатор напряжения питания ставить пока не стал, поскольку устройство сугубо тестово-демонстрационное, для коллекционирования граблей и как proof of concept. Главное — не подать 5 вольт питания.
Mbed не поддерживает «из коробки» STM32F030F4P6, ближайшим родственником будет Nucleo-F030R8. Эта плата и выбирается как целевая платформа. А модифицированную версию библиотеки mbed добрый человек уже сделал. Так что, здесь обошлось без неприятностей.
Испытания
Тут, по идее, должно было быть восторженное описание процесса портирования легендарного Blink. Но нет, пусть тест будет немного посложнее, тем более, что автор модифицированной библиотеки пишет, что работа SPI не протестирована. Так что, собираю на «хлебной» макетке конструкцию из платы, китайского OLED-дисплея (128х64) и модуля питания, подключаю самопальный ST-Link (в корпус я его так и не засунул, но хотя бы нужные элементы напаял непосредственно на плату) и собираю из кирпичиков код прошивки.
Кирпичики такие:
1. Модифицированная библиотека mbed. Не забываю удалить из проекта дефолтную.
2. Библиотека SSD1306 — для работы с дисплеем. Я в нее добавил русский шрифт (коды стащил отсюда), но в данном проекте не применял, ограничившись выводом растрового изображения.
3. Примитивнейший main.cpp.
Растровое изображение подготовлено с помощью утилиты LCD Assistant. Полезнейшая в хозяйстве вещь, скармливаешь ей однобитный bmp-файл, а она выдает в текстовом виде байтовый массив, пригодный к употреблению в C.
А дальше все почти как в Arduino:
/*
Китайский 0.96 128х64 OLED.
SPI_MOSI=PA_7 SPI_MISO=PA_6
SPI_SCK =PA_5 SPI_CS =PB_6
SPI_CS нет в STM32F030F4, используем PB1
*/
#include "mbed.h"
#include "ssd1306.h"
#include "standard_font.h" // высота 8, ширина 6 (21 столбец)
#include "bold_font.h" // высота 8, ширина 8 (16 столбцов)
#include "russian_font.h" // experimental
// настройка LCD Assistant: Byte orientation - horizontal, остальное по дефолту
const unsigned char habr [] = { массив я удалил, чтобы место не занимать };
SSD1306 oled(PB_1 /* cs */, PA_4 /* reset */, PA_3 /* dc */, SPI_SCK /* clock */, SPI_MOSI /* data */);
int main()
{
oled.initialise();
oled.clear();
oled.set_contrast(100); // 255 max contrast
oled.drawBitmap(0, 0, habr, 128, 64, 1);
oled.update();
}
// EOF
Компилирую, скачиваю бинарный файл прошивки, заливаю в контроллер с помощью ST-Link Utility и получаю требуемый результат. К сожалению, проблем, достойных описания, не возникло.
Впрочем, начудить я умудрился — два раза ошибся в разводке платы. Зачем-то подтянул NRST (сброс, активный уровень — низкий) к земле. И расстояние между гребенками сделал такое, что плата в макетку нормально не вставляется, только с приложением пары ласковых и физической силы.
Итого
Бюджетнейший 32-битный ARM-микроконтроллер STM32F030F4P6 стоит чуть более половины доллара. При этом — 4 килобайта оперативной памяти и 16 — флеша. Обвязка — наверное, еще рублей 20, но ее можно сократить, убрав все «лишнее» вокруг пина BOOT0. Среда разработки mbed намного проще в освоении новичку, если сравнить с теми же IAR, Keil или Coocox, но при этом не страдает чрезмерным примитивизмом Arduino IDE. К тому же, на локальном компьютере нужно установить только ST-Link Utility, исключается возня с компиляторами.
Резюмирую: очень понравилось. Считаю возможным и нужным рекомендовать mbed для освоения новичкам в области микроконтроллеров. Паять TSSOP не обязательно, можно приобрести плату Nucleo или любую другую поддерживаемую, вплоть до дешевых «минимальных» китайских поделок за 3.8$.