Это-ж надо так вывернуть...
Для авр в среде ардруино, с их родной ID - включено всё. Буквально всё что можно уже оптимизировано по самые гланды. Функции простые и понятные, без возможности дальнейшего улучшения - но зато всегда работающие безотказно.
Но всё это становится совершенно бесполезным при использовании cortex чипа, например от ST. Не получается простых функций, хоть тресни.
При этом писать и читать код получается проще если он написан с использованием прямого обращения к регистрам, через cmsis и самый важный и жирный файл - CMSIS Cortex-Mх Device Peripheral Access Layer Header File.
В отличии от надстроек типа древнего spl и более современного hal - названия регистров, а так-же их содержимое - остаётся неизменным во всей линейке чипов st. Есно количество самих регистров может меняться, но названия не меняются!!! Если появляется что-то новое - оно будет иметь уникальное имя.
HAL имеет уже пятый релиз по счёту, каждый раз с глубокой переработкой. Причём он получается разный для M0-7. Так-что писать что-то переносимое на нём - особо бесполезно. Фактически - он годен для кубика, создать проект и отследить все что данный код делает с чипом.
В ардруино то-же самый hal не лезет чисто физически, это получится абстракция над абстракцией. Безумное количество вложений #define , за которое уже хочется убивать голыми руками.
Как это на регистрах для ARM
GPIOC->BSRR = 1<<(13); // установить бит 13 в 1 порта С
GPIOC->BSRR = 1<<(13 +16); // сбросить бит 13 порта С
GPIOC->BSRR = (1<<(12 +16)) | (1<<(9)); // сбросить 12 и установить 9 порта С
temp = GPIOC->IDR; // прочитать весь порт
GPIOC->ODR = temp; // записать весь порт
Код не имеет смысла, он всего-лишь показывает разницу между средой ардруино и ARM.