Index: ctrl/firmware/Main/CubeMX/Core/Inc/main.h
===================================================================
--- ctrl/firmware/Main/CubeMX/Core/Inc/main.h	(revision 105)
+++ ctrl/firmware/Main/CubeMX/Core/Inc/main.h	(revision 106)
@@ -84,12 +84,12 @@
 #define CHARGE_PWM_H_Pin GPIO_PIN_9
 #define CHARGE_PWM_H_GPIO_Port GPIOE
-#define SPI4_NSS_DISPLAY_Pin GPIO_PIN_11
-#define SPI4_NSS_DISPLAY_GPIO_Port GPIOE
-#define SPI4_SCK_DISPLAY_Pin GPIO_PIN_12
-#define SPI4_SCK_DISPLAY_GPIO_Port GPIOE
-#define PWM_DISPLAY_LIGHT_Pin GPIO_PIN_13
-#define PWM_DISPLAY_LIGHT_GPIO_Port GPIOE
-#define SPI4_MOSI_DISPLAY_Pin GPIO_PIN_14
-#define SPI4_MOSI_DISPLAY_GPIO_Port GPIOE
+#define DISPLAY_SPI_CS_Pin GPIO_PIN_11
+#define DISPLAY_SPI_CS_GPIO_Port GPIOE
+#define DISPLAY_SPI_SCK_Pin GPIO_PIN_12
+#define DISPLAY_SPI_SCK_GPIO_Port GPIOE
+#define DISPLAY_BACKLIGHT_PWM_Pin GPIO_PIN_13
+#define DISPLAY_BACKLIGHT_PWM_GPIO_Port GPIOE
+#define DISPLAY_SPI_MOSI_Pin GPIO_PIN_14
+#define DISPLAY_SPI_MOSI_GPIO_Port GPIOE
 #define RST_DISPLAY_Pin GPIO_PIN_15
 #define RST_DISPLAY_GPIO_Port GPIOE
Index: ctrl/firmware/Main/CubeMX/Core/Src/freertos.c
===================================================================
--- ctrl/firmware/Main/CubeMX/Core/Src/freertos.c	(revision 105)
+++ ctrl/firmware/Main/CubeMX/Core/Src/freertos.c	(revision 106)
@@ -38,4 +38,5 @@
 #include "bme_task.h"
 #include "gui_task.h"
+#include "fan_task.h"
 
 /* USER CODE END Includes */
@@ -57,4 +58,5 @@
 #define BME_TASK_STACK_DEPTH_WORDS					(256U)
 #define GUI_TASK_STACK_DEPTH_WORDS					(2048U)
+#define FAN_TASK_STACK_DEPTH_WORDS					(128U)
 
 /* USER CODE END PD */
@@ -75,4 +77,5 @@
 static StackType_t bmeTaskStackBuffer[BME_TASK_STACK_DEPTH_WORDS]						__attribute__((section(".DTCM_RAM")));
 static StackType_t guiTaskStackBuffer[GUI_TASK_STACK_DEPTH_WORDS]						__attribute__((section(".DTCM_RAM")));
+static StackType_t fanTaskStackBuffer[FAN_TASK_STACK_DEPTH_WORDS]						__attribute__((section(".DTCM_RAM")));
 
 static uint8_t beeperQueueStorageArea[BEEPER_QUEUE_SIZE * BEEPER_QUEUE_ITEM_SIZE]		__attribute__((section(".DTCM_RAM")));
@@ -86,4 +89,5 @@
 static StaticTask_t bmeTaskBuffer														__attribute__((section(".DTCM_RAM")));
 static StaticTask_t guiTaskBuffer														__attribute__((section(".DTCM_RAM")));
+static StaticTask_t fanTaskBuffer														__attribute__((section(".DTCM_RAM")));
 
 static StaticQueue_t beeperQueueBuffer													__attribute__((section(".DTCM_RAM")));
@@ -97,4 +101,5 @@
 static const char* const bmeTaskName = "BMETask";
 static const char* const guiTaskName = "GUITask";
+static const char* const fanTaskName = "GUITask";
 
 /* USER CODE END Variables */
@@ -205,4 +210,7 @@
   if (r == NULL) printf("Cannot create %s!\n", guiTaskName);
 
