У вас у всех лажа, только мой вариант правильный :-) А если у меня AVR? Где в нем GPIOB, GPIO_MODE_OUTPUT_2_MHZ ????
Такие вещи не должны торчать на верхнем уровне, их надо скрывать ниже. И мне-таки это удалось :-)
Имеется код для работы с GPIO через функции, где пины задаются через pin_id. Можно работать как с пинами, так и с ШИНАМИ
Имеется код для работы с GPIO через макросы, где пины задаются через ИМЕНА пинов. Аналогично - можно работать с пинами и с ШИНАМИ.
Все режимы настройки GPIO тоже унифицированы, их наличие/отсутствие может быть проверено на верхнем уровне препроцессором.
Так что и для STM, и для AVR и т.д. код работы с GPIO выглядит одинаково. А эффективность кода полностью совпадает с эффективностью прямой записи в регистры.
Все специфичные для конкретного семейства МК настройки спратаны на нижнем уровне, и там ими можно очень гибко рулить.
Вот так вот :-)