ВходНаше всё Теги codebook 无线电组件 Поиск Опросы Закон Пятница
29 марта
936463
evgeniy1294 (28.07.2019 16:55, просмотров: 14591)
Начал активно пилить свою либину под 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 на моей либине, оттестирую готовый функционал и открою репу.