Согласен) Вызов стандартных функций hal типа HAL_UART_Transmit_DMA() лишь упрощает старт. Удобно то, что быстро собрал в кубе проект и пихнул данные, особенно с новым процом. И визуально все понятно какие ножки задействованы. А так пользуюсь hal, но как spl: типа
__HAL_UART_CLEAR_FLAG(&huart1, UART_FLAG_TC); // это в hal
USART_ClearFlag(USART1, USART_FLAG_TC); // это в spl