Evgeniy1294 (21.01.2018 20:50 - 20:53, просмотров: 135) ответил Скрипач на А не мелковата абстракция?
Я так и делаю. Даже проще:
void COMMON::initCommon();
void COMMON::initCommon()
{
InitUSART();
// Ещё что-нибудь
}
void COMMON::init_usart()
{
RCC->AHB1ENR |= RCC_AHB1ENR_GPIOAEN | RCC_AHB1ENR_GPIOGEN;
// 1 - RS-422 "for command"
// 1.1 - Тактуем блок
RCC->APB2ENR |= RCC_APB2ENR_USART1EN;
// 1.2 - Настраиваем ноги
GPIO::pincfg_alternate(GPIOA, GPIO::PIN::PIN_8, GPIO::AF::USART_1, GPIO::OTYPE::PP, GPIO::OSPEED::HIGH, GPIO::PULL::FLOATING);
GPIO::pincfg_alternate(GPIOA, GPIO::PIN::PIN_9, GPIO::AF::USART_1, GPIO::OTYPE::PP, GPIO::OSPEED::HIGH, GPIO::PULL::FLOATING);
GPIO::pincfg_output (GPIOG, GPIO::PIN::PIN_8, GPIO::OTYPE::PP, GPIO::OSPEED::LOW, GPIO::PULL::FLOATING);
// 1.3 - Настраиваем USART
USART::init(USART1, 19200, USART::PARITY::NONE, USART::STOPBIT::STB_1);
// 2 - RS-422 "for servo"
// 2.1 - Тактуем блок
RCC->APB2ENR |= RCC_APB2ENR_USART6EN;
// 2.2 - Настраиваем ноги
GPIO::pincfg_alternate(GPIOG, GPIO::PIN::PIN_9, GPIO::AF::USART_6, GPIO::OTYPE::PP, GPIO::OSPEED::HIGH, GPIO::PULL::FLOATING);
GPIO::pincfg_alternate(GPIOG, GPIO::PIN::PIN_14, GPIO::AF::USART_6, GPIO::OTYPE::PP, GPIO::OSPEED::HIGH, GPIO::PULL::FLOATING);
GPIO::pincfg_output (GPIOG, GPIO::PIN::PIN_7, GPIO::OTYPE::PP, GPIO::OSPEED::LOW, GPIO::PULL::FLOATING);
// 2.3 - Настраиваем USART
USART::init(USART6, 19200, USART::PARITY::NONE, USART::STOPBIT::STB_1);
return;
}
Выглядит страшненько, но удобно. Работает быстро. Конечно, медленнее, чем записать нужную комбинацию бит в регистр. Подобные функции выполняются, как правило, один раз на этапе инициализации МК и на скорость работы не влияют. В критичных местах, например в прерываниях, я нужные комбинации пишу напрямую в регистры.