Index: ctrl/firmware/Main/CubeMX/Core/Inc/stm32h7xx_it.h
===================================================================
--- ctrl/firmware/Main/CubeMX/Core/Inc/stm32h7xx_it.h	(revision 62)
+++ ctrl/firmware/Main/CubeMX/Core/Inc/stm32h7xx_it.h	(revision 63)
@@ -54,4 +54,5 @@
 void DebugMon_Handler(void);
 void DMA1_Stream0_IRQHandler(void);
+void USART3_IRQHandler(void);
 void SDMMC1_IRQHandler(void);
 void TIM7_IRQHandler(void);
Index: ctrl/firmware/Main/CubeMX/Core/Src/gpio.c
===================================================================
--- ctrl/firmware/Main/CubeMX/Core/Src/gpio.c	(revision 62)
+++ ctrl/firmware/Main/CubeMX/Core/Src/gpio.c	(revision 63)
@@ -156,14 +156,4 @@
   HAL_GPIO_Init(GPIOD, &GPIO_InitStruct);
 
-  /*Configure GPIO pins : PD11 PD12 PD14 PD15
-                           PD0 PD1 PD3 PD4
-                           PD5 PD6 */
-  GPIO_InitStruct.Pin = GPIO_PIN_11|GPIO_PIN_12|GPIO_PIN_14|GPIO_PIN_15
-                          |GPIO_PIN_0|GPIO_PIN_1|GPIO_PIN_3|GPIO_PIN_4
-                          |GPIO_PIN_5|GPIO_PIN_6;
-  GPIO_InitStruct.Mode = GPIO_MODE_ANALOG;
-  GPIO_InitStruct.Pull = GPIO_NOPULL;
-  HAL_GPIO_Init(GPIOD, &GPIO_InitStruct);
-
   /*Configure GPIO pin : GSM_STATUS_Pin */
   GPIO_InitStruct.Pin = GSM_STATUS_Pin;
@@ -171,4 +161,12 @@
   GPIO_InitStruct.Pull = GPIO_NOPULL;
   HAL_GPIO_Init(GSM_STATUS_GPIO_Port, &GPIO_InitStruct);
+
+  /*Configure GPIO pins : PD14 PD15 PD0 PD1
+                           PD3 PD4 PD5 PD6 */
+  GPIO_InitStruct.Pin = GPIO_PIN_14|GPIO_PIN_15|GPIO_PIN_0|GPIO_PIN_1
+                          |GPIO_PIN_3|GPIO_PIN_4|GPIO_PIN_5|GPIO_PIN_6;
+  GPIO_InitStruct.Mode = GPIO_MODE_ANALOG;
+  GPIO_InitStruct.Pull = GPIO_NOPULL;
+  HAL_GPIO_Init(GPIOD, &GPIO_InitStruct);
 
   /*Configure GPIO pins : PG2 PG3 PG4 PG5
Index: ctrl/firmware/Main/CubeMX/Core/Src/stm32h7xx_it.c
===================================================================
--- ctrl/firmware/Main/CubeMX/Core/Src/stm32h7xx_it.c	(revision 62)
+++ ctrl/firmware/Main/CubeMX/Core/Src/stm32h7xx_it.c	(revision 63)
@@ -23,4 +23,7 @@
 /* Private includes ----------------------------------------------------------*/
 /* USER CODE BEGIN Includes */
+
+#include "gsm_thread.h"
+
 /* USER CODE END Includes */
 
@@ -59,4 +62,5 @@
 extern DMA_HandleTypeDef hdma_spi4_tx;
 extern SPI_HandleTypeDef hspi4;
+extern UART_HandleTypeDef huart3;
 extern TIM_HandleTypeDef htim7;
 
@@ -178,4 +182,18 @@
 
 /**
+  * @brief This function handles USART3 global interrupt.
+  */
+void USART3_IRQHandler(void)
+{
+  /* USER CODE BEGIN USART3_IRQn 0 */
+
+  /* USER CODE END USART3_IRQn 0 */
+  HAL_UART_IRQHandler(&huart3);
+  /* USER CODE BEGIN USART3_IRQn 1 */
+
+  /* USER CODE END USART3_IRQn 1 */
+}
+
+/**
   * @brief This function handles SDMMC1 global interrupt.
   */
@@ -221,3 +239,10 @@
 /* USER CODE BEGIN 1 */
 
