Необходимо отталкиваться от того, что вам важнее, а также от
личного восприятия проблемы: 1) Можно сгуппировать IO по портам и проинициализировать в одном месте - будет как минимум оптимально. Я также вижу в этом системность.
2) Можно проинициализировать в разных местах вместе с соответствующей периферией. Будет не оптимально, но вполне системно.
3) Можно сделать как в кубе
/*Configure GPIO pin Output Level */
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_4, GPIO_PIN_RESET);
/*Configure GPIO pin : PA4 */
GPIO_InitStruct.Pin = GPIO_PIN_4;
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
И так много раз. Это системно или оптимально?
4) Можно сделать традиционно
InitPin( pin, port, parameters...)
И так много раз. Не знаю, системно это или оптимально, но точно лучше, чем (3).