+  r = xTaskCreateStatic(fanTaskStart, fanTaskName, FAN_TASK_STACK_DEPTH_WORDS, NULL, 24, fanTaskStackBuffer, &fanTaskBuffer);
+  if (r == NULL) printf("Cannot create %s!\n", fanTaskName);
+
   /* USER CODE END RTOS_THREADS */
 
Index: ctrl/firmware/Main/CubeMX/Core/Src/gpio.c
===================================================================
--- ctrl/firmware/Main/CubeMX/Core/Src/gpio.c	(revision 105)
+++ ctrl/firmware/Main/CubeMX/Core/Src/gpio.c	(revision 106)
@@ -58,5 +58,5 @@
 
   /*Configure GPIO pin Output Level */
-  HAL_GPIO_WritePin(GPIOE, TX1_LED_Pin|POWER_15V_EN_Pin|PWM_DISPLAY_LIGHT_Pin|RST_DISPLAY_Pin, GPIO_PIN_RESET);
+  HAL_GPIO_WritePin(GPIOE, TX1_LED_Pin|POWER_15V_EN_Pin|RST_DISPLAY_Pin, GPIO_PIN_RESET);
 
   /*Configure GPIO pin Output Level */
@@ -90,6 +90,6 @@
   HAL_GPIO_Init(GPIOE, &GPIO_InitStruct);
 
-  /*Configure GPIO pins : TX1_LED_Pin POWER_15V_EN_Pin PWM_DISPLAY_LIGHT_Pin RST_DISPLAY_Pin */
-  GPIO_InitStruct.Pin = TX1_LED_Pin|POWER_15V_EN_Pin|PWM_DISPLAY_LIGHT_Pin|RST_DISPLAY_Pin;
+  /*Configure GPIO pins : TX1_LED_Pin POWER_15V_EN_Pin RST_DISPLAY_Pin */
+  GPIO_InitStruct.Pin = TX1_LED_Pin|POWER_15V_EN_Pin|RST_DISPLAY_Pin;
   GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
   GPIO_InitStruct.Pull = GPIO_NOPULL;
Index: ctrl/firmware/Main/CubeMX/Core/Src/spi.c
===================================================================
--- ctrl/firmware/Main/CubeMX/Core/Src/spi.c	(revision 105)
+++ ctrl/firmware/Main/CubeMX/Core/Src/spi.c	(revision 106)
@@ -93,5 +93,5 @@
   hspi4.Init.CLKPhase = SPI_PHASE_1EDGE;
   hspi4.Init.NSS = SPI_NSS_HARD_OUTPUT;
-  hspi4.Init.BaudRatePrescaler = SPI_BAUDRATEPRESCALER_4;
+  hspi4.Init.BaudRatePrescaler = SPI_BAUDRATEPRESCALER_2;
   hspi4.Init.FirstBit = SPI_FIRSTBIT_MSB;
   hspi4.Init.TIMode = SPI_TIMODE_DISABLE;
@@ -104,7 +104,7 @@
   hspi4.Init.RxCRCInitializationPattern = SPI_CRC_INITIALIZATION_ALL_ZERO_PATTERN;
   hspi4.Init.MasterSSIdleness = SPI_MASTER_SS_IDLENESS_00CYCLE;
-  hspi4.Init.MasterInterDataIdleness = SPI_MASTER_INTERDATA_IDLENESS_00CYCLE;
+  hspi4.Init.MasterInterDataIdleness = SPI_MASTER_INTERDATA_IDLENESS_02CYCLE;
   hspi4.Init.MasterReceiverAutoSusp = SPI_MASTER_RX_AUTOSUSP_DISABLE;
-  hspi4.Init.MasterKeepIOState = SPI_MASTER_KEEP_IO_STATE_DISABLE;
+  hspi4.Init.MasterKeepIOState = SPI_MASTER_KEEP_IO_STATE_ENABLE;
   hspi4.Init.IOSwap = SPI_IO_SWAP_DISABLE;
   if (HAL_SPI_Init(&hspi4) != HAL_OK)
@@ -230,5 +230,5 @@
     PE14     ------> SPI4_MOSI
     */
