Index: ctrl/firmware/Main/CubeMX/Core/Inc/main.h
===================================================================
--- ctrl/firmware/Main/CubeMX/Core/Inc/main.h	(revision 83)
+++ ctrl/firmware/Main/CubeMX/Core/Inc/main.h	(revision 84)
@@ -98,4 +98,6 @@
 #define SD_DETECT_Pin GPIO_PIN_8
 #define SD_DETECT_GPIO_Port GPIOA
+#define ONEWIRE_TEMP_BUS_Pin GPIO_PIN_15
+#define ONEWIRE_TEMP_BUS_GPIO_Port GPIOA
 #define ETH_SPI_PWR_Pin GPIO_PIN_3
 #define ETH_SPI_PWR_GPIO_Port GPIOD
Index: ctrl/firmware/Main/CubeMX/Core/Inc/tim.h
===================================================================
--- ctrl/firmware/Main/CubeMX/Core/Inc/tim.h	(revision 83)
+++ ctrl/firmware/Main/CubeMX/Core/Inc/tim.h	(revision 84)
@@ -35,4 +35,6 @@
 extern TIM_HandleTypeDef htim3;
 
+extern TIM_HandleTypeDef htim6;
+
 extern TIM_HandleTypeDef htim8;
 
@@ -42,4 +44,5 @@
 
 void MX_TIM3_Init(void);
+void MX_TIM6_Init(void);
 void MX_TIM8_Init(void);
 
Index: ctrl/firmware/Main/CubeMX/Core/Src/freertos.c
===================================================================
--- ctrl/firmware/Main/CubeMX/Core/Src/freertos.c	(revision 83)
+++ ctrl/firmware/Main/CubeMX/Core/Src/freertos.c	(revision 84)
@@ -23,5 +23,4 @@
 #include "main.h"
 #include "cmsis_os.h"
-#include "queue.h"
 
 /* Private includes ----------------------------------------------------------*/
@@ -29,4 +28,6 @@
 
 #include <stdio.h>
+
+#include "queue.h"
 
 #include "keys_task.h"
@@ -34,4 +35,5 @@
 #include "mb_slave_task.h"
 #include "beeper_task.h"
+#include "onewire_task.h"
 
 /* USER CODE END Includes */
@@ -50,4 +52,5 @@
 #define MB_SLAVE_TASK_STACK_DEPTH_WORDS				(1024U)
 #define BEEPER_TASK_STACK_DEPTH_WORDS				(128U)
+#define ONEWIRE_TASK_STACK_DEPTH_WORDS				(128U)
 
 /* USER CODE END PD */
@@ -65,11 +68,17 @@
 static StackType_t mbSlaveTaskStackBuffer[MB_SLAVE_TASK_STACK_DEPTH_WORDS]				__attribute__((section(".DTCM_RAM")));
 static StackType_t beeperTaskStackBuffer[BEEPER_TASK_STACK_DEPTH_WORDS]					__attribute__((section(".DTCM_RAM")));
+static StackType_t onewireTaskStackBuffer[ONEWIRE_TASK_STACK_DEPTH_WORDS]				__attribute__((section(".DTCM_RAM")));
+
 static uint8_t beeperQueueStorageArea[BEEPER_QUEUE_SIZE * BEEPER_QUEUE_ITEM_SIZE]		__attribute__((section(".DTCM_RAM")));
-
-static StaticTask_t keysTaskBuffer;
-static StaticTask_t ethTaskBuffer;
-static StaticTask_t mbSlaveTaskBuffer;
-static StaticTask_t beeperTaskBuffer;
-static StaticQueue_t beeperQueueBuffer;
+static uint8_t onewireQueueStorageArea[ONEWIRE_QUEUE_SIZE * ONEWIRE_QUEUE_ITEM_SIZE]	__attribute__((section(".DTCM_RAM")));
+
+static StaticTask_t keysTaskBuffer														__attribute__((section(".DTCM_RAM")));
+static StaticTask_t ethTaskBuffer														__attribute__((section(".DTCM_RAM")));
+static StaticTask_t mbSlaveTaskBuffer													__attribute__((section(".DTCM_RAM")));
+static StaticTask_t beeperTaskBuffer													__attribute__((section(".DTCM_RAM")));
+static StaticTask_t onewireTaskBuffer													__attribute__((section(".DTCM_RAM")));
+
+static StaticQueue_t beeperQueueBuffer													__attribute__((section(".DTCM_RAM")));
+static StaticQueue_t onewireQueueBuffer													__attribute__((section(".DTCM_RAM")));
 
 static const char* const keysTaskName = "ScanKeysTask";
