@@ -128,10 +128,14 @@ void uart_init(serial_t *obj, uint32_t baudrate, uint32_t databits, uint32_t par
128128
129129 /* Determine the U(S)ART peripheral to use (USART1, USART2, ...) */
130130 USART_TypeDef * uart_tx = pinmap_peripheral (obj -> pin_tx , PinMap_UART_TX );
131- USART_TypeDef * uart_rx = pinmap_peripheral (obj -> pin_rx , PinMap_UART_RX );
131+ USART_TypeDef * uart_rx = NP ;
132+
133+ if (obj -> pin_rx != NC ) {
134+ uart_rx = pinmap_peripheral (obj -> pin_rx , PinMap_UART_RX );
135+ }
132136
133137 /* Pins Rx/Tx must not be NP */
134- if (uart_rx == NP || uart_tx == NP ) {
138+ if (( obj -> pin_rx != NC && uart_rx == NP ) || uart_tx == NP ) {
135139 core_debug ("ERROR: at least one UART pin has no peripheral\n" );
136140 return ;
137141 }
@@ -288,7 +292,9 @@ void uart_init(serial_t *obj, uint32_t baudrate, uint32_t databits, uint32_t par
288292
289293 /* Configure UART GPIO pins */
290294 pinmap_pinout (obj -> pin_tx , PinMap_UART_TX );
291- pinmap_pinout (obj -> pin_rx , PinMap_UART_RX );
295+ if (uart_rx != NP ) {
296+ pinmap_pinout (obj -> pin_rx , PinMap_UART_RX );
297+ }
292298
293299 /* Configure uart */
294300 uart_handlers [obj -> index ] = huart ;
@@ -359,7 +365,11 @@ void uart_init(serial_t *obj, uint32_t baudrate, uint32_t databits, uint32_t par
359365 }
360366#endif
361367
362- if (HAL_UART_Init (huart ) != HAL_OK ) {
368+ if (uart_rx == NP ) {
369+ if (HAL_HalfDuplex_Init (huart ) != HAL_OK ) {
370+ return ;
371+ }
372+ } else if (HAL_UART_Init (huart ) != HAL_OK ) {
363373 return ;
364374 }
365375}
@@ -732,6 +742,34 @@ void uart_attach_tx_callback(serial_t *obj, int (*callback)(serial_t *))
732742 HAL_NVIC_EnableIRQ (obj -> irq );
733743}
734744
745+ /**
746+ * Enable transmitter for half-duplex mode. NOOP in full-fuplex mode
747+ *
748+ * @param obj : pointer to serial_t structure
749+ * @retval none
750+ */
751+ void uart_enable_tx (serial_t * obj )
752+ {
753+ if (obj == NULL || obj -> pin_rx != NC ) {
754+ return ;
755+ }
756+ HAL_HalfDuplex_EnableTransmitter (uart_handlers [obj -> index ]);
757+ }
758+
759+ /**
760+ * Enable receiver for half-duplex mode. NOOP in full-fuplex mode
761+ *
762+ * @param obj : pointer to serial_t structure
763+ * @retval none
764+ */
765+ void uart_enable_rx (serial_t * obj )
766+ {
767+ if (obj == NULL || obj -> pin_rx != NC ) {
768+ return ;
769+ }
770+ HAL_HalfDuplex_EnableReceiver (uart_handlers [obj -> index ]);
771+ }
772+
735773/**
736774 * @brief Return index of the serial handler
737775 * @param UartHandle pointer on the uart reference
0 commit comments