Начал активно пилить свою либину под stm32mp15x, которая должна предоставить программистам три отдельных модуля для разработки своего ПО: 1) mcu - написан на чистом CMSIS, за счет чего туп и прост в понимании. Содержит в себе функционал для настройки периферии в нужный режим и разное полезное.
2) hal - набор более высокоуровневых инструментов, построенных на mcu. В основном это конечные автоматы для удобного взаимодействия программной и аппаратной части, например порты (usart, spi, i2c).
3) Различная полезная алгоритмика, типа алгоритмов расчета контрольных сумм, простенькие шаблонные фильтры, криптография типа AES и т.д.
Пока я сделал следующие модули для mcu: isr, clk, gpio, usart; сделал примеры для работы с модулями, в сегодня-завтра закончу тесты и открою репу. В планах на следующую неделю dma, spi, переделка startup'ов, и таймеры.
Сейчас у меня отпуск, который благодаря ипотеке я проведу дома, так что я решил немного поэкспериментировать. Хочется сделать наиболее удобный интерфейс для пользователей, во вложении то, что у меня получилось для usart.
Основными являются функции Init, например mcu::usart::async::Init(), в которые передаются либо ссылка структуру-инициализатор, либо просто набор параметров, если их не много (<6)
struct InitStruct
{
USART_TypeDef* USART; // Например USART1
uint32_t Fbus; // Модуль clk знает частоты на шинах
uint32_t baudrate;
DataBits databits;
Parity parity;
StopBit stopbit;
FlowControl flow_control;
};
void Init(InitStruct& i);
Дополнительный функционал, который редко используется, например tx/rx swap, решил вынести в отдельные inline-функции, напоминающие LL:
template<bool swap>
inline void SwapTxRxLine(USART_TypeDef* U)
{
if constexpr (swap)
U->CR2 |= USART_CR2_SWAP;
else
U->CR2 &= ~USART_CR2_SWAP;
}
Шаблоны выбраны, чтобы сократить число функций, так как благодаря им не нужны отдельные фунции enable/disable. Синтаксис при этом простой:
SwapTxRxLine<true>(USART1);
SetUsartState<true>(USART1); // Включить usart
SetUsartState<false>(USART1); // Выключить usart
Никакого overhead при этом нет, за счет constexpr, однако есть одно НО(!): я не стал выносить в LL функции, реализуемые в других функциях. Например функции SetBaudrate нет, потому что эту задачу выполняет Init, хотя вдруг это кому-то нужно?
Вообщем, критикуйте, оценивайте, советуйте. Более полная картина будет во вторник/среду, когда я проверю работу doxygen на моей либине, оттестирую готовый функционал и открою репу.