@@ -77,5 +86,5 @@
 static const char* const mbSlaveTaskName = "MBSlaveTask";
 static const char* const beeperTaskName = "BeeperTask";
-
+static const char* const onewireTaskName = "1WireTask";
 
 
@@ -154,4 +163,7 @@
   if (beeperQueue == NULL) printf("Cannot create Beeper Queue!\n");
 
+  onewireQueue = xQueueCreateStatic(ONEWIRE_QUEUE_SIZE, ONEWIRE_QUEUE_ITEM_SIZE, onewireQueueStorageArea, &onewireQueueBuffer);
+  if (onewireQueue == NULL) printf("Cannot create 1-Wire Queue!\n");
+
   /* USER CODE END RTOS_QUEUES */
 
@@ -174,4 +186,7 @@
   r = xTaskCreateStatic(beeperTaskStart, beeperTaskName, BEEPER_TASK_STACK_DEPTH_WORDS, NULL, 25, beeperTaskStackBuffer, &beeperTaskBuffer);
   if (r == NULL) printf("Cannot create %s!\n", beeperTaskName);
+
+  r = xTaskCreateStatic(onewireTaskStart, onewireTaskName, ONEWIRE_TASK_STACK_DEPTH_WORDS, NULL, 25, onewireTaskStackBuffer, &onewireTaskBuffer);
+  if (r == NULL) printf("Cannot create %s!\n", onewireTaskName);
 
   /* USER CODE END RTOS_THREADS */
Index: ctrl/firmware/Main/CubeMX/Core/Src/gpio.c
===================================================================
--- ctrl/firmware/Main/CubeMX/Core/Src/gpio.c	(revision 83)
+++ ctrl/firmware/Main/CubeMX/Core/Src/gpio.c	(revision 84)
@@ -71,4 +71,7 @@
 
   /*Configure GPIO pin Output Level */
+  HAL_GPIO_WritePin(ONEWIRE_TEMP_BUS_GPIO_Port, ONEWIRE_TEMP_BUS_Pin, GPIO_PIN_RESET);
+
+  /*Configure GPIO pin Output Level */
   HAL_GPIO_WritePin(ETH_SPI_PWR_GPIO_Port, ETH_SPI_PWR_Pin, GPIO_PIN_SET);
 
@@ -116,10 +119,8 @@
   /*Configure GPIO pins : PA0 PA1 PA2 PA3
                            PA4 PA5 PA6 PA7
-                           PA9 PA10 PA11 PA12
-                           PA15 */
+                           PA9 PA10 PA11 PA12 */
   GPIO_InitStruct.Pin = GPIO_PIN_0|GPIO_PIN_1|GPIO_PIN_2|GPIO_PIN_3
                           |GPIO_PIN_4|GPIO_PIN_5|GPIO_PIN_6|GPIO_PIN_7
-                          |GPIO_PIN_9|GPIO_PIN_10|GPIO_PIN_11|GPIO_PIN_12
-                          |GPIO_PIN_15;
+                          |GPIO_PIN_9|GPIO_PIN_10|GPIO_PIN_11|GPIO_PIN_12;
   GPIO_InitStruct.Mode = GPIO_MODE_ANALOG;
   GPIO_InitStruct.Pull = GPIO_NOPULL;
@@ -185,4 +186,11 @@
   HAL_GPIO_Init(SD_DETECT_GPIO_Port, &GPIO_InitStruct);
 
+  /*Configure GPIO pin : ONEWIRE_TEMP_BUS_Pin */
+  GPIO_InitStruct.Pin = ONEWIRE_TEMP_BUS_Pin;
+  GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
+  GPIO_InitStruct.Pull = GPIO_NOPULL;
+  GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
+  HAL_GPIO_Init(ONEWIRE_TEMP_BUS_GPIO_Port, &GPIO_InitStruct);
+
   /*Configure GPIO pins : ETH_SPI_NSS_Pin ETH_SPI_RST_Pin */
   GPIO_InitStruct.Pin = ETH_SPI_NSS_Pin|ETH_SPI_RST_Pin;