-    GPIO_InitStruct.Pin = SPI4_NSS_DISPLAY_Pin|SPI4_SCK_DISPLAY_Pin|SPI4_MOSI_DISPLAY_Pin;
+    GPIO_InitStruct.Pin = DISPLAY_SPI_CS_Pin|DISPLAY_SPI_SCK_Pin|DISPLAY_SPI_MOSI_Pin;
     GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
     GPIO_InitStruct.Pull = GPIO_NOPULL;
@@ -306,5 +306,5 @@
     PE14     ------> SPI4_MOSI
     */
-    HAL_GPIO_DeInit(GPIOE, SPI4_NSS_DISPLAY_Pin|SPI4_SCK_DISPLAY_Pin|SPI4_MOSI_DISPLAY_Pin);
+    HAL_GPIO_DeInit(GPIOE, DISPLAY_SPI_CS_Pin|DISPLAY_SPI_SCK_Pin|DISPLAY_SPI_MOSI_Pin);
 
     /* SPI4 DMA DeInit */
Index: ctrl/firmware/Main/CubeMX/Core/Src/tim.c
===================================================================
--- ctrl/firmware/Main/CubeMX/Core/Src/tim.c	(revision 105)
+++ ctrl/firmware/Main/CubeMX/Core/Src/tim.c	(revision 106)
@@ -53,5 +53,5 @@
   htim1.Init.Prescaler = 0;
   htim1.Init.CounterMode = TIM_COUNTERMODE_UP;
-  htim1.Init.Period = 800; // 1600
+  htim1.Init.Period = 1600;
   htim1.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;
   htim1.Init.RepetitionCounter = 0;
@@ -78,5 +78,5 @@
   }
   sConfigOC.OCMode = TIM_OCMODE_PWM1;
-  sConfigOC.Pulse = 200U;
+  sConfigOC.Pulse = 50U;
   sConfigOC.OCPolarity = TIM_OCPOLARITY_HIGH;
   sConfigOC.OCNPolarity = TIM_OCNPOLARITY_HIGH;
@@ -154,5 +154,5 @@
   }
   sConfigOC.OCMode = TIM_OCMODE_PWM1;
-  sConfigOC.Pulse = 200;
+  sConfigOC.Pulse = 155;
   sConfigOC.OCPolarity = TIM_OCPOLARITY_LOW;
   sConfigOC.OCFastMode = TIM_OCFAST_DISABLE;
Index: ctrl/firmware/Main/CubeMX/charger.ioc
===================================================================
--- ctrl/firmware/Main/CubeMX/charger.ioc	(revision 105)
+++ ctrl/firmware/Main/CubeMX/charger.ioc	(revision 106)
@@ -806,11 +806,12 @@
 SPI2.Mode=SPI_MODE_MASTER
 SPI2.VirtualType=VM_MASTER
-SPI4.BaudRatePrescaler=SPI_BAUDRATEPRESCALER_4
-SPI4.CalculateBaudRate=6.25 MBits/s
+SPI4.BaudRatePrescaler=SPI_BAUDRATEPRESCALER_2
+SPI4.CalculateBaudRate=12.5 MBits/s
 SPI4.DataSize=SPI_DATASIZE_9BIT
 SPI4.Direction=SPI_DIRECTION_1LINE
-SPI4.IPParameters=VirtualType,Mode,Direction,CalculateBaudRate,VirtualNSS,DataSize,BaudRatePrescaler,MasterSSIdleness,MasterInterDataIdleness
-SPI4.MasterInterDataIdleness=SPI_MASTER_INTERDATA_IDLENESS_01CYCLE
-SPI4.MasterSSIdleness=SPI_MASTER_SS_IDLENESS_01CYCLE
+SPI4.IPParameters=VirtualType,Mode,Direction,CalculateBaudRate,VirtualNSS,DataSize,BaudRatePrescaler,MasterSSIdleness,MasterInterDataIdleness,MasterKeepIOState
+SPI4.MasterInterDataIdleness=SPI_MASTER_INTERDATA_IDLENESS_00CYCLE
+SPI4.MasterKeepIOState=SPI_MASTER_KEEP_IO_STATE_ENABLE
+SPI4.MasterSSIdleness=SPI_MASTER_SS_IDLENESS_02CYCLE
 SPI4.Mode=SPI_MODE_MASTER
 SPI4.VirtualNSS=VM_NSSHARD
