@@ -121,16 +121,25 @@ void uart_init(serial_t *obj, uint32_t baudrate, uint32_t databits, uint32_t par
121
121
USART_TypeDef * uart_rx = pinmap_peripheral (obj -> pin_rx , PinMap_UART_RX );
122
122
USART_TypeDef * uart_rts = pinmap_peripheral (obj -> pin_rts , PinMap_UART_RTS );
123
123
USART_TypeDef * uart_cts = pinmap_peripheral (obj -> pin_cts , PinMap_UART_CTS );
124
+ /* Check if pins are swapped */
125
+ #if defined(UART_ADVFEATURE_SWAP_INIT )
126
+ USART_TypeDef * uart_tx_swap = pinmap_peripheral (obj -> pin_tx , PinMap_UART_RX );
127
+ USART_TypeDef * uart_rx_swap = pinmap_peripheral (obj -> pin_rx , PinMap_UART_TX );
128
+ #else
129
+ /* Pin swap not supported */
130
+ USART_TypeDef * uart_tx_swap = NP ;
131
+ USART_TypeDef * uart_rx_swap = NP ;
132
+ #endif
124
133
125
134
/* Pin Tx must not be NP */
126
- if (uart_tx == NP ) {
135
+ if (( uart_tx == NP ) && ( uart_tx_swap == NP ) ) {
127
136
if (obj != & serial_debug ) {
128
137
core_debug ("ERROR: [U(S)ART] Tx pin has no peripheral!\n" );
129
138
}
130
139
return ;
131
140
}
132
141
/* Pin Rx must not be NP if not half-duplex */
133
- if ((obj -> pin_rx != NC ) && (uart_rx == NP )) {
142
+ if ((obj -> pin_rx != NC ) && (uart_rx == NP ) && ( uart_rx_swap == NP ) ) {
134
143
if (obj != & serial_debug ) {
135
144
core_debug ("ERROR: [U(S)ART] Rx pin has no peripheral!\n" );
136
145
}
@@ -156,6 +165,10 @@ void uart_init(serial_t *obj, uint32_t baudrate, uint32_t databits, uint32_t par
156
165
* and assign it to the object
157
166
*/
158
167
obj -> uart = pinmap_merge_peripheral (uart_tx , uart_rx );
168
+ if (obj -> uart == NP ) {
169
+ /* Regular pins not matched, check if they can be swapped */
170
+ obj -> uart = pinmap_merge_peripheral (uart_tx_swap , uart_rx_swap );
171
+ }
159
172
/* We also merge RTS/CTS and assert all pins belong to the same instance */
160
173
obj -> uart = pinmap_merge_peripheral (obj -> uart , uart_rts );
161
174
obj -> uart = pinmap_merge_peripheral (obj -> uart , uart_cts );
@@ -328,10 +341,26 @@ void uart_init(serial_t *obj, uint32_t baudrate, uint32_t databits, uint32_t par
328
341
#endif
329
342
330
343
/* Configure UART GPIO pins */
331
- pinmap_pinout (obj -> pin_tx , PinMap_UART_TX );
332
- if (uart_rx != NP ) {
333
- pinmap_pinout (obj -> pin_rx , PinMap_UART_RX );
344
+ #if defined(UART_ADVFEATURE_SWAP_INIT )
345
+ uint32_t pin_swap = UART_ADVFEATURE_SWAP_DISABLE ;
346
+ #endif
347
+ if (uart_tx != NP ) {
348
+ /* Regular GPIO */
349
+ pinmap_pinout (obj -> pin_tx , PinMap_UART_TX );
350
+ if (uart_rx != NP ) {
351
+ pinmap_pinout (obj -> pin_rx , PinMap_UART_RX );
352
+ }
353
+ }
354
+ #if defined(UART_ADVFEATURE_SWAP_INIT )
355
+ else if (uart_tx_swap != NP ) {
356
+ /* Swapped GPIO */
357
+ pinmap_pinout (obj -> pin_tx , PinMap_UART_RX );
358
+ if (uart_rx_swap != NP ) {
359
+ pinmap_pinout (obj -> pin_rx , PinMap_UART_TX );
360
+ }
361
+ pin_swap = UART_ADVFEATURE_SWAP_ENABLE ;
334
362
}
363
+ #endif
335
364
336
365
/* Configure flow control */
337
366
uint32_t flow_control = UART_HWCONTROL_NONE ;
@@ -354,8 +383,10 @@ void uart_init(serial_t *obj, uint32_t baudrate, uint32_t databits, uint32_t par
354
383
huart -> Init .Mode = UART_MODE_TX_RX ;
355
384
huart -> Init .HwFlowCtl = flow_control ;
356
385
huart -> Init .OverSampling = UART_OVERSAMPLING_16 ;
357
- #if !defined(STM32F1xx ) && !defined(STM32F2xx ) && !defined(STM32F4xx )\
358
- && !defined(STM32L1xx )
386
+ #if defined(UART_ADVFEATURE_SWAP_INIT )
387
+ huart -> AdvancedInit .AdvFeatureInit = UART_ADVFEATURE_SWAP_INIT ;
388
+ huart -> AdvancedInit .Swap = pin_swap ;
389
+ #elif defined(UART_ADVFEATURE_NO_INIT )
359
390
huart -> AdvancedInit .AdvFeatureInit = UART_ADVFEATURE_NO_INIT ;
360
391
#endif
361
392
#ifdef UART_ONE_BIT_SAMPLE_DISABLE
@@ -391,7 +422,7 @@ void uart_init(serial_t *obj, uint32_t baudrate, uint32_t databits, uint32_t par
391
422
HAL_UARTEx_DisableStopMode (huart );
392
423
}
393
424
/* Trying default LPUART clock source */
394
- if (uart_rx == NP ) {
425
+ if (( uart_rx == NP ) && ( uart_rx_swap == NP ) ) {
395
426
if (HAL_HalfDuplex_Init (huart ) == HAL_OK ) {
396
427
return ;
397
428
}
@@ -416,7 +447,7 @@ void uart_init(serial_t *obj, uint32_t baudrate, uint32_t databits, uint32_t par
416
447
__HAL_RCC_LPUART3_CONFIG (RCC_LPUART3CLKSOURCE_LSE );
417
448
}
418
449
#endif
419
- if (uart_rx == NP ) {
450
+ if (( uart_rx == NP ) && ( uart_rx_swap == NP ) ) {
420
451
if (HAL_HalfDuplex_Init (huart ) == HAL_OK ) {
421
452
return ;
422
453
}
@@ -438,7 +469,7 @@ void uart_init(serial_t *obj, uint32_t baudrate, uint32_t databits, uint32_t par
438
469
__HAL_RCC_LPUART3_CONFIG (RCC_LPUART3CLKSOURCE_HSI );
439
470
}
440
471
#endif
441
- if (uart_rx == NP ) {
472
+ if (( uart_rx == NP ) && ( uart_rx_swap == NP ) ) {
442
473
if (HAL_HalfDuplex_Init (huart ) == HAL_OK ) {
443
474
return ;
444
475
}
@@ -465,7 +496,7 @@ void uart_init(serial_t *obj, uint32_t baudrate, uint32_t databits, uint32_t par
465
496
__HAL_RCC_LPUART3_CONFIG (RCC_LPUART3CLKSOURCE_PCLK1 );
466
497
}
467
498
#endif
468
- if (uart_rx == NP ) {
499
+ if (( uart_rx == NP ) && ( uart_rx_swap == NP ) ) {
469
500
if (HAL_HalfDuplex_Init (huart ) == HAL_OK ) {
470
501
return ;
471
502
}
@@ -490,7 +521,7 @@ void uart_init(serial_t *obj, uint32_t baudrate, uint32_t databits, uint32_t par
490
521
}
491
522
#endif
492
523
493
- if (uart_rx == NP ) {
524
+ if (( uart_rx == NP ) && ( uart_rx_swap == NP ) ) {
494
525
if (HAL_HalfDuplex_Init (huart ) != HAL_OK ) {
495
526
return ;
496
527
}
0 commit comments