Index: ctrl/firmware/Main/CubeMX/Core/Src/main.c
===================================================================
--- ctrl/firmware/Main/CubeMX/Core/Src/main.c	(revision 83)
+++ ctrl/firmware/Main/CubeMX/Core/Src/main.c	(revision 84)
@@ -136,4 +136,5 @@
   MX_USART2_UART_Init();
   MX_USART10_UART_Init();
+  MX_TIM6_Init();
   /* USER CODE BEGIN 2 */
 
Index: ctrl/firmware/Main/CubeMX/Core/Src/tim.c
===================================================================
--- ctrl/firmware/Main/CubeMX/Core/Src/tim.c	(revision 83)
+++ ctrl/firmware/Main/CubeMX/Core/Src/tim.c	(revision 84)
@@ -26,4 +26,5 @@
 
 TIM_HandleTypeDef htim3;
+TIM_HandleTypeDef htim6;
 TIM_HandleTypeDef htim8;
 
@@ -82,4 +83,41 @@
   /* USER CODE END TIM3_Init 2 */
   HAL_TIM_MspPostInit(&htim3);
+
+}
+/* TIM6 init function */
+void MX_TIM6_Init(void)
+{
+
+  /* USER CODE BEGIN TIM6_Init 0 */
+
+  /* USER CODE END TIM6_Init 0 */
+
+  TIM_MasterConfigTypeDef sMasterConfig = {0};
+
+  /* USER CODE BEGIN TIM6_Init 1 */
+
+  /* USER CODE END TIM6_Init 1 */
+  htim6.Instance = TIM6;
+  htim6.Init.Prescaler = 99;
+  htim6.Init.CounterMode = TIM_COUNTERMODE_UP;
+  htim6.Init.Period = 65535;
+  htim6.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_ENABLE;
+  if (HAL_TIM_Base_Init(&htim6) != HAL_OK)
+  {
+    Error_Handler();
+  }
+  if (HAL_TIM_OnePulse_Init(&htim6, TIM_OPMODE_SINGLE) != HAL_OK)
+  {
+    Error_Handler();
+  }
+  sMasterConfig.MasterOutputTrigger = TIM_TRGO_RESET;
+  sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE;
+  if (HAL_TIMEx_MasterConfigSynchronization(&htim6, &sMasterConfig) != HAL_OK)
+  {
+    Error_Handler();
+  }
+  /* USER CODE BEGIN TIM6_Init 2 */
+
+  /* USER CODE END TIM6_Init 2 */
 
 }
@@ -167,4 +205,15 @@
 
   /* USER CODE END TIM3_MspInit 1 */
+  }
+  else if(tim_baseHandle->Instance==TIM6)
+  {
+  /* USER CODE BEGIN TIM6_MspInit 0 */
+
+  /* USER CODE END TIM6_MspInit 0 */
+    /* TIM6 clock enable */
+    __HAL_RCC_TIM6_CLK_ENABLE();
+  /* USER CODE BEGIN TIM6_MspInit 1 */
+
+  /* USER CODE END TIM6_MspInit 1 */
   }
   else if(tim_baseHandle->Instance==TIM8)
@@ -243,4 +292,15 @@
   /* USER CODE END TIM3_MspDeInit 1 */
   }
