Библиотека 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.
Свежие комментарии