@@ -118,16 +118,25 @@ void uart_init(serial_t *obj, uint32_t baudrate, uint32_t databits, uint32_t par
118
118
USART_TypeDef * uart_rx = pinmap_peripheral (obj -> pin_rx , PinMap_UART_RX );
119
119
USART_TypeDef * uart_rts = pinmap_peripheral (obj -> pin_rts , PinMap_UART_RTS );
120
120
USART_TypeDef * uart_cts = pinmap_peripheral (obj -> pin_cts , PinMap_UART_CTS );
121
+ /* Check if pins are swapped */
122
+ #if defined(UART_ADVFEATURE_SWAP_INIT )
123
+ USART_TypeDef * uart_tx_swap = pinmap_peripheral (obj -> pin_tx , PinMap_UART_RX );
124
+ USART_TypeDef * uart_rx_swap = pinmap_peripheral (obj -> pin_rx , PinMap_UART_TX );
125
+ #else
126
+ /* Pin swap not supported */
127
+ USART_TypeDef * uart_tx_swap = NP ;
128
+ USART_TypeDef * uart_rx_swap = NP ;
129
+ #endif
121
130
122
131
/* Pin Tx must not be NP */
123
- if (uart_tx == NP ) {
132
+ if (( uart_tx == NP ) && ( uart_tx_swap == NP ) ) {
124
133
if (obj != & serial_debug ) {
125
134
core_debug ("ERROR: [U(S)ART] Tx pin has no peripheral!\n" );
126
135
}
127
136
return ;
128
137
}
129
138
/* Pin Rx must not be NP if not half-duplex */
130
- if ((obj -> pin_rx != NC ) && (uart_rx == NP )) {
139
+ if ((obj -> pin_rx != NC ) && (uart_rx == NP ) && ( uart_rx_swap == NP ) ) {
131
140
if (obj != & serial_debug ) {
132
141
core_debug ("ERROR: [U(S)ART] Rx pin has no peripheral!\n" );
133
142
}
@@ -153,6 +162,10 @@ void uart_init(serial_t *obj, uint32_t baudrate, uint32_t databits, uint32_t par
153
162
* and assign it to the object
154
163
*/
155
164
obj -> uart = pinmap_merge_peripheral (uart_tx , uart_rx );
165
+ if (obj -> uart == NP ) {
166
+ /* Regular pins not matched, check if they can be swapped */
167
+ obj -> uart = pinmap_merge_peripheral (uart_tx_swap , uart_rx_swap );
168
+ }
156
169
/* We also merge RTS/CTS and assert all pins belong to the same instance */
157
170
obj -> uart = pinmap_merge_peripheral (obj -> uart , uart_rts );
158
171
obj -> uart = pinmap_merge_peripheral (obj -> uart , uart_cts );
@@ -316,10 +329,26 @@ void uart_init(serial_t *obj, uint32_t baudrate, uint32_t databits, uint32_t par
316
329
#endif
317
330
318
331
/* Configure UART GPIO pins */
319
- pinmap_pinout (obj -> pin_tx , PinMap_UART_TX );
320
- if (uart_rx != NP ) {
321
- pinmap_pinout (obj -> pin_rx , PinMap_UART_RX );
332
+ #if defined(UART_ADVFEATURE_SWAP_INIT )
333
+ uint32_t pin_swap = UART_ADVFEATURE_SWAP_DISABLE ;
334
+ #endif
335
+ if (uart_tx != NP ) {
336
+ /* Regular GPIO */
337
+ pinmap_pinout (obj -> pin_tx , PinMap_UART_TX );
338
+ if (uart_rx != NP ) {
339
+ pinmap_pinout (obj -> pin_rx , PinMap_UART_RX );
340
+ }
341
+ }
342
+ #if defined(UART_ADVFEATURE_SWAP_INIT )
343
+ else if (uart_tx_swap != NP ) {
344
+ /* Swapped GPIO */
345
+ pinmap_pinout (obj -> pin_tx , PinMap_UART_RX );
346
+ if (uart_rx_swap != NP ) {
347
+ pinmap_pinout (obj -> pin_rx , PinMap_UART_TX );
348
+ }
349
+ pin_swap = UART_ADVFEATURE_SWAP_ENABLE ;
322
350
}
351
+ #endif
323
352
324
353
/* Configure flow control */
325
354
uint32_t flow_control = UART_HWCONTROL_NONE ;
@@ -342,8 +371,10 @@ void uart_init(serial_t *obj, uint32_t baudrate, uint32_t databits, uint32_t par
342
371
huart -> Init .Mode = UART_MODE_TX_RX ;
343
372
huart -> Init .HwFlowCtl = flow_control ;
344
373
huart -> Init .OverSampling = UART_OVERSAMPLING_16 ;
345
- #if !defined(STM32F1xx ) && !defined(STM32F2xx ) && !defined(STM32F4xx )\
346
- && !defined(STM32L1xx )
374
+ #if defined(UART_ADVFEATURE_SWAP_INIT )
375
+ huart -> AdvancedInit .AdvFeatureInit = UART_ADVFEATURE_SWAP_INIT ;
376
+ huart -> AdvancedInit .Swap = pin_swap ;
377
+ #elif defined(UART_ADVFEATURE_NO_INIT )
347
378
huart -> AdvancedInit .AdvFeatureInit = UART_ADVFEATURE_NO_INIT ;
348
379
#endif
349
380
#ifdef UART_ONE_BIT_SAMPLE_DISABLE
@@ -376,7 +407,7 @@ void uart_init(serial_t *obj, uint32_t baudrate, uint32_t databits, uint32_t par
376
407
HAL_UARTEx_DisableStopMode (huart );
377
408
}
378
409
/* Trying default LPUART clock source */
379
- if (uart_rx == NP ) {
410
+ if (( uart_rx == NP ) && ( uart_rx_swap == NP ) ) {
380
411
if (HAL_HalfDuplex_Init (huart ) == HAL_OK ) {
381
412
return ;
382
413
}
@@ -396,7 +427,7 @@ void uart_init(serial_t *obj, uint32_t baudrate, uint32_t databits, uint32_t par
396
427
__HAL_RCC_LPUART2_CONFIG (RCC_LPUART2CLKSOURCE_LSE );
397
428
}
398
429
#endif
399
- if (uart_rx == NP ) {
430
+ if (( uart_rx == NP ) && ( uart_rx_swap == NP ) ) {
400
431
if (HAL_HalfDuplex_Init (huart ) == HAL_OK ) {
401
432
return ;
402
433
}
@@ -413,7 +444,7 @@ void uart_init(serial_t *obj, uint32_t baudrate, uint32_t databits, uint32_t par
413
444
__HAL_RCC_LPUART2_CONFIG (RCC_LPUART2CLKSOURCE_HSI );
414
445
}
415
446
#endif
416
- if (uart_rx == NP ) {
447
+ if (( uart_rx == NP ) && ( uart_rx_swap == NP ) ) {
417
448
if (HAL_HalfDuplex_Init (huart ) == HAL_OK ) {
418
449
return ;
419
450
}
@@ -435,7 +466,7 @@ void uart_init(serial_t *obj, uint32_t baudrate, uint32_t databits, uint32_t par
435
466
__HAL_RCC_LPUART2_CONFIG (RCC_LPUART2CLKSOURCE_PCLK1 );
436
467
}
437
468
#endif
438
- if (uart_rx == NP ) {
469
+ if (( uart_rx == NP ) && ( uart_rx_swap == NP ) ) {
439
470
if (HAL_HalfDuplex_Init (huart ) == HAL_OK ) {
440
471
return ;
441
472
}
@@ -455,7 +486,7 @@ void uart_init(serial_t *obj, uint32_t baudrate, uint32_t databits, uint32_t par
455
486
}
456
487
#endif
457
488
458
- if (uart_rx == NP ) {
489
+ if (( uart_rx == NP ) && ( uart_rx_swap == NP ) ) {
459
490
if (HAL_HalfDuplex_Init (huart ) != HAL_OK ) {
460
491
return ;
461
492
}
0 commit comments