Да, на микроконтроллерах STM32 можно настроить виртуальный UART при помощи программного обеспечения. Например, можно использовать библиотеку STM32CubeMX для настройки виртуального UART.
Чтобы осуществить передачу данных по UART с использованием STM32 с обычного цифрового пина, можно использовать прерывания. Прерывания позволят передавать данные по UART с помощью программного обеспечения, что поможет избежать проблем с задержками, связанными с HAL_Delay. Например, можно настроить прерывания на изменение состояния пина и обрабатывать передачу данных по UART внутри обработчика прерывания.
Чтобы задать уровень напряжения на пине в простое, когда коммуникация не происходит, можно использовать встроенные регистры GPIO для установки уровня напряжения на пине. Например, можно использовать функцию HAL_GPIO_WritePin() для установки уровня напряжения на нужном пине.
Существуют различные библиотеки и примеры решения подобных проблем для микроконтроллеров STM32. Например, можно воспользоваться примерами кода от производителя, такими как STM32CubeMX, или поискать соответствующие ресурсы на форумах и сайтах разработчиков.