16+
Пятница
6 декабря
Вход |Карта сайта |Upload |codebook | PARTS

 О смысле всего сущего 0xFF

 Средства и методы разработки

 Мобильная и беспроводная связь

 Блошиный рынок Объявления

caxapa

Микроконтроллеры ARM 

AVR PIC MSP PLD,FPGA,DSP 

Кибернетика Технологии 

Схемы, платы, компоненты 

ARM-контроллеры

 
Новая темаПравила РегистрацияСтатистика Архив
Вернуться в конференциюТопик полностью
evgeniy1294  (28.07.2019 16:55, файл(ы), просмотров: 2349)
Начал активно пилить свою либину под 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 на моей либине, оттестирую готовый функционал и открою репу.
Прикреплённые файлы:
usart.hpp (23 K)
Главная | Карта сайта | О проекте | Проекты | Файлообменник | Регистрация | Вебмастер | RSS
Лето 7528 от сотворения мира. При использовании материалов сайта ссылка на caxapу обязательна.
MMI © MMXIX