Библиотека StdPeriph от ST окончательно перестала удовлетворять меня своим неудобным синтаксисом и тем, что на все эти настройки тратится много времени. Стыдно сказать, у меня даже есть файл-шаблон, где сложены все основные примеры настройки нужной мне периферии — но конечно, назвать это профессионализмом нельзя. Поэтому я пишу библиотеку itacone для упрощения всех этих взаимодействий.

Репозиторий на GitHub — itacone.

Я попытался совместить в ней простоту использования функций (прости, господи) Ардуино, немного синтаксического сахара в стиле javascript и конечно, не забыл о читаемости кода и удобстве применения.

Вся платформо-зависимая часть кода (адреса портов, разнообразие периферии) вынесена в отдельный файл конфигурации. В свою очередь, различные конфигурации подключаются в зависимости от имени ядра, объявленного в начале файла. Поэтому для перехода на другое ядро будет достаточно его объявить — и всё произойдёт автоматически.

Все нужные переменные уже доступны — подключаете модуль itacone.h и имеете переменные для всей периферии.

На текущий момент полностью сделан модуль GPIO. Он даёт возможность настраивать пины на вход/выход, писать и читать из них.

Допустим, вы хотите помигать штатным светодиодом на плате STM32Discovery. Для этого достаточно написать:

PC8.mode(OUTPUT).low();
while(1) PC8.toggle().delay(300);

И это всё! Просто, правда?

Есть все нужные функции, а для часто используемых функций (чтение/запись в пин) предусмотрены короткие легкозапоминаемые ссылки. Распишу подробнее.

Модуль GPIO

Сначала — настройка порта. Реализованы все возможные режимы его использования.

Параметры настройки входа/выхода

OUTPUT_PP — выход в режиме пуш-пулл.

OUTPUT_OD — выход с открытым коллектором.

OUTPUT_AF_PP — выход периферии в режиме пуш-пулл.

OUTPUT_AF_OD — выход периферии с открытым коллектором.

INPUT_AN — вход для АЦП.

INPUT_FL — «плавающий» вход, или третье (высокоимпедансное) состояние.

INPUT_PU — вход со слабой подтяжкой к «+».

INPUT_PD — вход со слабой подтяжкой к «-«.

Параметры скорости выхода

SPEED_2 — максимальная скорость переключения пина — 2МГц.

SPEED_10 — максимальная скорость переключения пина — 10МГц.

SPEED_50 — максимальная скорость переключения пина — 50МГц.

Далее — вывод в пин. Для этого — функция pin.out(LOW HIGH) а также более простые pin.high(), pin.low() и pin.toggle().

Чтение состояния пина — так же просто: функция pin.in().

Удобной особенностью является то, что можно строить цепочки запросов:

PC8. mode(OUTPUT). high() .delayMs(300). low(). delayMs(500). mode(INPUT). read(&a). delayMs(1000). read();

В этом примере мы назначаем пин PC8 «выходом», на 300 миллисекунд выводим в него «1», потом на 500 миллисекунд выводим «0», переводим пин во «вход» и читаем его значение в переменную a, а через секунду — снова читаем состояние и возвращаем его в переменную b.

Это удобно, например, для выполнения в цикле.

Модуль misc

В этом модуле собраны разные вспомогательные функции, необходимые для работы библиотеки, а также пользовательские функции, не вошедшие в другие модули.

Среди них — функция паузы delayMs(ms).

Также есть функции для получения уникального номера микроконтроллера, зашитого внутри кристалла при производстве. Это три функции Unique_ID_Low, Unique_ID_Mid и Unique_ID_Hig, возвращающие 32-битное значение (компоненты 96-битного номера устройства) и две функции Unique_ID_Low0 и Unique_ID_Low1, возвращающие две 16-битные компоненты номера ID_Low. Полный номер устройства — это три значения Low, Mid и Hig, однако для большинства применений достаточно первого из них, и для удобства он разделён на две 16-битных части.

В ближайшем будущем планирую также добавить модуль таймера и USART.