Skip to content

Commit eec5eb4

Browse files
iabdalkaderdpgeorge
authored andcommitted
stm32/uart: Add UART RX/CTS pin pull config options.
The UART driver enables a pull-up on RX/CTS pins by default. This can cause UART to fail to receive in certain situations, eg with RS485 transceivers. This commit adds compile-time configuration options to set the pull mode on the RX and CTS pins of each UART. Signed-off-by: iabdalkader <[email protected]>
1 parent 3e085c3 commit eec5eb4

File tree

1 file changed

+70
-4
lines changed

1 file changed

+70
-4
lines changed

ports/stm32/uart.c

Lines changed: 70 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -252,6 +252,9 @@ bool uart_init(machine_uart_obj_t *uart_obj,
252252

253253
const machine_pin_obj_t *pins[4] = {0};
254254

255+
// Default pull is pull-up on RX and CTS (the input pins).
256+
uint32_t pins_pull[4] = { GPIO_NOPULL, GPIO_PULLUP, GPIO_NOPULL, GPIO_PULLUP };
257+
255258
switch (uart_obj->uart_id) {
256259
#if defined(MICROPY_HW_UART1_TX) && defined(MICROPY_HW_UART1_RX)
257260
case PYB_UART_1:
@@ -270,6 +273,12 @@ bool uart_init(machine_uart_obj_t *uart_obj,
270273
pins[3] = MICROPY_HW_UART1_CTS;
271274
}
272275
#endif
276+
#if defined(MICROPY_HW_UART1_RX_PULL)
277+
pins_pull[1] = MICROPY_HW_UART1_RX_PULL;
278+
#endif
279+
#if defined(MICROPY_HW_UART1_CTS_PULL)
280+
pins_pull[3] = MICROPY_HW_UART1_CTS_PULL;
281+
#endif
273282
__HAL_RCC_USART1_CLK_ENABLE();
274283
break;
275284
#endif
@@ -295,6 +304,12 @@ bool uart_init(machine_uart_obj_t *uart_obj,
295304
pins[3] = MICROPY_HW_UART2_CTS;
296305
}
297306
#endif
307+
#if defined(MICROPY_HW_UART2_RX_PULL)
308+
pins_pull[1] = MICROPY_HW_UART2_RX_PULL;
309+
#endif
310+
#if defined(MICROPY_HW_UART2_CTS_PULL)
311+
pins_pull[3] = MICROPY_HW_UART2_CTS_PULL;
312+
#endif
298313
__HAL_RCC_USART2_CLK_ENABLE();
299314
break;
300315
#endif
@@ -322,6 +337,12 @@ bool uart_init(machine_uart_obj_t *uart_obj,
322337
pins[3] = MICROPY_HW_UART3_CTS;
323338
}
324339
#endif
340+
#if defined(MICROPY_HW_UART3_RX_PULL)
341+
pins_pull[1] = MICROPY_HW_UART3_RX_PULL;
342+
#endif
343+
#if defined(MICROPY_HW_UART3_CTS_PULL)
344+
pins_pull[3] = MICROPY_HW_UART3_CTS_PULL;
345+
#endif
325346
__HAL_RCC_USART3_CLK_ENABLE();
326347
break;
327348
#endif
@@ -358,6 +379,12 @@ bool uart_init(machine_uart_obj_t *uart_obj,
358379
pins[3] = MICROPY_HW_UART4_CTS;
359380
}
360381
#endif
382+
#if defined(MICROPY_HW_UART4_RX_PULL)
383+
pins_pull[1] = MICROPY_HW_UART4_RX_PULL;
384+
#endif
385+
#if defined(MICROPY_HW_UART4_CTS_PULL)
386+
pins_pull[3] = MICROPY_HW_UART4_CTS_PULL;
387+
#endif
361388
break;
362389
#endif
363390

@@ -393,6 +420,12 @@ bool uart_init(machine_uart_obj_t *uart_obj,
393420
pins[3] = MICROPY_HW_UART5_CTS;
394421
}
395422
#endif
423+
#if defined(MICROPY_HW_UART5_RX_PULL)
424+
pins_pull[1] = MICROPY_HW_UART5_RX_PULL;
425+
#endif
426+
#if defined(MICROPY_HW_UART5_CTS_PULL)
427+
pins_pull[3] = MICROPY_HW_UART5_CTS_PULL;
428+
#endif
396429
break;
397430
#endif
398431

@@ -419,6 +452,12 @@ bool uart_init(machine_uart_obj_t *uart_obj,
419452
pins[3] = MICROPY_HW_UART6_CTS;
420453
}
421454
#endif
455+
#if defined(MICROPY_HW_UART6_RX_PULL)
456+
pins_pull[1] = MICROPY_HW_UART6_RX_PULL;
457+
#endif
458+
#if defined(MICROPY_HW_UART6_CTS_PULL)
459+
pins_pull[3] = MICROPY_HW_UART6_CTS_PULL;
460+
#endif
422461
__HAL_RCC_USART6_CLK_ENABLE();
423462
break;
424463
#endif
@@ -447,6 +486,12 @@ bool uart_init(machine_uart_obj_t *uart_obj,
447486
pins[3] = MICROPY_HW_UART7_CTS;
448487
}
449488
#endif
489+
#if defined(MICROPY_HW_UART7_RX_PULL)
490+
pins_pull[1] = MICROPY_HW_UART7_RX_PULL;
491+
#endif
492+
#if defined(MICROPY_HW_UART7_CTS_PULL)
493+
pins_pull[3] = MICROPY_HW_UART7_CTS_PULL;
494+
#endif
450495
break;
451496
#endif
452497

@@ -474,6 +519,12 @@ bool uart_init(machine_uart_obj_t *uart_obj,
474519
pins[3] = MICROPY_HW_UART8_CTS;
475520
}
476521
#endif
522+
#if defined(MICROPY_HW_UART8_RX_PULL)
523+
pins_pull[1] = MICROPY_HW_UART8_RX_PULL;
524+
#endif
525+
#if defined(MICROPY_HW_UART8_CTS_PULL)
526+
pins_pull[3] = MICROPY_HW_UART8_CTS_PULL;
527+
#endif
477528
break;
478529
#endif
479530

@@ -485,6 +536,9 @@ bool uart_init(machine_uart_obj_t *uart_obj,
485536
__HAL_RCC_UART9_CLK_ENABLE();
486537
pins[0] = MICROPY_HW_UART9_TX;
487538
pins[1] = MICROPY_HW_UART9_RX;
539+
#if defined(MICROPY_HW_UART9_RX_PULL)
540+
pins_pull[1] = MICROPY_HW_UART9_RX_PULL;
541+
#endif
488542
break;
489543
#endif
490544

@@ -502,6 +556,9 @@ bool uart_init(machine_uart_obj_t *uart_obj,
502556
#endif
503557
pins[0] = MICROPY_HW_UART10_TX;
504558
pins[1] = MICROPY_HW_UART10_RX;
559+
#if defined(MICROPY_HW_UART10_RX_PULL)
560+
pins_pull[1] = MICROPY_HW_UART10_RX_PULL;
561+
#endif
505562
break;
506563
#endif
507564

@@ -527,6 +584,12 @@ bool uart_init(machine_uart_obj_t *uart_obj,
527584
pins[3] = MICROPY_HW_LPUART1_CTS;
528585
}
529586
#endif
587+
#if defined(MICROPY_HW_LPUART1_RX_PULL)
588+
pins_pull[1] = MICROPY_HW_LPUART1_RX_PULL;
589+
#endif
590+
#if defined(MICROPY_HW_LPUART1_CTS_PULL)
591+
pins_pull[3] = MICROPY_HW_LPUART1_CTS_PULL;
592+
#endif
530593
__HAL_RCC_LPUART1_CLK_ENABLE();
531594
break;
532595
#endif
@@ -551,6 +614,12 @@ bool uart_init(machine_uart_obj_t *uart_obj,
551614
pins[3] = MICROPY_HW_LPUART2_CTS;
552615
}
553616
#endif
617+
#if defined(MICROPY_HW_LPUART2_RX_PULL)
618+
pins_pull[1] = MICROPY_HW_LPUART2_RX_PULL;
619+
#endif
620+
#if defined(MICROPY_HW_LPUART2_CTS_PULL)
621+
pins_pull[3] = MICROPY_HW_LPUART2_CTS_PULL;
622+
#endif
554623
__HAL_RCC_LPUART2_CLK_ENABLE();
555624
break;
556625
#endif
@@ -564,10 +633,7 @@ bool uart_init(machine_uart_obj_t *uart_obj,
564633

565634
for (uint i = 0; i < 4; i++) {
566635
if (pins[i] != NULL) {
567-
// Configure pull-up on RX and CTS (the input pins).
568-
uint32_t pull = (i & 1) ? MP_HAL_PIN_PULL_UP : MP_HAL_PIN_PULL_NONE;
569-
bool ret = mp_hal_pin_config_alt(pins[i], mode, pull, uart_fn, uart_unit);
570-
if (!ret) {
636+
if (!mp_hal_pin_config_alt(pins[i], mode, pins_pull[i], uart_fn, uart_unit)) {
571637
return false;
572638
}
573639
}

0 commit comments

Comments
 (0)