Всем привет, пробовал кто-нибудь в процессе работы переконфигурировать GPIO со входа на выход и обратно? Как лучше это сделать?
Пробовал. Элементарно.
В регистр MODER записываешь или 00 на нужный вывод для входа, или 01 для выхода.
Главное, меняя какие-либо биты регистра, не изменить все остальные. И сами регистры зависят от конкретного контроллера/семейства, для STM32F10x:
Номера выводов с 8-го по 15-й - регистр CRH, выводы с 0-го по 7-й - аналогичный регистр CRL.
Допустим настраиваем PA3:
GPIOA->CRL &= ~(GPIO_CRL_MODE3 | GPIO_CRL_CNF3); GPIOA->CRL |= (0x01 << GPIO_CRL_MODE3_Pos) | (0x02 << GPIO_CRL_CNF3_Pos);
Первая строка - обнуляем соответствующие биты:
Вторая строка - записываем нужные значения, в данном случае: 0x01 (биты 01: Output mode, max speed 10 MHz) и 0x02 (биты 10: Alternate function output Push-pull).
@aveal Это только для F103 остальные по таблице, что я привёл. Всё время забываю об этой его особенности.
Да, в основном как писал Эдуард нужно делать.
А если через HAL?
GPIO_InitStruct.Pin = GPIO_PIN_8; GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP; HAL_GPIO_Init(GPIOC, &GPIO_InitStruct);
Понятно, спасибо всем )
@kostroma Через прямой доступ к регистрам быстрее и код короче.
HAL монструозен очень.