+void HAL_UART_RxCpltCallback(UART_HandleTypeDef * huart)
+{
+	if (huart->Instance == USART3) gsmUnitSentData();
+}
+
+//------------------------------------------------------------------------------
+
 /* USER CODE END 1 */
Index: ctrl/firmware/Main/CubeMX/Core/Src/usart.c
===================================================================
--- ctrl/firmware/Main/CubeMX/Core/Src/usart.c	(revision 62)
+++ ctrl/firmware/Main/CubeMX/Core/Src/usart.c	(revision 63)
@@ -49,5 +49,7 @@
   huart3.Init.OneBitSampling = UART_ONE_BIT_SAMPLE_DISABLE;
   huart3.Init.ClockPrescaler = UART_PRESCALER_DIV1;
-  huart3.AdvancedInit.AdvFeatureInit = UART_ADVFEATURE_NO_INIT;
+  huart3.AdvancedInit.AdvFeatureInit = UART_ADVFEATURE_SWAP_INIT|UART_ADVFEATURE_DMADISABLEONERROR_INIT;
+  huart3.AdvancedInit.Swap = UART_ADVFEATURE_SWAP_ENABLE;
+  huart3.AdvancedInit.DMADisableonRxError = UART_ADVFEATURE_DMA_DISABLEONRXERROR;
   if (HAL_UART_Init(&huart3) != HAL_OK)
   {
@@ -107,6 +109,8 @@
     PD8     ------> USART3_TX
     PD9     ------> USART3_RX
+    PD11     ------> USART3_CTS
+    PD12     ------> USART3_RTS
     */
-    GPIO_InitStruct.Pin = GPIO_PIN_8|GPIO_PIN_9;
+    GPIO_InitStruct.Pin = GPIO_PIN_8|GPIO_PIN_9|GPIO_PIN_11|GPIO_PIN_12;
     GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
     GPIO_InitStruct.Pull = GPIO_NOPULL;
@@ -115,4 +119,7 @@
     HAL_GPIO_Init(GPIOD, &GPIO_InitStruct);
 
+    /* USART3 interrupt Init */
+    HAL_NVIC_SetPriority(USART3_IRQn, 0, 0);
+    HAL_NVIC_EnableIRQ(USART3_IRQn);
   /* USER CODE BEGIN USART3_MspInit 1 */
 
@@ -135,7 +142,11 @@
     PD8     ------> USART3_TX
     PD9     ------> USART3_RX
+    PD11     ------> USART3_CTS
+    PD12     ------> USART3_RTS
     */
-    HAL_GPIO_DeInit(GPIOD, GPIO_PIN_8|GPIO_PIN_9);
+    HAL_GPIO_DeInit(GPIOD, GPIO_PIN_8|GPIO_PIN_9|GPIO_PIN_11|GPIO_PIN_12);
 
+    /* USART3 interrupt Deinit */
+    HAL_NVIC_DisableIRQ(USART3_IRQn);
   /* USER CODE BEGIN USART3_MspDeInit 1 */
 
Index: ctrl/firmware/Main/CubeMX/charger.ioc
===================================================================
--- ctrl/firmware/Main/CubeMX/charger.ioc	(revision 62)
+++ ctrl/firmware/Main/CubeMX/charger.ioc	(revision 63)
@@ -57,30 +57,32 @@
 Mcu.Pin15=PD9
 Mcu.Pin16=PD10
-Mcu.Pin17=PD13
-Mcu.Pin18=PC8
-Mcu.Pin19=PC9
+Mcu.Pin17=PD11
+Mcu.Pin18=PD12
+Mcu.Pin19=PD13
 Mcu.Pin2=PC15-OSC32_OUT
-Mcu.Pin20=PA8
-Mcu.Pin21=PA13(JTMS/SWDIO)
-Mcu.Pin22=PA14(JTCK/SWCLK)
-Mcu.Pin23=PC10
-Mcu.Pin24=PC11
-Mcu.Pin25=PC12
-Mcu.Pin26=PD2
-Mcu.Pin27=PD7
-Mcu.Pin28=PG9
-Mcu.Pin29=PG10
+Mcu.Pin20=PC8
+Mcu.Pin21=PC9
+Mcu.Pin22=PA8
+Mcu.Pin23=PA13(JTMS/SWDIO)
+Mcu.Pin24=PA14(JTCK/SWCLK)
+Mcu.Pin25=PC10
+Mcu.Pin26=PC11
+Mcu.Pin27=PC12
+Mcu.Pin28=PD2
+Mcu.Pin29=PD7
 Mcu.Pin3=PH0-OSC_IN
-Mcu.Pin30=PG11
-Mcu.Pin31=PG12
-Mcu.Pin32=PG13
-Mcu.Pin33=PG15
-Mcu.Pin34=VP_RTC_VS_RTC_Activate
-Mcu.Pin35=VP_SYS_VS_tim7
-Mcu.Pin36=VP_MEMORYMAP_VS_MEMORYMAP
-Mcu.Pin37=VP_STMicroelectronics.X-CUBE-AZRTOS-H7_VS_RTOSJjThreadX_6.4.0_3.3.0
-Mcu.Pin38=VP_STMicroelectronics.X-CUBE-AZRTOS-H7_VS_FileOoSystemJjFileX_6.4.0_3.3.0
-Mcu.Pin39=VP_STMicroelectronics.X-CUBE-AZRTOS-H7_VS_FileOoSystemJjInterfaces_3.3.0_3.3.0
+Mcu.Pin30=PG9
+Mcu.Pin31=PG10
+Mcu.Pin32=PG11
+Mcu.Pin33=PG12
+Mcu.Pin34=PG13
+Mcu.Pin35=PG15
+Mcu.Pin36=VP_RTC_VS_RTC_Activate
+Mcu.Pin37=VP_SYS_VS_tim7
+Mcu.Pin38=VP_MEMORYMAP_VS_MEMORYMAP
+Mcu.Pin39=VP_STMicroelectronics.X-CUBE-AZRTOS-H7_VS_RTOSJjThreadX_6.4.0_3.3.0
 Mcu.Pin4=PH1-OSC_OUT
+Mcu.Pin40=VP_STMicroelectronics.X-CUBE-AZRTOS-H7_VS_FileOoSystemJjFileX_6.4.0_3.3.0
+Mcu.Pin41=VP_STMicroelectronics.X-CUBE-AZRTOS-H7_VS_FileOoSystemJjInterfaces_3.3.0_3.3.0
 Mcu.Pin5=PF15
 Mcu.Pin6=PG0
@@ -88,5 +90,5 @@
 Mcu.Pin8=PE7
 Mcu.Pin9=PE11
-Mcu.PinsNb=40
+Mcu.PinsNb=42
 Mcu.ThirdParty0=STMicroelectronics.X-CUBE-AZRTOS-H7.3.3.0
 Mcu.ThirdPartyNb=1
@@ -114,4 +116,5 @@
 NVIC.TimeBase=TIM7_IRQn
 NVIC.TimeBaseIP=TIM7
+NVIC.USART3_IRQn=true\:0\:0\:false\:false\:true\:false\:true\:true\:true
 NVIC.UsageFault_IRQn=true\:0\:0\:false\:false\:true\:false\:false\:false\:false
 PA13(JTMS/SWDIO).Mode=Serial_Wire
@@ -143,4 +146,8 @@
 PD10.Locked=true
 PD10.Signal=GPIO_Output
+PD11.Locked=true
+PD11.Signal=USART3_CTS
+PD12.Locked=true
+PD12.Signal=USART3_RTS
 PD13.GPIOParameters=GPIO_Label
 PD13.GPIO_Label=GSM_STATUS
@@ -378,5 +385,7 @@
 STMicroelectronics.X-CUBE-AZRTOS-H7.3.3.0_IsAnAzureRtosMw=true
 STMicroelectronics.X-CUBE-AZRTOS-H7.3.3.0_SwParameter=InterfacesCcFileOoSystemJjFileXOoSDOointerface\:true;ThreadXCcRTOSJjThreadXJjLowOoPowerOosupport\:true;FileXCcFileOoSystemJjFileXJjCore\:true;ThreadXCcRTOSJjThreadXJjCore\:true;
-USART3.IPParameters=VirtualMode-Asynchronous
+USART3.DMADisableonRxErrorParam=ADVFEATURE_DMA_DISABLEONRXERROR
+USART3.IPParameters=VirtualMode-Asynchronous,SwapParam,DMADisableonRxErrorParam
+USART3.SwapParam=ADVFEATURE_SWAP_ENABLE
 USART3.VirtualMode-Asynchronous=VM_ASYNC
 VP_MEMORYMAP_VS_MEMORYMAP.Mode=CurAppReg
