Skip to content

Commit dd46d9c

Browse files
thiagogbafpistm
authored andcommitted
fix(uart): prevent deinitializing another UART
If called from an uninitialized HardwareSerial, the code unintentionally deinit the UART at uart_handlers[0] Signed-off-by: Thiago Henrique Alves <[email protected]>
1 parent 227cec0 commit dd46d9c

File tree

1 file changed

+110
-107
lines changed
  • libraries/SrcWrapper/src/stm32

1 file changed

+110
-107
lines changed

libraries/SrcWrapper/src/stm32/uart.c

Lines changed: 110 additions & 107 deletions
Original file line numberDiff line numberDiff line change
@@ -594,151 +594,154 @@ bool uart_init(serial_t *obj, uint32_t baudrate, uint32_t databits, uint32_t par
594594
*/
595595
void uart_deinit(serial_t *obj)
596596
{
597-
/* Reset UART and disable clock */
598-
switch (obj->index) {
597+
/* Ensure uart is set to prevent deinitializing uart at index 0 */
598+
if (obj->uart) {
599+
/* Reset UART and disable clock */
600+
switch (obj->index) {
599601
#if defined(USART1_BASE)
600-
case UART1_INDEX:
601-
__HAL_RCC_USART1_FORCE_RESET();
602-
__HAL_RCC_USART1_RELEASE_RESET();
603-
__HAL_RCC_USART1_CLK_DISABLE();
604-
break;
602+
case UART1_INDEX:
603+
__HAL_RCC_USART1_FORCE_RESET();
604+
__HAL_RCC_USART1_RELEASE_RESET();
605+
__HAL_RCC_USART1_CLK_DISABLE();
606+
break;
605607
#endif
606608
#if defined(USART2_BASE)
607-
case UART2_INDEX:
608-
__HAL_RCC_USART2_FORCE_RESET();
609-
__HAL_RCC_USART2_RELEASE_RESET();
610-
__HAL_RCC_USART2_CLK_DISABLE();
611-
break;
609+
case UART2_INDEX:
610+
__HAL_RCC_USART2_FORCE_RESET();
611+
__HAL_RCC_USART2_RELEASE_RESET();
612+
__HAL_RCC_USART2_CLK_DISABLE();
613+
break;
612614
#endif
613615
#if defined(USART3_BASE)
614-
case UART3_INDEX:
615-
__HAL_RCC_USART3_FORCE_RESET();
616-
__HAL_RCC_USART3_RELEASE_RESET();
617-
__HAL_RCC_USART3_CLK_DISABLE();
618-
break;
616+
case UART3_INDEX:
617+
__HAL_RCC_USART3_FORCE_RESET();
618+
__HAL_RCC_USART3_RELEASE_RESET();
619+
__HAL_RCC_USART3_CLK_DISABLE();
620+
break;
619621
#endif
620622
#if defined(UART4_BASE)
621-
case UART4_INDEX:
622-
__HAL_RCC_UART4_FORCE_RESET();
623-
__HAL_RCC_UART4_RELEASE_RESET();
624-
__HAL_RCC_UART4_CLK_DISABLE();
625-
break;
623+
case UART4_INDEX:
624+
__HAL_RCC_UART4_FORCE_RESET();
625+
__HAL_RCC_UART4_RELEASE_RESET();
626+
__HAL_RCC_UART4_CLK_DISABLE();
627+
break;
626628
#elif defined(USART4_BASE)
627-
case UART4_INDEX:
628-
__HAL_RCC_USART4_FORCE_RESET();
629-
__HAL_RCC_USART4_RELEASE_RESET();
630-
__HAL_RCC_USART4_CLK_DISABLE();
631-
break;
629+
case UART4_INDEX:
630+
__HAL_RCC_USART4_FORCE_RESET();
631+
__HAL_RCC_USART4_RELEASE_RESET();
632+
__HAL_RCC_USART4_CLK_DISABLE();
633+
break;
632634
#endif
633635
#if defined(UART5_BASE)
634-
case UART5_INDEX:
635-
__HAL_RCC_UART5_FORCE_RESET();
636-
__HAL_RCC_UART5_RELEASE_RESET();
637-
__HAL_RCC_UART5_CLK_DISABLE();
638-
break;
636+
case UART5_INDEX:
637+
__HAL_RCC_UART5_FORCE_RESET();
638+
__HAL_RCC_UART5_RELEASE_RESET();
639+
__HAL_RCC_UART5_CLK_DISABLE();
640+
break;
639641
#elif defined(USART5_BASE)
640-
case UART5_INDEX:
641-
__HAL_RCC_USART5_FORCE_RESET();
642-
__HAL_RCC_USART5_RELEASE_RESET();
643-
__HAL_RCC_USART5_CLK_DISABLE();
644-
break;
642+
case UART5_INDEX:
643+
__HAL_RCC_USART5_FORCE_RESET();
644+
__HAL_RCC_USART5_RELEASE_RESET();
645+
__HAL_RCC_USART5_CLK_DISABLE();
646+
break;
645647
#endif
646648
#if defined(USART6_BASE)
647-
case UART6_INDEX:
648-
__HAL_RCC_USART6_FORCE_RESET();
649-
__HAL_RCC_USART6_RELEASE_RESET();
650-
__HAL_RCC_USART6_CLK_DISABLE();
651-
break;
649+
case UART6_INDEX:
650+
__HAL_RCC_USART6_FORCE_RESET();
651+
__HAL_RCC_USART6_RELEASE_RESET();
652+
__HAL_RCC_USART6_CLK_DISABLE();
653+
break;
652654
#endif
653655
#if defined(LPUART1_BASE)
654-
case LPUART1_INDEX:
655-
__HAL_RCC_LPUART1_FORCE_RESET();
656-
__HAL_RCC_LPUART1_RELEASE_RESET();
657-
__HAL_RCC_LPUART1_CLK_DISABLE();
658-
break;
656+
case LPUART1_INDEX:
657+
__HAL_RCC_LPUART1_FORCE_RESET();
658+
__HAL_RCC_LPUART1_RELEASE_RESET();
659+
__HAL_RCC_LPUART1_CLK_DISABLE();
660+
break;
659661
#endif
660662
#if defined(LPUART2_BASE)
661-
case LPUART2_INDEX:
662-
__HAL_RCC_LPUART2_FORCE_RESET();
663-
__HAL_RCC_LPUART2_RELEASE_RESET();
664-
__HAL_RCC_LPUART2_CLK_DISABLE();
665-
break;
663+
case LPUART2_INDEX:
664+
__HAL_RCC_LPUART2_FORCE_RESET();
665+
__HAL_RCC_LPUART2_RELEASE_RESET();
666+
__HAL_RCC_LPUART2_CLK_DISABLE();
667+
break;
666668
#endif
667669
#if defined(LPUART3_BASE)
668-
case LPUART3_INDEX:
669-
__HAL_RCC_LPUART3_FORCE_RESET();
670-
__HAL_RCC_LPUART3_RELEASE_RESET();
671-
__HAL_RCC_LPUART3_CLK_DISABLE();
672-
break;
670+
case LPUART3_INDEX:
671+
__HAL_RCC_LPUART3_FORCE_RESET();
672+
__HAL_RCC_LPUART3_RELEASE_RESET();
673+
__HAL_RCC_LPUART3_CLK_DISABLE();
674+
break;
673675
#endif
674676
#if defined(UART7_BASE)
675-
case UART7_INDEX:
676-
__HAL_RCC_UART7_FORCE_RESET();
677-
__HAL_RCC_UART7_RELEASE_RESET();
678-
__HAL_RCC_UART7_CLK_DISABLE();
679-
break;
677+
case UART7_INDEX:
678+
__HAL_RCC_UART7_FORCE_RESET();
679+
__HAL_RCC_UART7_RELEASE_RESET();
680+
__HAL_RCC_UART7_CLK_DISABLE();
681+
break;
680682
#elif defined(USART7_BASE)
681-
case UART7_INDEX:
682-
__HAL_RCC_USART7_FORCE_RESET();
683-
__HAL_RCC_USART7_RELEASE_RESET();
684-
__HAL_RCC_USART7_CLK_DISABLE();
685-
break;
683+
case UART7_INDEX:
684+
__HAL_RCC_USART7_FORCE_RESET();
685+
__HAL_RCC_USART7_RELEASE_RESET();
686+
__HAL_RCC_USART7_CLK_DISABLE();
687+
break;
686688
#endif
687689
#if defined(UART8_BASE)
688-
case UART8_INDEX:
689-
__HAL_RCC_UART8_FORCE_RESET();
690-
__HAL_RCC_UART8_RELEASE_RESET();
691-
__HAL_RCC_UART8_CLK_DISABLE();
692-
break;
690+
case UART8_INDEX:
691+
__HAL_RCC_UART8_FORCE_RESET();
692+
__HAL_RCC_UART8_RELEASE_RESET();
693+
__HAL_RCC_UART8_CLK_DISABLE();
694+
break;
693695
#elif defined(USART8_BASE)
694-
case UART8_INDEX:
695-
__HAL_RCC_USART8_FORCE_RESET();
696-
__HAL_RCC_USART8_RELEASE_RESET();
697-
__HAL_RCC_USART8_CLK_DISABLE();
698-
break;
696+
case UART8_INDEX:
697+
__HAL_RCC_USART8_FORCE_RESET();
698+
__HAL_RCC_USART8_RELEASE_RESET();
699+
__HAL_RCC_USART8_CLK_DISABLE();
700+
break;
699701
#endif
700702
#if defined(UART9_BASE)
701-
case UART9_INDEX:
702-
__HAL_RCC_UART9_FORCE_RESET();
703-
__HAL_RCC_UART9_RELEASE_RESET();
704-
__HAL_RCC_UART9_CLK_DISABLE();
705-
break;
703+
case UART9_INDEX:
704+
__HAL_RCC_UART9_FORCE_RESET();
705+
__HAL_RCC_UART9_RELEASE_RESET();
706+
__HAL_RCC_UART9_CLK_DISABLE();
707+
break;
706708
#endif
707709
#if defined(UART10_BASE)
708-
case UART10_INDEX:
709-
__HAL_RCC_UART10_FORCE_RESET();
710-
__HAL_RCC_UART10_RELEASE_RESET();
711-
__HAL_RCC_UART10_CLK_DISABLE();
712-
break;
710+
case UART10_INDEX:
711+
__HAL_RCC_UART10_FORCE_RESET();
712+
__HAL_RCC_UART10_RELEASE_RESET();
713+
__HAL_RCC_UART10_CLK_DISABLE();
714+
break;
713715
#endif
714716
#if defined(USART10_BASE)
715-
case UART10_INDEX:
716-
__HAL_RCC_USART10_FORCE_RESET();
717-
__HAL_RCC_USART10_RELEASE_RESET();
718-
__HAL_RCC_USART10_CLK_DISABLE();
719-
break;
717+
case UART10_INDEX:
718+
__HAL_RCC_USART10_FORCE_RESET();
719+
__HAL_RCC_USART10_RELEASE_RESET();
720+
__HAL_RCC_USART10_CLK_DISABLE();
721+
break;
720722
#endif
721723
#if defined(USART11_BASE)
722-
case UART11_INDEX:
723-
__HAL_RCC_USART11_FORCE_RESET();
724-
__HAL_RCC_USART11_RELEASE_RESET();
725-
__HAL_RCC_USART11_CLK_DISABLE();
726-
break;
724+
case UART11_INDEX:
725+
__HAL_RCC_USART11_FORCE_RESET();
726+
__HAL_RCC_USART11_RELEASE_RESET();
727+
__HAL_RCC_USART11_CLK_DISABLE();
728+
break;
727729
#endif
728730
#if defined(UART12_BASE)
729-
case UART12_INDEX:
730-
__HAL_RCC_UART12_FORCE_RESET();
731-
__HAL_RCC_UART12_RELEASE_RESET();
732-
__HAL_RCC_UART12_CLK_DISABLE();
733-
break;
731+
case UART12_INDEX:
732+
__HAL_RCC_UART12_FORCE_RESET();
733+
__HAL_RCC_UART12_RELEASE_RESET();
734+
__HAL_RCC_UART12_CLK_DISABLE();
735+
break;
734736
#endif
735-
}
737+
}
736738

737-
HAL_UART_DeInit(uart_handlers[obj->index]);
739+
HAL_UART_DeInit(uart_handlers[obj->index]);
738740

739-
/* Release uart debug to ensure init */
740-
if (serial_debug.index == obj->index) {
741-
serial_debug.index = UART_NUM;
741+
/* Release uart debug to ensure init */
742+
if (serial_debug.index == obj->index) {
743+
serial_debug.index = UART_NUM;
744+
}
742745
}
743746
}
744747

0 commit comments

Comments
 (0)