+  else if(tim_baseHandle->Instance==TIM6)
+  {
+  /* USER CODE BEGIN TIM6_MspDeInit 0 */
+
+  /* USER CODE END TIM6_MspDeInit 0 */
+    /* Peripheral clock disable */
+    __HAL_RCC_TIM6_CLK_DISABLE();
+  /* USER CODE BEGIN TIM6_MspDeInit 1 */
+
+  /* USER CODE END TIM6_MspDeInit 1 */
+  }
   else if(tim_baseHandle->Instance==TIM8)
   {
Index: ctrl/firmware/Main/CubeMX/charger.ioc
===================================================================
--- ctrl/firmware/Main/CubeMX/charger.ioc	(revision 83)
+++ ctrl/firmware/Main/CubeMX/charger.ioc	(revision 84)
@@ -215,8 +215,9 @@
 Mcu.IP13=SYS
 Mcu.IP14=TIM3
-Mcu.IP15=TIM8
-Mcu.IP16=USART2
-Mcu.IP17=USART3
-Mcu.IP18=USART10
+Mcu.IP15=TIM6
+Mcu.IP16=TIM8
+Mcu.IP17=USART2
+Mcu.IP18=USART3
+Mcu.IP19=USART10
 Mcu.IP2=DMA
 Mcu.IP3=FATFS
@@ -227,5 +228,5 @@
 Mcu.IP8=RCC
 Mcu.IP9=RTC
-Mcu.IPNb=19
+Mcu.IPNb=20
 Mcu.Name=STM32H723ZETx
 Mcu.Package=LQFP144
@@ -256,39 +257,42 @@
 Mcu.Pin30=PA13(JTMS/SWDIO)
 Mcu.Pin31=PA14(JTCK/SWCLK)
-Mcu.Pin32=PC10
-Mcu.Pin33=PC11
-Mcu.Pin34=PC12
-Mcu.Pin35=PD2
-Mcu.Pin36=PD3
-Mcu.Pin37=PD4
-Mcu.Pin38=PD5
-Mcu.Pin39=PD6
+Mcu.Pin32=PA15(JTDI)
+Mcu.Pin33=PC10
+Mcu.Pin34=PC11
+Mcu.Pin35=PC12
+Mcu.Pin36=PD2
+Mcu.Pin37=PD3
+Mcu.Pin38=PD4
+Mcu.Pin39=PD5
 Mcu.Pin4=PC15-OSC32_OUT
-Mcu.Pin40=PD7
-Mcu.Pin41=PG9
-Mcu.Pin42=PG10
-Mcu.Pin43=PG11
-Mcu.Pin44=PG12
-Mcu.Pin45=PG13
-Mcu.Pin46=PG14
-Mcu.Pin47=PG15
-Mcu.Pin48=PB4(NJTRST)
-Mcu.Pin49=PB8
+Mcu.Pin40=PD6
+Mcu.Pin41=PD7
+Mcu.Pin42=PG9
+Mcu.Pin43=PG10
+Mcu.Pin44=PG11
+Mcu.Pin45=PG12
+Mcu.Pin46=PG13
+Mcu.Pin47=PG14
+Mcu.Pin48=PG15
+Mcu.Pin49=PB4(NJTRST)
 Mcu.Pin5=PH0-OSC_IN
-Mcu.Pin50=PB9
-Mcu.Pin51=VP_FATFS_VS_SDIO
-Mcu.Pin52=VP_FREERTOS_VS_CMSIS_V2
-Mcu.Pin53=VP_RTC_VS_RTC_Activate
-Mcu.Pin54=VP_RTC_VS_RTC_Calendar
-Mcu.Pin55=VP_SYS_VS_tim7
-Mcu.Pin56=VP_TIM3_VS_ClockSourceINT
-Mcu.Pin57=VP_TIM8_VS_ControllerModeReset
-Mcu.Pin58=VP_TIM8_VS_ClockSourceINT
-Mcu.Pin59=VP_MEMORYMAP_VS_MEMORYMAP
+Mcu.Pin50=PB8
+Mcu.Pin51=PB9
+Mcu.Pin52=VP_FATFS_VS_SDIO
+Mcu.Pin53=VP_FREERTOS_VS_CMSIS_V2
+Mcu.Pin54=VP_RTC_VS_RTC_Activate
+Mcu.Pin55=VP_RTC_VS_RTC_Calendar
+Mcu.Pin56=VP_SYS_VS_tim7
+Mcu.Pin57=VP_TIM3_VS_ClockSourceINT
+Mcu.Pin58=VP_TIM6_VS_ClockSourceINT
+Mcu.Pin59=VP_TIM6_VS_OPM
 Mcu.Pin6=PH1-OSC_OUT
+Mcu.Pin60=VP_TIM8_VS_ControllerModeReset
+Mcu.Pin61=VP_TIM8_VS_ClockSourceINT
+Mcu.Pin62=VP_MEMORYMAP_VS_MEMORYMAP
 Mcu.Pin7=PF15
 Mcu.Pin8=PG0
 Mcu.Pin9=PG1
-Mcu.PinsNb=60
+Mcu.PinsNb=63
 Mcu.ThirdParty0=STMicroelectronics.X-CUBE-AZRTOS-H7.3.3.0
 Mcu.ThirdPartyNb=1
@@ -360,4 +364,9 @@
 PA14(JTCK/SWCLK).Mode=Serial_Wire
 PA14(JTCK/SWCLK).Signal=DEBUG_JTCK-SWCLK
+PA15(JTDI).GPIOParameters=GPIO_PuPd,GPIO_Label
+PA15(JTDI).GPIO_Label=ONEWIRE_TEMP_BUS
+PA15(JTDI).GPIO_PuPd=GPIO_NOPULL
+PA15(JTDI).Locked=true
+PA15(JTDI).Signal=GPIO_Output
 PA8.GPIOParameters=GPIO_PuPd,GPIO_Label
 PA8.GPIO_Label=SD_DETECT
@@ -579,5 +588,5 @@
 ProjectManager.UAScriptBeforePath=
 ProjectManager.UnderRoot=true
-ProjectManager.functionlistsort=1-MX_GPIO_Init-GPIO-false-HAL-true,2-MX_DMA_Init-DMA-false-HAL-true,3-MX_MDMA_Init-MDMA-false-HAL-true,4-MX_RTC_Init-RTC-false-HAL-true,5-MX_SPI4_Init-SPI4-false-HAL-true,6-MX_SDMMC1_SD_Init-SDMMC1-false-HAL-true,7-MX_USART3_UART_Init-USART3-false-HAL-true,8-MX_TIM3_Init-TIM3-false-HAL-true,9-SystemClock_Config-RCC-false-HAL-false,10-MX_FATFS_Init-FATFS-false-HAL-false,11-MX_TIM8_Init-TIM8-false-HAL-true,12-MX_SPI2_Init-SPI2-false-HAL-true,13-MX_USART2_UART_Init-USART2-false-HAL-true,14-MX_USART10_UART_Init-USART10-false-HAL-true,0-MX_CORTEX_M7_Init-CORTEX_M7-false-HAL-true
+ProjectManager.functionlistsort=1-MX_GPIO_Init-GPIO-false-HAL-true,2-MX_DMA_Init-DMA-false-HAL-true,3-MX_MDMA_Init-MDMA-false-HAL-true,4-MX_RTC_Init-RTC-false-HAL-true,5-MX_SPI4_Init-SPI4-false-HAL-true,6-MX_SDMMC1_SD_Init-SDMMC1-false-HAL-true,7-MX_USART3_UART_Init-USART3-false-HAL-true,8-MX_TIM3_Init-TIM3-false-HAL-true,9-SystemClock_Config-RCC-false-HAL-false,10-MX_FATFS_Init-FATFS-false-HAL-false,11-MX_TIM8_Init-TIM8-false-HAL-true,12-MX_SPI2_Init-SPI2-false-HAL-true,13-MX_USART2_UART_Init-USART2-false-HAL-true,14-MX_USART10_UART_Init-USART10-false-HAL-true,15-MX_TIM6_Init-TIM6-false-HAL-true,0-MX_CORTEX_M7_Init-CORTEX_M7-false-HAL-true
 RCC.ADCFreq_Value=125000000
 RCC.AHB12Freq_Value=100000000
@@ -663,5 +672,5 @@
 RCC.VCOInput2Freq_Value=12500000
 RCC.VCOInput3Freq_Value=1000000
-SDMMC1.ClockDiv=1
+SDMMC1.ClockDiv=2
 SDMMC1.ClockPowerSave=SDMMC_CLOCK_POWER_SAVE_ENABLE
 SDMMC1.HardwareFlowControl=SDMMC_HARDWARE_FLOW_CONTROL_ENABLE
@@ -721,4 +730,7 @@
 TIM3.Prescaler=3
 TIM3.Pulse-PWM\ Generation2\ CH2=200
+TIM6.AutoReloadPreload=TIM_AUTORELOAD_PRELOAD_ENABLE
+TIM6.IPParameters=AutoReloadPreload,Prescaler
+TIM6.Prescaler=99
 TIM8.AutoReloadPreload=TIM_AUTORELOAD_PRELOAD_ENABLE
 TIM8.Channel-Input_Capture1_from_TI1=TIM_CHANNEL_1
@@ -751,4 +763,8 @@
 VP_TIM3_VS_ClockSourceINT.Mode=Internal
 VP_TIM3_VS_ClockSourceINT.Signal=TIM3_VS_ClockSourceINT
+VP_TIM6_VS_ClockSourceINT.Mode=Enable_Timer
+VP_TIM6_VS_ClockSourceINT.Signal=TIM6_VS_ClockSourceINT
+VP_TIM6_VS_OPM.Mode=OPM_bit
+VP_TIM6_VS_OPM.Signal=TIM6_VS_OPM
 VP_TIM8_VS_ClockSourceINT.Mode=Internal
 VP_TIM8_VS_ClockSourceINT.Signal=TIM8_VS_ClockSourceINT
