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 <35922412+thiagogba@users.noreply.github.com>
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)
pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy