Index: trunk/fw_g473rct/Core/Inc/main.h
===================================================================
--- trunk/fw_g473rct/Core/Inc/main.h	(revision 20)
+++ trunk/fw_g473rct/Core/Inc/main.h	(revision 22)
@@ -70,6 +70,4 @@
 #define ADC2_IN3_UBAT__Pin GPIO_PIN_6
 #define ADC2_IN3_UBAT__GPIO_Port GPIOA
-#define ADC2_IN4_UBAT__Pin GPIO_PIN_7
-#define ADC2_IN4_UBAT__GPIO_Port GPIOA
 #define ADC3_IN12_MOSFET_TEMP_Pin GPIO_PIN_0
 #define ADC3_IN12_MOSFET_TEMP_GPIO_Port GPIOB
Index: trunk/fw_g473rct/Core/Inc/stm32g4xx_it.h
===================================================================
--- trunk/fw_g473rct/Core/Inc/stm32g4xx_it.h	(revision 20)
+++ trunk/fw_g473rct/Core/Inc/stm32g4xx_it.h	(revision 22)
@@ -61,4 +61,7 @@
 void DMA1_Channel4_IRQHandler(void);
 void DMA1_Channel5_IRQHandler(void);
+void DMA1_Channel6_IRQHandler(void);
+void USART1_IRQHandler(void);
+void USART2_IRQHandler(void);
 /* USER CODE BEGIN EFP */
 
Index: trunk/fw_g473rct/Core/Src/adc.c
===================================================================
--- trunk/fw_g473rct/Core/Src/adc.c	(revision 20)
+++ trunk/fw_g473rct/Core/Src/adc.c	(revision 22)
@@ -59,5 +59,5 @@
   hadc1.Init.GainCompensation = 0;
   hadc1.Init.ScanConvMode = ADC_SCAN_DISABLE;
-  hadc1.Init.EOCSelection = ADC_EOC_SEQ_CONV;
+  hadc1.Init.EOCSelection = ADC_EOC_SINGLE_CONV;
   hadc1.Init.LowPowerAutoWait = DISABLE;
   hadc1.Init.ContinuousConvMode = ENABLE;
@@ -68,5 +68,9 @@
   hadc1.Init.DMAContinuousRequests = ENABLE;
   hadc1.Init.Overrun = ADC_OVR_DATA_OVERWRITTEN;
-  hadc1.Init.OversamplingMode = DISABLE;
+  hadc1.Init.OversamplingMode = ENABLE;
+  hadc1.Init.Oversampling.Ratio = ADC_OVERSAMPLING_RATIO_256;
+  hadc1.Init.Oversampling.RightBitShift = ADC_RIGHTBITSHIFT_4;
+  hadc1.Init.Oversampling.TriggeredMode = ADC_TRIGGEREDMODE_SINGLE_TRIGGER;
+  hadc1.Init.Oversampling.OversamplingStopReset = ADC_REGOVERSAMPLING_CONTINUED_MODE;
   if (HAL_ADC_Init(&hadc1) != HAL_OK)
   {
@@ -88,5 +92,5 @@
   sConfig.Channel = ADC_CHANNEL_1;
   sConfig.Rank = ADC_REGULAR_RANK_1;
-  sConfig.SamplingTime = ADC_SAMPLETIME_2CYCLES_5;
+  sConfig.SamplingTime = ADC_SAMPLETIME_640CYCLES_5;
   sConfig.SingleDiff = ADC_DIFFERENTIAL_ENDED;
   sConfig.OffsetNumber = ADC_OFFSET_NONE;
@@ -123,5 +127,5 @@
   hadc2.Init.GainCompensation = 0;
   hadc2.Init.ScanConvMode = ADC_SCAN_DISABLE;
-  hadc2.Init.EOCSelection = ADC_EOC_SEQ_CONV;
+  hadc2.Init.EOCSelection = ADC_EOC_SINGLE_CONV;
   hadc2.Init.LowPowerAutoWait = DISABLE;
   hadc2.Init.ContinuousConvMode = ENABLE;
@@ -130,5 +134,9 @@
   hadc2.Init.DMAContinuousRequests = ENABLE;
   hadc2.Init.Overrun = ADC_OVR_DATA_OVERWRITTEN;
-  hadc2.Init.OversamplingMode = DISABLE;
+  hadc2.Init.OversamplingMode = ENABLE;
+  hadc2.Init.Oversampling.Ratio = ADC_OVERSAMPLING_RATIO_256;
+  hadc2.Init.Oversampling.RightBitShift = ADC_RIGHTBITSHIFT_4;
+  hadc2.Init.Oversampling.TriggeredMode = ADC_TRIGGEREDMODE_SINGLE_TRIGGER;
+  hadc2.Init.Oversampling.OversamplingStopReset = ADC_REGOVERSAMPLING_CONTINUED_MODE;
   if (HAL_ADC_Init(&hadc2) != HAL_OK)
   {
@@ -140,6 +148,6 @@
   sConfig.Channel = ADC_CHANNEL_3;
   sConfig.Rank = ADC_REGULAR_RANK_1;
-  sConfig.SamplingTime = ADC_SAMPLETIME_2CYCLES_5;
-  sConfig.SingleDiff = ADC_DIFFERENTIAL_ENDED;
+  sConfig.SamplingTime = ADC_SAMPLETIME_640CYCLES_5;
+  sConfig.SingleDiff = ADC_SINGLE_ENDED;
   sConfig.OffsetNumber = ADC_OFFSET_NONE;
   sConfig.Offset = 0;
@@ -396,5 +404,5 @@
     hdma_adc1.Init.PeriphInc = DMA_PINC_DISABLE;
     hdma_adc1.Init.MemInc = DMA_MINC_ENABLE;
-    hdma_adc1.Init.PeriphDataAlignment = DMA_PDATAALIGN_HALFWORD;
+    hdma_adc1.Init.PeriphDataAlignment = DMA_PDATAALIGN_WORD;
     hdma_adc1.Init.MemDataAlignment = DMA_MDATAALIGN_WORD;
     hdma_adc1.Init.Mode = DMA_CIRCULAR;
@@ -435,10 +443,9 @@
     /**ADC2 GPIO Configuration
     PA6     ------> ADC2_IN3
-    PA7     ------> ADC2_IN4
-    */
-    GPIO_InitStruct.Pin = ADC2_IN3_UBAT__Pin|ADC2_IN4_UBAT__Pin;
+    */
+    GPIO_InitStruct.Pin = ADC2_IN3_UBAT__Pin;
     GPIO_InitStruct.Mode = GPIO_MODE_ANALOG;
     GPIO_InitStruct.Pull = GPIO_NOPULL;
-    HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
+    HAL_GPIO_Init(ADC2_IN3_UBAT__GPIO_Port, &GPIO_InitStruct);
 
     /* ADC2 DMA Init */
@@ -449,5 +456,5 @@
     hdma_adc2.Init.PeriphInc = DMA_PINC_DISABLE;
     hdma_adc2.Init.MemInc = DMA_MINC_ENABLE;
-    hdma_adc2.Init.PeriphDataAlignment = DMA_PDATAALIGN_HALFWORD;
+    hdma_adc2.Init.PeriphDataAlignment = DMA_PDATAALIGN_WORD;
     hdma_adc2.Init.MemDataAlignment = DMA_MDATAALIGN_WORD;
     hdma_adc2.Init.Mode = DMA_CIRCULAR;
@@ -665,7 +672,6 @@
     /**ADC2 GPIO Configuration
     PA6     ------> ADC2_IN3
-    PA7     ------> ADC2_IN4
-    */
-    HAL_GPIO_DeInit(GPIOA, ADC2_IN3_UBAT__Pin|ADC2_IN4_UBAT__Pin);
+    */
+    HAL_GPIO_DeInit(ADC2_IN3_UBAT__GPIO_Port, ADC2_IN3_UBAT__Pin);
 
     /* ADC2 DMA DeInit */
Index: trunk/fw_g473rct/Core/Src/dma.c
===================================================================
--- trunk/fw_g473rct/Core/Src/dma.c	(revision 20)
+++ trunk/fw_g473rct/Core/Src/dma.c	(revision 22)
@@ -60,4 +60,7 @@
   HAL_NVIC_SetPriority(DMA1_Channel5_IRQn, 0, 0);
   HAL_NVIC_EnableIRQ(DMA1_Channel5_IRQn);
+  /* DMA1_Channel6_IRQn interrupt configuration */
+  HAL_NVIC_SetPriority(DMA1_Channel6_IRQn, 0, 0);
+  HAL_NVIC_EnableIRQ(DMA1_Channel6_IRQn);
 
 }
Index: trunk/fw_g473rct/Core/Src/stm32g4xx_hal_msp.c
===================================================================
--- trunk/fw_g473rct/Core/Src/stm32g4xx_hal_msp.c	(revision 20)
+++ trunk/fw_g473rct/Core/Src/stm32g4xx_hal_msp.c	(revision 22)
@@ -73,4 +73,12 @@
   /* System interrupt init*/
 
+  /** Configure the internal voltage reference buffer high impedance mode
+  */
+  HAL_SYSCFG_VREFBUF_HighImpedanceConfig(SYSCFG_VREFBUF_HIGH_IMPEDANCE_ENABLE);
+
+  /** Disable the Internal Voltage Reference buffer
+  */
+  HAL_SYSCFG_DisableVREFBUF();
+
   /** Disable the internal Pull-Up in Dead Battery pins of UCPD peripheral
   */
Index: trunk/fw_g473rct/Core/Src/stm32g4xx_it.c
===================================================================
--- trunk/fw_g473rct/Core/Src/stm32g4xx_it.c	(revision 20)
+++ trunk/fw_g473rct/Core/Src/stm32g4xx_it.c	(revision 22)
@@ -23,4 +23,5 @@
 /* Private includes ----------------------------------------------------------*/
 /* USER CODE BEGIN Includes */
+#include "modbus.h"
 /* USER CODE END Includes */
 
@@ -61,4 +62,7 @@
 extern DMA_HandleTypeDef hdma_adc4;
 extern DMA_HandleTypeDef hdma_adc5;
+extern DMA_HandleTypeDef hdma_usart2_rx;
+extern UART_HandleTypeDef huart1;
+extern UART_HandleTypeDef huart2;
 /* USER CODE BEGIN EV */
 
@@ -273,4 +277,46 @@
 }
 
+/**
+  * @brief This function handles DMA1 channel6 global interrupt.
+  */
+void DMA1_Channel6_IRQHandler(void)
+{
+  /* USER CODE BEGIN DMA1_Channel6_IRQn 0 */
+
+  /* USER CODE END DMA1_Channel6_IRQn 0 */
+  HAL_DMA_IRQHandler(&hdma_usart2_rx);
+  /* USER CODE BEGIN DMA1_Channel6_IRQn 1 */
+
+  /* USER CODE END DMA1_Channel6_IRQn 1 */
+}
+
+/**
+  * @brief This function handles USART1 global interrupt / USART1 wake-up interrupt through EXTI line 25.
+  */
+void USART1_IRQHandler(void)
+{
+  /* USER CODE BEGIN USART1_IRQn 0 */
+
+  /* USER CODE END USART1_IRQn 0 */
+  HAL_UART_IRQHandler(&huart1);
+  /* USER CODE BEGIN USART1_IRQn 1 */
+
+  /* USER CODE END USART1_IRQn 1 */
+}
+
+/**
+  * @brief This function handles USART2 global interrupt / USART2 wake-up interrupt through EXTI line 26.
+  */
+void USART2_IRQHandler(void)
+{
+  /* USER CODE BEGIN USART2_IRQn 0 */
+
+  /* USER CODE END USART2_IRQn 0 */
+  HAL_UART_IRQHandler(&huart2);
+  /* USER CODE BEGIN USART2_IRQn 1 */
+//MODBUS_UART_IRQHandler(&huart2);
+  /* USER CODE END USART2_IRQn 1 */
+}
+
 /* USER CODE BEGIN 1 */
 
Index: trunk/fw_g473rct/Core/Src/usart.c
===================================================================
--- trunk/fw_g473rct/Core/Src/usart.c	(revision 20)
+++ trunk/fw_g473rct/Core/Src/usart.c	(revision 22)
@@ -27,4 +27,5 @@
 UART_HandleTypeDef huart1;
 UART_HandleTypeDef huart2;
+DMA_HandleTypeDef hdma_usart2_rx;
 
 /* USART1 init function */
@@ -86,7 +87,7 @@
   huart2.Instance = USART2;
   huart2.Init.BaudRate = 115200;
-  huart2.Init.WordLength = UART_WORDLENGTH_8B;
+  huart2.Init.WordLength = UART_WORDLENGTH_9B;
   huart2.Init.StopBits = UART_STOPBITS_1;
-  huart2.Init.Parity = UART_PARITY_NONE;
+  huart2.Init.Parity = UART_PARITY_EVEN;
   huart2.Init.Mode = UART_MODE_TX_RX;
   huart2.Init.HwFlowCtl = UART_HWCONTROL_NONE;
@@ -94,5 +95,6 @@
   huart2.Init.OneBitSampling = UART_ONE_BIT_SAMPLE_DISABLE;
   huart2.Init.ClockPrescaler = UART_PRESCALER_DIV1;
-  huart2.AdvancedInit.AdvFeatureInit = UART_ADVFEATURE_NO_INIT;
+  huart2.AdvancedInit.AdvFeatureInit = UART_ADVFEATURE_SWAP_INIT;
+  huart2.AdvancedInit.Swap = UART_ADVFEATURE_SWAP_ENABLE;
   if (HAL_UART_Init(&huart2) != HAL_OK)
   {
@@ -152,4 +154,7 @@
     HAL_GPIO_Init(GPIOC, &GPIO_InitStruct);
 
+    /* USART1 interrupt Init */
+    HAL_NVIC_SetPriority(USART1_IRQn, 0, 0);
+    HAL_NVIC_EnableIRQ(USART1_IRQn);
   /* USER CODE BEGIN USART1_MspInit 1 */
 
@@ -186,4 +191,25 @@
     HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
 
+    /* USART2 DMA Init */
+    /* USART2_RX Init */
+    hdma_usart2_rx.Instance = DMA1_Channel6;
+    hdma_usart2_rx.Init.Request = DMA_REQUEST_USART2_RX;
+    hdma_usart2_rx.Init.Direction = DMA_PERIPH_TO_MEMORY;
+    hdma_usart2_rx.Init.PeriphInc = DMA_PINC_DISABLE;
+    hdma_usart2_rx.Init.MemInc = DMA_MINC_ENABLE;
+    hdma_usart2_rx.Init.PeriphDataAlignment = DMA_PDATAALIGN_BYTE;
+    hdma_usart2_rx.Init.MemDataAlignment = DMA_MDATAALIGN_BYTE;
+    hdma_usart2_rx.Init.Mode = DMA_NORMAL;
+    hdma_usart2_rx.Init.Priority = DMA_PRIORITY_LOW;
+    if (HAL_DMA_Init(&hdma_usart2_rx) != HAL_OK)
+    {
+      Error_Handler();
+    }
+
+    __HAL_LINKDMA(uartHandle,hdmarx,hdma_usart2_rx);
+
+    /* USART2 interrupt Init */
+    HAL_NVIC_SetPriority(USART2_IRQn, 0, 0);
+    HAL_NVIC_EnableIRQ(USART2_IRQn);
   /* USER CODE BEGIN USART2_MspInit 1 */
 
@@ -209,4 +235,6 @@
     HAL_GPIO_DeInit(GPIOC, GPIO_PIN_4|GPIO_PIN_5);
 
+    /* USART1 interrupt Deinit */
+    HAL_NVIC_DisableIRQ(USART1_IRQn);
   /* USER CODE BEGIN USART1_MspDeInit 1 */
 
@@ -227,4 +255,9 @@
     HAL_GPIO_DeInit(GPIOA, GPIO_PIN_2|GPIO_PIN_3);
 
+    /* USART2 DMA DeInit */
+    HAL_DMA_DeInit(uartHandle->hdmarx);
+
+    /* USART2 interrupt Deinit */
+    HAL_NVIC_DisableIRQ(USART2_IRQn);
   /* USER CODE BEGIN USART2_MspDeInit 1 */
 
Index: trunk/fw_g473rct/SES/inc/battery_voltage.h
===================================================================
--- trunk/fw_g473rct/SES/inc/battery_voltage.h	(revision 20)
+++ trunk/fw_g473rct/SES/inc/battery_voltage.h	(revision 22)
@@ -20,5 +20,5 @@
 
 //--- GLOBALE FUNKTIONS PROTOTYPEN ---------------------------------------------
-void BATTERY_VOLTAGE_Exec(uint32_t newvalP );
+void BATTERY_VOLTAGE_Exec(int32_t newvalP );
 
 #endif //
Index: trunk/fw_g473rct/SES/inc/sysdata.h
===================================================================
--- trunk/fw_g473rct/SES/inc/sysdata.h	(revision 20)
+++ trunk/fw_g473rct/SES/inc/sysdata.h	(revision 22)
@@ -33,5 +33,5 @@
 //------------------------------------------------------------------------------
 // This structure must be aligned to 4-byte address
-typedef struct
+volatile  typedef struct
 {
 	// Device spezifisch / Einstellungsbereich
@@ -58,5 +58,5 @@
 	uint16_t ibn_year;															// 16	Inbetriebnahme Datum: Jahr
 	uint16_t user_id;															// 17	Freies Feld für eine Kunden ID oder ähnlich
-	uint16_t UNIQUE_NAME(reserved)[8];											// 18-25	RESERVIERT
+	uint16_t test[8];											// 18-25	RESERVIERT
 
 	//--- Konfiguration Schaltausgänge ---
@@ -175,5 +175,5 @@
 	/* 4 of 8 */ uint32_t chargeTotalWh;										// 156-157	[mAs]
 	/* 6 of 8 */ uint16_t fullCyclesCnt;										// 158
-	/* 8 of 8 */ uint16_t UNIQUE_NAME(reserved);								// 159
+	/* 8 of 8 */ uint16_t volatile UNIQUE_NAME(reserved);								// 159
 	/* 8 of 8 */ int64_t  mAs_AutoMode;											// 160-163
 	/* 8 of 8 */ int64_t  mWs_AutoMode;											// 164-167
Index: trunk/fw_g473rct/SES/smartPro.emProject
===================================================================
--- trunk/fw_g473rct/SES/smartPro.emProject	(revision 20)
+++ trunk/fw_g473rct/SES/smartPro.emProject	(revision 22)
@@ -1,6 +1,7 @@
 <!DOCTYPE CrossStudio_Project_File>
 <solution Name="smartPro" target="8" version="2">
+  <configuration Name="Common" link_merge_sections="No" />
   <configuration
-    Name="Debug"
+    Name="Debug125A_12V"
     c_preprocessor_definitions="DEBUG"
     gcc_debugging_level="Level 3"
@@ -8,5 +9,5 @@
     gcc_optimization_level="None" />
   <configuration
-    Name="Release"
+    Name="Release125A_12V"
     c_preprocessor_definitions="NDEBUG"
     gcc_debugging_level="Level 2"
@@ -33,4 +34,5 @@
       c_preprocessor_definitions="__VTOR_CONFIG;ARM_MATH_CM4;STM32G473xx;__STM32G473_SUBFAMILY;__STM32G4XX_FAMILY"
       c_user_include_directories="$(ProjectDir)/../Drivers/STM32G4xx_HAL_Driver/Inc;$(ProjectDir)/../Core/Inc;$(ProjectDir)/../Drivers/CMSIS/Include;$(ProjectDir)/../Drivers/CMSIS/Device/ST/STM32G4xx/Include;$(ProjectDir)/inc"
+      debug_initial_breakpoint_set_option="Never"
       debug_register_definition_file="$(ProjectDir)/STM32G473xx_Registers.xml"
       debug_stack_pointer_start="__stack_end__"
@@ -45,5 +47,11 @@
       target_load_end_script="Reset();"
       target_reset_script="Reset();" />
-    <configuration Name="Debug" c_preprocessor_definitions="DEVICETYPE=500" />
+    <configuration
+      Name="Debug125A_12V"
+      arm_compiler_variant="gcc"
+      c_preprocessor_definitions="DEVICETYPE=125" />
+    <configuration
+      Name="Release125A_12V"
+      c_preprocessor_definitions="DEVICETYPE=125" />
     <folder Name="CMSIS Files">
       <file file_name="STM32G4xx/Device/Include/stm32g4xx.h" />
Index: trunk/fw_g473rct/SES/src/battery_voltage.c
===================================================================
--- trunk/fw_g473rct/SES/src/battery_voltage.c	(revision 20)
+++ trunk/fw_g473rct/SES/src/battery_voltage.c	(revision 22)
@@ -21,5 +21,7 @@
 
 #define BATTERY_VOLTAGE_VOLTAGE_DIVIDER       6
-
+#define ADC_RESOLUTION						  65536 //65536/2 da im differential mode
+#define ADC_OFFSET							  0
+#define VREF								  3000
 //	--- LOKALE TYPE DEFS - bitte hier dokumentieren-------------------------------
 
@@ -35,9 +37,9 @@
 
 
-void BATTERY_VOLTAGE_Exec(uint32_t newvalP )
+void BATTERY_VOLTAGE_Exec(int32_t newvalP )
 {
   static int measCounter;
   static unsigned long avgsumP = 0;
-  uint32_t avgvalP;
+  int32_t avgvalP;
 
   if (measCounter < INT32_MAX) measCounter++;
@@ -53,5 +55,5 @@
 
   //Umrechung auf Eingangsspannung am Gerät mit Teiler
-  sys_data.s.values.batteryVoltage = (avgvalP * (uint64_t)sys_data.s.values.realVdd * BATTERY_VOLTAGE_VOLTAGE_DIVIDER ) / 65536;
+  sys_data.s.values.batteryVoltage = ((avgvalP-2048) * 3000 * BATTERY_VOLTAGE_VOLTAGE_DIVIDER ) / 2048;
 
   
@@ -75,5 +77,5 @@
   //Berechnung schnellen Wert ohne Glättung:
   //Umrechung auf Eingangsspannung am Gerät mit Teiler
-  sys_data.s.values.fast_voltage = (newvalP * (uint64_t)sys_data.s.values.realVdd * BATTERY_VOLTAGE_VOLTAGE_DIVIDER ) / 65536;
+  sys_data.s.values.fast_voltage = ((newvalP-ADC_OFFSET) * VREF * BATTERY_VOLTAGE_VOLTAGE_DIVIDER ) / ADC_RESOLUTION;
 
 
Index: trunk/fw_g473rct/SES/src/main.c
===================================================================
--- trunk/fw_g473rct/SES/src/main.c	(revision 20)
+++ trunk/fw_g473rct/SES/src/main.c	(revision 22)
@@ -37,4 +37,6 @@
 #include "modbus.h"
 #include "chip_temperature.h"
+#include "battery_voltage.h"
+#include "ads1260.h"
 /* USER CODE END Includes */
 
@@ -57,7 +59,7 @@
 
 /* USER CODE BEGIN PV */
-modbus_t modbusData;
-#define ADCCONVERTEDVALUES_BUFFER_SIZE 2
-__IO uint32_t adc12Data[ADCCONVERTEDVALUES_BUFFER_SIZE] __attribute__((section(".RAM1")));
+modbus_t modbusData __attribute__((section(".RAM1")));
+
+__IO uint16_t adc12Data[2] __attribute__((section(".RAM1")));
 __IO uint32_t adc1Data[1] __attribute__((section(".RAM1")));
 __IO uint32_t adc2Data[1] __attribute__((section(".RAM1")));
@@ -66,4 +68,6 @@
 __IO uint32_t adc5Data[4] __attribute__((section(".RAM1")));
 int silentmode =0;
+static volatile uint32_t newADC1Data = 0;
+static volatile uint32_t newADC2Data = 0;
 /* USER CODE END PV */
 
@@ -71,5 +75,7 @@
 void SystemClock_Config(void);
 /* USER CODE BEGIN PFP */
-
+bool SetFlashReadProtection(bool state);
+uint8_t printprotectionstate(void);
+bool SetBootFromFlashAndReadOutProtection(void);
 /* USER CODE END PFP */
 
@@ -88,4 +94,5 @@
   /* USER CODE BEGIN 1 */
     uint8_t firstStartCatcher;
+	int mode_button_disable_time=0;
   /* USER CODE END 1 */
 
@@ -168,5 +175,5 @@
   
     //HAL_ADC_Start_DMA(&hadc2, (uint32_t*)adc2Data, 1);
-  if (HAL_ADCEx_MultiModeStart_DMA(&hadc1,(uint32_t *)adc12Data,ADCCONVERTEDVALUES_BUFFER_SIZE))  //Start ADC interleaved mode
+  if (HAL_ADCEx_MultiModeStart_DMA(&hadc1,(uint32_t *)adc12Data,1))  //Start ADC interleaved mode
   {
      /* Start Error */
@@ -189,7 +196,65 @@
 
     /* USER CODE BEGIN 3 */
+	if (newADC1Data == 1)
+    {
+	  BATTERY_VOLTAGE_Exec( adc12Data[1]);
+	}
+
+
+	    if(sys_data.s.parameter.command != 0)
+    {
+      if  (modbusData.current_query ==  MB_QUERY_NOTHING)
+      {
+        //printf("CMD = %d\n", sys_data.s.parameter.command);
+        switch (sys_data.s.parameter.command )
+        {
+          case COMMAND_STORE_CONFIG:                          EEPROM_storeConfig(&sys_data,0);											  break;
+          case COMMAND_FULL_RESTORE:                          EEPROM_fullRestore(&sys_data);											  break;
+          case COMMAND_FACTORY_RESTORE:                       EEPROM_factoryRestore(&sys_data, 1);										  break;
+          case COMMAND_RESTORE_LAST_SAVED_VALUES:             EEPROM_readConfig(&sys_data);												  break;
+          case COMMAND_STORE_WITH_SERIAL_NUMBER:              EEPROM_storeConfig(&sys_data,1);											  break;	// Seriennummer schreiben
+          case COMMAND_RESTART:                               NVIC_SystemReset();														  break;
+          case COMMAND_BATTERY_CURRENT_OFFSET_CAL:            ADS_1260_BatteryCurrentOffsetCalibrationStart(&sys_data);					  break;
+          case COMMAND_BATTERY_CURRENT_OFFSET_COMMONMODE_CAL: ADS_1260_BatteryCurrentOffsetCommonModeErrorComepensationStart(&sys_data);  break;
+          case COMMAND_BATTERY_CURRENT_OFFSET_TEMP_CAL:       ADS_1260_BatteryCurrentOffsetTemperatureErrorComepensationStart();		  break;
+          case COMMAND_BATTERY_CURRENT_GAIN_CAL:              ADS_1260_BatteryCurrentGainCalibrationStart(&sys_data);					  break;
+          case COMMAND_BATTERY_CURRENT_GAIN_TEMP_SHUNT_CAL:   ADS_1260_BatteryCurrentGainTemperatureCalibrationShuntStart();			  break;
+//        case COMMAND_BATTERY_CURRENT_GAIN_TEMP_CHIP_CAL:    ADS_1260_BatteryCurrentGainTemperatureCalibrationChipStart(); break;
+          case COMMAND_SET_RDP_LEVEL0:                        SetFlashReadProtection(false);											  break;
+          case COMMAND_SET_RDP_LEVEL1:                        SetFlashReadProtection(true);												  break;
+          case COMMAND_SET_RDP_LEVEL1_AND_BOOTSEL:            SetBootFromFlashAndReadOutProtection();									  break;
+          default:                                            printf("UNKNOWN COMMAND\n");
+        }
+        sys_data.s.parameter.command = 0;
+      }
+      else
+      {
+        //printf("wait with execution till modbus communnikation finished\n");
+      }
+    }
+
+    if((HAL_GPIO_ReadPin(GPIO_INPUT_BTN_MODE_GPIO_Port, GPIO_INPUT_BTN_MODE_Pin) == GPIO_PIN_RESET) && (mode_button_disable_time == 0))
+    {
+      HAL_Delay(10);
+      //Taste weiterhin gedrckt?
+      if(HAL_GPIO_ReadPin(GPIO_INPUT_BTN_MODE_GPIO_Port, GPIO_INPUT_BTN_MODE_Pin) == GPIO_PIN_RESET)
+      {
+        //Ja, dann Silent Mode umschalten
+        mode_button_disable_time=500;
+        if (silentmode == 0)
+        {
+          silentmode = 1;
+          HAL_GPIO_WritePin(LED_FUNC_GPIO_Port, LED_FUNC_Pin,GPIO_PIN_SET);
+        }
+        else
+        {
+          silentmode = 0;
+        }
+       }
+    }
+
 	// Modbus Kommunikation
-	HAL_Delay(1000);
-	printf("data12d1=%d,data12d2=%d,data5=%d\r\n", adc12Data[0], adc12Data[1], adc5Data[2]);
+
+//	printf("data12d1=%d,data12d2=%d,data5=%d\r\n", adc12Data[0], adc12Data[1] , adc5Data[2]);
     if (mbGetFrameComplete(&modbusData) == true)
     {
@@ -258,5 +323,178 @@
 
 /* USER CODE BEGIN 4 */
-
+ void HAL_ADC_ConvCpltCallback(ADC_HandleTypeDef* hadc)
+ {
+    if (hadc->Instance==ADC1)
+	{
+	  newADC1Data=1;
+	}
+
+	if (hadc->Instance==ADC2)
+	{
+	  newADC2Data=1;
+	}
+ }
+
+
+ 
+/**
+
+  * @brief  Set flash read protection.
+
+  * @param  [in] state: Flash read protection state, true: enable protection, false: disable protection.
+
+  * @retval true:  Successful operation.
+
+  * @retval false: Operation failed.
+
+  */
+
+bool SetFlashReadProtection(bool state)
+{
+
+  FLASH_OBProgramInitTypeDef OptionsBytesStruct = {0};
+  HAL_FLASHEx_OBGetConfig(&OptionsBytesStruct);
+
+  if(state == true)
+  {
+    printf("Start enable readout protection\n");
+    if(OptionsBytesStruct.RDPLevel == OB_RDP_LEVEL_0)
+    {
+      OptionsBytesStruct.OptionType = OPTIONBYTE_RDP;
+      OptionsBytesStruct.RDPLevel   = OB_RDP_LEVEL_1;
+      if (HAL_FLASH_Unlock() != HAL_OK)
+      {
+        printf("Flash unlock error\n");
+      }
+      if (HAL_FLASH_OB_Unlock() != HAL_OK)
+      {
+        printf("Flash ob unlock error\n");
+      }
+
+      printf("...Flash unlock\n");
+      if(HAL_FLASHEx_OBProgram(&OptionsBytesStruct) != HAL_OK)
+      {
+        printf("...Enable lock error\n");
+        HAL_FLASH_OB_Lock();
+        return false;
+      }
+      HAL_FLASH_OB_Lock();
+      printf("Flash Optionbyte locked\n");
+      HAL_FLASH_Lock();
+      printf("Flash  locked\n");
+      printf("...Enable lock process finished\n");
+    }
+    else
+    {
+      printf("...Flash lock already active\n");
+    }
+  }
+  else
+  {
+    if(OptionsBytesStruct.RDPLevel == OB_RDP_LEVEL_1)
+    {
+      OptionsBytesStruct.OptionType = OPTIONBYTE_RDP;
+      OptionsBytesStruct.RDPLevel   = OB_RDP_LEVEL_0;
+
+      if (HAL_FLASH_Unlock() != HAL_OK)
+      {
+        printf("Flash unlock error\n");
+        return false;
+      }
+      printf("...Flash unlocked\n");
+
+      if (HAL_FLASH_OB_Unlock() != HAL_OK)
+      {
+        printf("Flash ob unlock error\n");
+        return false;
+      }
+      printf("...Flash ob unlocked\n");
+
+      if(HAL_FLASHEx_OBProgram(&OptionsBytesStruct) != HAL_OK)
+      {
+        HAL_FLASH_OB_Lock();
+        printf("Flash Optionbyte programm failed\n");
+        return false;
+      }
+
+      printf("Flash Optionbyte programmed\n");
+      HAL_FLASH_OB_Lock();
+      printf("Flash Optionbyte locked\n");
+      HAL_FLASH_Lock();
+      printf("Flash  locked\n");
+      printf("...Disable lock process finished\n");
+
+;
+    }
+  }
+  return true;
+}
+
+bool SetBootFromFlashAndReadOutProtection(void)
+{
+
+  FLASH_OBProgramInitTypeDef OptionsBytesStruct = {0};
+  HAL_FLASHEx_OBGetConfig(&OptionsBytesStruct);
+
+  //Konfiguriere RDP fr Readoutprotection and USER OPTION BYTE FR Boot from Flash
+  OptionsBytesStruct.OptionType = OPTIONBYTE_USER | OPTIONBYTE_RDP;
+
+  //Set Readout Protection Level 1
+  OptionsBytesStruct.OptionType = OPTIONBYTE_USER|OPTIONBYTE_RDP;
+  OptionsBytesStruct.RDPLevel   = OB_RDP_LEVEL_1;
+
+  //Selecting Boot from Main Flash Memory
+  OptionsBytesStruct.USERType =    OB_USER_nBOOT0 | OB_USER_nSWBOOT0 | OB_USER_nBOOT1 ;
+  OptionsBytesStruct.USERConfig  = OB_USER_nBOOT0 | OB_USER_nSWBOOT0;
+
+  if (HAL_FLASH_Unlock() != HAL_OK)
+  {
+    printf("Flash unlock error\n");
+  }
+  if (HAL_FLASH_OB_Unlock() != HAL_OK)
+  {
+    printf("Flash ob unlock error\n");
+  }
+
+  printf("...Flash unlock\n");
+  if(HAL_FLASHEx_OBProgram(&OptionsBytesStruct) != HAL_OK)
+  {
+    printf("...Enable lock error\n");
+    HAL_FLASH_OB_Lock();
+    return false;
+  }
+  HAL_FLASH_OB_Lock();
+  printf("Flash Optionbyte locked\n");
+  HAL_FLASH_Lock();
+  printf("Flash  locked\n");
+  printf("...Enable lock process finished\n");
+
+  return true;
+}
+uint8_t printprotectionstate(void)
+{
+  FLASH_OBProgramInitTypeDef OptionsBytesStruct = {0};
+  HAL_FLASHEx_OBGetConfig(&OptionsBytesStruct);
+  uint8_t result = 0;
+
+  if(OptionsBytesStruct.RDPLevel == OB_RDP_LEVEL_0)
+  {
+    //OptionsBytesStruct.OptionType = OPTIONBYTE_RDP;
+    //OptionsBytesStruct.RDPLevel   = OB_RDP_LEVEL_1;
+    printf("PROTECTION: OB_RDP_LEVEL_0\n");
+    result = 0;
+  }
+  else if(OptionsBytesStruct.RDPLevel == OB_RDP_LEVEL_1)
+  {
+    printf("PROTECTION: OB_RDP_LEVEL_1\n");
+    result = 1;
+  }
+  else if(OptionsBytesStruct.RDPLevel == OB_RDP_LEVEL_2)
+  {
+    printf("PROTECTION: OB_RDP_LEVEL_2\n");
+    result = 2;
+  }
+  return  result;
+}
 
 /* USER CODE END 4 */
Index: trunk/fw_g473rct/SES/src/modbus.c
===================================================================
--- trunk/fw_g473rct/SES/src/modbus.c	(revision 20)
+++ trunk/fw_g473rct/SES/src/modbus.c	(revision 22)
@@ -67,6 +67,6 @@
   #define FAST_BAUDRATE_INTERFRAME_DELAY_us   (1750UL)
   // --- Externe Variablen --------------------------------------------
-  extern modbus_t modbusData;
-  extern sys_data_t sys_data;
+  extern volatile modbus_t modbusData;
+  extern volatile sys_data_t sys_data;
 
 
@@ -158,6 +158,6 @@
     
     // Init aus Cube
-    mb_data->uart->Instance = USART1;
-    mb_data->uart->Init.BaudRate = 19200;
+    mb_data->uart->Instance = USART2;
+    mb_data->uart->Init.BaudRate = baudrate;
     mb_data->uart->Init.WordLength = UART_WORDLENGTH_9B;
     mb_data->uart->Init.StopBits = UART_STOPBITS_1;
@@ -168,7 +168,8 @@
     mb_data->uart->Init.OneBitSampling = UART_ONE_BIT_SAMPLE_DISABLE;
     mb_data->uart->Init.ClockPrescaler = UART_PRESCALER_DIV1;
-    mb_data->uart->AdvancedInit.AdvFeatureInit = UART_ADVFEATURE_NO_INIT;
-    
-    // Init nderungen
+    mb_data->uart->AdvancedInit.AdvFeatureInit = UART_ADVFEATURE_SWAP_INIT;
+	mb_data->uart->AdvancedInit.Swap = UART_ADVFEATURE_SWAP_ENABLE;
+    
+    // Init änderungen
 
     // Baudrate
@@ -200,14 +201,17 @@
     }
     // Init
-    if (RS485_ModbusEx_Init(mb_data->uart, UART_DE_POLARITY_HIGH, 0, 0,TIMEOUT_FRAME_COMPLETE*nrOfBitsPerChar) != HAL_OK)
-    {
-      Error_Handler();
-    } 
-    if (HAL_UARTEx_DisableFifoMode(mb_data->uart) != HAL_OK)
-    {
-      Error_Handler();
-    }
-
-    if(HAL_UART_Receive_IT(mb_data->uart, mb_data->rx_buffer, RXBUFFERSIZE) != HAL_OK)
+   // if (RS485_ModbusEx_Init(mb_data->uart, UART_DE_POLARITY_HIGH, 0, 0,TIMEOUT_FRAME_COMPLETE*nrOfBitsPerChar) != HAL_OK)
+   // {
+   //   Error_Handler();
+   // } 
+   // if (HAL_UARTEx_DisableFifoMode(mb_data->uart) != HAL_OK)
+   // {
+   //   Error_Handler();
+   // }
+	uint32_t fixedDelayInBitDurations = (FAST_BAUDRATE_INTERFRAME_DELAY_us * baudrate) / 1000000UL + 1UL;
+//	HAL_UART_EnableReceiverTimeout( usart);
+//	HAL_UART_ReceiverTimeout_Config(usart,  fixedDelayInBitDurations);
+
+    if(HAL_UARTEx_ReceiveToIdle_DMA(mb_data->uart, mb_data->rx_buffer, RXBUFFERSIZE) != HAL_OK)
     {
       printf("uart error \n\r");
@@ -218,368 +222,43 @@
   }
 
-  /*
-    *
-    * @brief  End ongoing Rx transfer on UART peripheral (following error detection or Reception completion).
-    * @param  huart: UART handle.
-    * @retval None
-  */
-  void mbUartEndRxTransfer(UART_HandleTypeDef *huart)
-  {
-    /* Disable RXNE, PE and ERR (Frame error, noise error, overrun error) interrupts */
-    //CLEAR_BIT(huart->Instance->CR1, (USART_CR1_RXNEIE | USART_CR1_PEIE));
-    //CLEAR_BIT(huart->Instance->CR3, USART_CR3_EIE);
-
-    /* At end of Rx process, restore huart->RxState to Ready */
-    huart->RxState = HAL_UART_STATE_READY;
-  }
-
-  void mbUartRx(modbus_t* mb_data)
-  {
-    uint32_t  pos;
-    uint8_t   data;
-
-    pos = mb_data->rx_head;  
-    
-    if (pos >= RXBUFFERSIZE)
-    {
-      return;
-    }
-    //data = mb_data->uart->Instance->RDR
-    data = mb_data->uart->Instance->RDR & (uint8_t)0x00FF;  //NOTE: mb_data->uart.Instance->DR gendert
-    mb_data->rx_buffer[pos] = data;
-
-    mb_data->rx_head++;
-
-    //mbTimerStart(mb_data);
-  }
-
-  HAL_StatusTypeDef mbUartTx(UART_HandleTypeDef *huart)
-  {
-    uint16_t* tmp;
-    
-    if(huart->Init.WordLength == UART_WORDLENGTH_9B)
-    {
-      tmp                     =   (uint16_t*) huart->pTxBuffPtr;
-      huart->Instance->TDR    =   (uint16_t)(*tmp & (uint16_t)0x01FF); //NOTE: huart->Instance->DR gendert
-      
-      if(huart->Init.Parity == UART_PARITY_NONE)
-      {
-        huart->pTxBuffPtr += 2;
-      }
-      else
-      {
-        huart->pTxBuffPtr += 1;
-      }
-    } 
-    else
-    {
-      huart->Instance->TDR = (uint8_t)(*huart->pTxBuffPtr++ & (uint8_t)0x00FF);   //NOTE:huart->Instance->DR gendert
-    }
-
-    if(--huart->TxXferCount == 0)
-    {
-      /* Disable the UART Transmit Complete Interrupt */
-      __HAL_UART_DISABLE_IT(huart, UART_IT_TXE);
-
-      /* Enable the UART Transmit Complete Interrupt */    
-      __HAL_UART_ENABLE_IT(huart, UART_IT_TC);
-    }
-    return HAL_OK;
-  }
-
-  // huart->State gibt es nicht mehr. Ersetzt durch huart->gState.
-  /**
-    * @brief  Wraps up transmission in non blocking mode.
-    * @param  huart: pointer to a UART_HandleTypeDef structure that contains
-    *                the configuration information for the specified UART module.
-    * @retval HAL status
-    */
-  static void UART_EndTransmit_IT(UART_HandleTypeDef *huart)
-  {
-    /* Disable the UART Transmit Complete Interrupt */
-    CLEAR_BIT(huart->Instance->CR1, USART_CR1_TCIE);
-
-    /* Tx process is ended, restore huart->gState to Ready */
-    huart->gState = HAL_UART_STATE_READY;
-    
-    /* Cleat TxISR function pointer */
-    huart->TxISR = NULL;
-
-  #if (USE_HAL_UART_REGISTER_CALLBACKS == 1)
-    /*Call registered Tx complete callback*/
-    huart->TxCpltCallback(huart);
-  #else
-    /*Call legacy weak Tx complete callback*/
-    HAL_UART_TxCpltCallback(huart);
-  #endif /* USE_HAL_UART_REGISTER_CALLBACKS */
-  }
-
-
-static HAL_StatusTypeDef RS485_ModbusEx_Init(UART_HandleTypeDef *huart, uint32_t Polarity, uint32_t AssertionTime, uint32_t DeassertionTime, uint32_t charReceiveTimeout)
+
+
+void HAL_UART_ErrorCallback(UART_HandleTypeDef *huart)
 {
-  uint32_t temp;
-
-  /* Check the UART handle allocation */
-  if (huart == NULL)
-  {
-    return HAL_ERROR;
-  }
-  /* Check the Driver Enable UART instance */
-  assert_param(IS_UART_DRIVER_ENABLE_INSTANCE(huart->Instance));
-
-  /* Check the Driver Enable polarity */
-  assert_param(IS_UART_DE_POLARITY(Polarity));
-
-  /* Check the Driver Enable assertion time */
-  assert_param(IS_UART_ASSERTIONTIME(AssertionTime));
-
-  /* Check the Driver Enable deassertion time */
-  assert_param(IS_UART_DEASSERTIONTIME(DeassertionTime));
-
-  if (huart->gState == HAL_UART_STATE_RESET)
-  {
-    /* Allocate lock resource and initialize it */
-    huart->Lock = HAL_UNLOCKED;
-
-#if (USE_HAL_UART_REGISTER_CALLBACKS == 1)
-    UART_InitCallbacksToDefault(huart);
-
-    if (huart->MspInitCallback == NULL)
-    {
-      huart->MspInitCallback = HAL_UART_MspInit;
-    }
-
-    /* Init the low level hardware */
-    huart->MspInitCallback(huart);
-#else
-    /* Init the low level hardware : GPIO, CLOCK, CORTEX */
-    HAL_UART_MspInit(huart);
-#endif /* (USE_HAL_UART_REGISTER_CALLBACKS) */
-  }
-
-  huart->gState = HAL_UART_STATE_BUSY;
-
-  /* Disable the Peripheral */
-  __HAL_UART_DISABLE(huart);
-
-  /* Set the UART Communication parameters */
-  if (UART_SetConfig(huart) == HAL_ERROR)
-  {
-    return HAL_ERROR;
-  }
-
-  if (huart->AdvancedInit.AdvFeatureInit != UART_ADVFEATURE_NO_INIT)
-  {
-    UART_AdvFeatureConfig(huart);
-  }
-
-  /* Enable the Driver Enable mode by setting the DEM bit in the CR3 register */
-  //EDIT SMART_SWITCH: HIER wurde ein chip mit autoerkennung implementiert
- // SET_BIT(huart->Instance->CR3, USART_CR3_DEM);
-
-  /* Set the Driver Enable polarity */
- // MODIFY_REG(huart->Instance->CR3, USART_CR3_DEP, Polarity);
-
-  /* Set the Driver Enable assertion and deassertion times */
-//  temp = (AssertionTime << UART_CR1_DEAT_ADDRESS_LSB_POS);
-//  temp |= (DeassertionTime << UART_CR1_DEDT_ADDRESS_LSB_POS);
-//  MODIFY_REG(huart->Instance->CR1, (USART_CR1_DEDT | USART_CR1_DEAT), temp);
-
-// EDIT ECS START
-  /*Set receive timeout time*/
-  SET_BIT(huart->Instance->CR2, USART_CR2_RTOEN);
-  SET_BIT(huart->Instance->CR1, USART_CR1_RTOIE);  
-  //MODIFY_REG(huart->Instance->RTOR, USART_RTOR_RTO, charReceiveTimeout);
-  if (huart->Init.BaudRate <= 19200) MODIFY_REG(huart->Instance->RTOR, USART_RTOR_RTO, charReceiveTimeout);
-  else
-  {
-      uint32_t fixedDelayInBitDurations = (FAST_BAUDRATE_INTERFRAME_DELAY_us * huart->Init.BaudRate) / 1000000UL + 1UL;
-      MODIFY_REG(huart->Instance->RTOR, USART_RTOR_RTO, fixedDelayInBitDurations);
-  }
-// EDIT ECS END
-
-  /* Enable the Peripheral */
-  __HAL_UART_ENABLE(huart);
-
-  /* TEACK and/or REACK to check before moving huart->gState and huart->RxState to Ready */
-  return (UART_CheckIdleState(huart));
-}
-
-
-static int test;
-void MODBUS_UART_IRQHandler(UART_HandleTypeDef *huart)
-{
-  uint32_t isrflags   = READ_REG(huart->Instance->ISR);
-  uint32_t cr1its     = READ_REG(huart->Instance->CR1);
-  uint32_t cr2its     = READ_REG(huart->Instance->CR2);
-  uint32_t cr3its     = READ_REG(huart->Instance->CR3);
-
-  uint32_t errorflags;
-  uint32_t errorcode;
-
-  errorflags = (isrflags & (uint32_t)(USART_ISR_PE | USART_ISR_FE | USART_ISR_ORE | USART_ISR_NE));
-
-  /* If some errors occur */
-  if ((errorflags != 0U)
-      && ((((cr3its & (USART_CR3_RXFTIE | USART_CR3_EIE)) != 0U)
-           || ((cr1its & (USART_CR1_RXNEIE_RXFNEIE | USART_CR1_PEIE)) != 0U))))
-  {
-    /* UART parity error interrupt occurred -------------------------------------*/
-    if (((isrflags & USART_ISR_PE) != 0U) && ((cr1its & USART_CR1_PEIE) != 0U))
-    {
-      __HAL_UART_CLEAR_FLAG(huart, UART_CLEAR_PEF);
-
-      huart->ErrorCode |= HAL_UART_ERROR_PE;
-    }
-
-    /* UART frame error interrupt occurred --------------------------------------*/
-    if (((isrflags & USART_ISR_FE) != 0U) && ((cr3its & USART_CR3_EIE) != 0U))
-    {
-      __HAL_UART_CLEAR_FLAG(huart, UART_CLEAR_FEF);
-
-      huart->ErrorCode |= HAL_UART_ERROR_FE;
-    }
-
-    /* UART noise error interrupt occurred --------------------------------------*/
-    if (((isrflags & USART_ISR_NE) != 0U) && ((cr3its & USART_CR3_EIE) != 0U))
-    {
-      __HAL_UART_CLEAR_FLAG(huart, UART_CLEAR_NEF);
-
-      huart->ErrorCode |= HAL_UART_ERROR_NE;
-    }
-
-    /* UART Over-Run interrupt occurred -----------------------------------------*/
-    if (((isrflags & USART_ISR_ORE) != 0U)
-        && (((cr1its & USART_CR1_RXNEIE_RXFNEIE) != 0U) ||
-            ((cr3its & (USART_CR3_RXFTIE | USART_CR3_EIE)) != 0U)))
-    {
-      __HAL_UART_CLEAR_FLAG(huart, UART_CLEAR_OREF);
-
-      huart->ErrorCode |= HAL_UART_ERROR_ORE;
-    }
-  } /* End if some error occurs */
-
-
-  /* UART in mode Receiver (receive Timeout occured)--------------------------*/
-  if (((isrflags & USART_ISR_RTOF) != 0U)
-      && (((cr1its & USART_CR1_RTOIE) != 0U)
-          || ((cr3its & USART_CR2_RTOEN) != 0U)))
-  {
-    __HAL_UART_CLEAR_FLAG(huart, USART_ICR_RTOCF);
-    huart->RxState = HAL_UART_STATE_READY;
-    huart->gState = HAL_UART_STATE_READY;
+  if (huart->ErrorCode == HAL_UART_ERROR_RTO)
+  {
     modbusData.mb_rx_frame_complete = 1;
     modbusData.setRxLed = true;
-
-  }
-
-  /* UART in mode Receiver ---------------------------------------------------*/
-  if (((isrflags & USART_ISR_RXNE_RXFNE) != 0U)
-      && (((cr1its & USART_CR1_RXNEIE_RXFNEIE) != 0U)
-          || ((cr3its & USART_CR3_RXFTIE) != 0U)))
-  {
-    if ((huart->RxState == HAL_UART_STATE_BUSY_RX) && (modbusData.rx_head < RXBUFFERSIZE))    //-> empfngt dann ein byte aber das ist nicht wild
-    {
-      modbusData.rx_buffer[modbusData.rx_head] = huart->Instance->RDR;
-      /*DEBUG//printf("xx%d: nr:%d  %d\n",test ++,modbusData.rx_head, modbusData.rx_buffer[modbusData.rx_head]);*/
-      modbusData.rx_head++;
-      modbusData.setRxLed = true;
-    }
-    else
-    {
-      __HAL_UART_SEND_REQ(huart, UART_RXDATA_FLUSH_REQUEST);
-    }
-  }
-
-  /* UART in mode Transmitter ------------------------------------------------*/
-  if (((isrflags & USART_ISR_TXE_TXFNF) != 0U)
-      && (((cr1its & USART_CR1_TXEIE_TXFNFIE) != 0U)
-          || ((cr3its & USART_CR3_TXFTIE) != 0U)))
-  {
-    UART_TxISR_8BIT(modbusData.uart);
-    modbusData.setTxLed = true;
-  }
-
-  /* UART in mode Transmitter (transmission end) -----------------------------*/
-  if (((isrflags & USART_ISR_TC) != 0U) && ((cr1its & USART_CR1_TCIE) != 0U))
-  {
-    modbusData.current_query = MB_QUERY_NOTHING;
-    UART_EndTransmit_IT(huart);
-    huart->RxState = HAL_UART_STATE_BUSY_RX;
-//    /*Reset TX complete interrupt flag*/
-//    __HAL_UART_CLEAR_FLAG(huart, USART_ISR_TC);
-//     /* Disable the UART Transmit Complete Interrupt */
-//    CLEAR_BIT(huart->Instance->CR1, USART_CR1_TCIE);
-//    /*TX complete callback function*/
-//    HAL_UART_TxCpltCallback(huart);
-//    /* Tx process is ended, restore huart->gState to Ready */
-//    huart->gState = HAL_UART_STATE_READY;
-  }
-
-  /* Call UART Error Call back function if need be --------------------------*/
-  if (huart->ErrorCode != HAL_UART_ERROR_NONE)
-  {
-    huart->RxState = HAL_UART_STATE_BUSY_RX;
-    /* UART in mode Receiver ---------------------------------------------------*/
-    if (((isrflags & USART_ISR_RXNE_RXFNE) != 0U)
-        && (((cr1its & USART_CR1_RXNEIE_RXFNEIE) != 0U)
-            || ((cr3its & USART_CR3_RXFTIE) != 0U)))
-    {
-      __HAL_UART_SEND_REQ(huart, UART_RXDATA_FLUSH_REQUEST);
-      huart->ErrorCode = HAL_UART_ERROR_NONE;
-    }
-    else if (((isrflags & USART_ISR_TXE_TXFNF) != 0U)
-             && (((cr1its & USART_CR1_TXEIE_TXFNFIE) != 0U)
-                 || ((cr3its & USART_CR3_TXFTIE) != 0U)))
-    {
-      modbusData.current_query = MB_QUERY_NOTHING;
-      UART_EndTransmit_IT(huart);
-      huart->RxState = HAL_UART_STATE_BUSY_RX;
-      modbusData.setTxLed = true;
-    }
-  }
+	modbusData.rx_head= 8;
+	printf("MB RTO Event! \n\r");
+  }
+
+  if(HAL_UARTEx_ReceiveToIdle_DMA(huart, huart->pRxBuffPtr, RXBUFFERSIZE) != HAL_OK)
+   {
+     printf("uart error \n\r");
+  //   while(1)
+  //   {
+  //   }     
+   }    
+  
 }
 
-
-
-
-
-
-
-/**
-  * @brief TX interrrupt handler for 7 or 8 bits data word length .
-  * @note   Function is called under interruption only, once
-  *         interruptions have been enabled by HAL_UART_Transmit_IT().
-  * @param huart UART handle.
-  * @retval None
-  */
-static void UART_TxISR_8BIT(UART_HandleTypeDef *huart)
+void HAL_UARTEx_RxEventCallback(UART_HandleTypeDef *huart, uint16_t Size)
 {
-  /* Check that a Tx process is ongoing */
-  if (huart->gState == HAL_UART_STATE_BUSY_TX)
-  {
-    if (huart->TxXferCount == 0U)
-    {
-      /* Disable the UART Transmit Data Register Empty Interrupt */
-      CLEAR_BIT(huart->Instance->CR1, USART_CR1_TXEIE_TXFNFIE);
-
-      /* Enable the UART Transmit Complete Interrupt */
-      SET_BIT(huart->Instance->CR1, USART_CR1_TCIE);
-    }
-    else
-    {
-      huart->Instance->TDR = (uint8_t)(*huart->pTxBuffPtr & (uint8_t)0xFF);
-      huart->pTxBuffPtr++;
-      huart->TxXferCount--;
-    }
-  }
-  else
-  {
-      /* Disable the UART Transmit Data Register Empty Interrupt */
-      CLEAR_BIT(huart->Instance->CR1, USART_CR1_TXEIE_TXFNFIE);
-
-      /* Enable the UART Transmit Complete Interrupt */
-      SET_BIT(huart->Instance->CR1, USART_CR1_TCIE);
-  }
+  printf("MB rxEvent!RX=%d \n\r",Size);
+  modbusData.setRxLed = true;
+
+  modbusData.mb_rx_frame_complete = 1;
+  modbusData.rx_head= Size +1;
+
+  if(HAL_UARTEx_ReceiveToIdle_DMA(huart, huart->pRxBuffPtr, RXBUFFERSIZE) != HAL_OK)
+   {
+     printf("uart error \n\r");
+  //   while(1)
+  //   {
+  //   }     
+   }    
+  
+
 }
 
@@ -595,27 +274,11 @@
 
 
-  /**
-    * @brief  Output Compare callback in non blocking mode 
-    * @param  htim : TIM OC handle
-    * @retval None
-    */
-  void mbTimerIsr(modbus_t * mb_data)
-  {
-    /* Capture compare 1 event */
-//    if(__HAL_TIM_GET_FLAG(mb_data->timer, TIM_FLAG_CC1) != RESET)
-//    {
-//      if(__HAL_TIM_GET_IT_SOURCE(mb_data->timer, TIM_IT_CC1) !=RESET)
-//      {
-//        __HAL_TIM_CLEAR_IT(mb_data->timer, TIM_IT_CC1);
-//        mb_data->timer->Channel = HAL_TIM_ACTIVE_CHANNEL_1;
-      
-        mb_data->mb_rx_frame_complete=true;
-//        mb_data->timer->Instance->CNT =0;
-//        HAL_TIM_OC_Stop_IT(mb_data->timer, TIM_CHANNEL_1); 
-//        mb_data->timer->Channel = HAL_TIM_ACTIVE_CHANNEL_CLEARED;
-//
-//      }
-//    }
-  }
+
+
+
+
+
+
+
 
 
Index: trunk/fw_g473rct/SES/src/sysdata.c
===================================================================
--- trunk/fw_g473rct/SES/src/sysdata.c	(revision 20)
+++ trunk/fw_g473rct/SES/src/sysdata.c	(revision 22)
@@ -49,3 +49,7 @@
 
 	sys_data.s.values.adc_restarts = 0U;
+	sys_data.s.parameter.test[1] = 1;
+	sys_data.s.parameter.test[2] = 3;
+	sys_data.s.parameter.test[3] = 5;
+
 }
Index: trunk/fw_g473rct/fw_g473rct.ioc
===================================================================
--- trunk/fw_g473rct/fw_g473rct.ioc	(revision 20)
+++ trunk/fw_g473rct/fw_g473rct.ioc	(revision 22)
@@ -6,13 +6,15 @@
 ADC1.DMAAccessModeView=ENABLE
 ADC1.DMAContinuousRequests=ENABLE
-ADC1.EOCSelection=ADC_EOC_SEQ_CONV
-ADC1.IPParameters=Rank-20\#ChannelRegularConversion,master,SingleDiff-20\#ChannelRegularConversion,Channel-20\#ChannelRegularConversion,SamplingTime-20\#ChannelRegularConversion,OffsetNumber-20\#ChannelRegularConversion,NbrOfConversionFlag,Mode,DMAAccessModeView,ContinuousConvMode,OversamplingMode,DMAContinuousRequests,Overrun,ClockPrescaler,EOCSelection,CommonPathInternal
+ADC1.EOCSelection=ADC_EOC_SINGLE_CONV
+ADC1.IPParameters=Rank-20\#ChannelRegularConversion,master,SingleDiff-20\#ChannelRegularConversion,Channel-20\#ChannelRegularConversion,SamplingTime-20\#ChannelRegularConversion,OffsetNumber-20\#ChannelRegularConversion,NbrOfConversionFlag,Mode,DMAAccessModeView,ContinuousConvMode,OversamplingMode,DMAContinuousRequests,Overrun,ClockPrescaler,EOCSelection,RightBitShift,Ratio,CommonPathInternal
 ADC1.Mode=ADC_DUALMODE_REGSIMULT
 ADC1.NbrOfConversionFlag=1
 ADC1.OffsetNumber-20\#ChannelRegularConversion=ADC_OFFSET_NONE
 ADC1.Overrun=ADC_OVR_DATA_OVERWRITTEN
-ADC1.OversamplingMode=DISABLE
+ADC1.OversamplingMode=ENABLE
 ADC1.Rank-20\#ChannelRegularConversion=1
-ADC1.SamplingTime-20\#ChannelRegularConversion=ADC_SAMPLETIME_2CYCLES_5
+ADC1.Ratio=ADC_OVERSAMPLING_RATIO_256
+ADC1.RightBitShift=ADC_RIGHTBITSHIFT_4
+ADC1.SamplingTime-20\#ChannelRegularConversion=ADC_SAMPLETIME_640CYCLES_5
 ADC1.SingleDiff-20\#ChannelRegularConversion=ADC_DIFFERENTIAL_ENDED
 ADC1.master=1
@@ -22,13 +24,15 @@
 ADC2.DMAAccessModeView=ENABLE
 ADC2.DMAContinuousRequests=ENABLE
-ADC2.EOCSelection=ADC_EOC_SEQ_CONV
-ADC2.IPParameters=Rank-4\#ChannelRegularConversion,Channel-4\#ChannelRegularConversion,SingleDiff-4\#ChannelRegularConversion,SamplingTime-4\#ChannelRegularConversion,OffsetNumber-4\#ChannelRegularConversion,NbrOfConversionFlag,Mode,DMAAccessModeView,EOCSelection,DMAContinuousRequests,Overrun,ClockPrescaler,CommonPathInternal
+ADC2.EOCSelection=ADC_EOC_SINGLE_CONV
+ADC2.IPParameters=Rank-4\#ChannelRegularConversion,Channel-4\#ChannelRegularConversion,SamplingTime-4\#ChannelRegularConversion,OffsetNumber-4\#ChannelRegularConversion,NbrOfConversionFlag,Mode,DMAAccessModeView,EOCSelection,DMAContinuousRequests,Overrun,ClockPrescaler,OversamplingMode,RightBitShift,Ratio,CommonPathInternal
 ADC2.Mode=ADC_DUALMODE_REGSIMULT
 ADC2.NbrOfConversionFlag=1
 ADC2.OffsetNumber-4\#ChannelRegularConversion=ADC_OFFSET_NONE
 ADC2.Overrun=ADC_OVR_DATA_OVERWRITTEN
+ADC2.OversamplingMode=ENABLE
 ADC2.Rank-4\#ChannelRegularConversion=1
-ADC2.SamplingTime-4\#ChannelRegularConversion=ADC_SAMPLETIME_2CYCLES_5
-ADC2.SingleDiff-4\#ChannelRegularConversion=ADC_DIFFERENTIAL_ENDED
+ADC2.Ratio=ADC_OVERSAMPLING_RATIO_256
+ADC2.RightBitShift=ADC_RIGHTBITSHIFT_4
+ADC2.SamplingTime-4\#ChannelRegularConversion=ADC_SAMPLETIME_640CYCLES_5
 ADC3.Channel-1\#ChannelRegularConversion=ADC_CHANNEL_1
 ADC3.ClockPrescaler=ADC_CLOCK_ASYNC_DIV256
@@ -86,5 +90,5 @@
 Dma.ADC1.0.MemInc=DMA_MINC_ENABLE
 Dma.ADC1.0.Mode=DMA_CIRCULAR
-Dma.ADC1.0.PeriphDataAlignment=DMA_PDATAALIGN_HALFWORD
+Dma.ADC1.0.PeriphDataAlignment=DMA_PDATAALIGN_WORD
 Dma.ADC1.0.PeriphInc=DMA_PINC_DISABLE
 Dma.ADC1.0.Polarity=HAL_DMAMUX_REQ_GEN_RISING
@@ -103,5 +107,5 @@
 Dma.ADC2.1.MemInc=DMA_MINC_ENABLE
 Dma.ADC2.1.Mode=DMA_CIRCULAR
-Dma.ADC2.1.PeriphDataAlignment=DMA_PDATAALIGN_HALFWORD
+Dma.ADC2.1.PeriphDataAlignment=DMA_PDATAALIGN_WORD
 Dma.ADC2.1.PeriphInc=DMA_PINC_DISABLE
 Dma.ADC2.1.Polarity=HAL_DMAMUX_REQ_GEN_RISING
@@ -170,5 +174,23 @@
 Dma.Request3=ADC4
 Dma.Request4=ADC5
-Dma.RequestsNb=5
+Dma.Request5=USART2_RX
+Dma.RequestsNb=6
+Dma.USART2_RX.5.Direction=DMA_PERIPH_TO_MEMORY
+Dma.USART2_RX.5.EventEnable=DISABLE
+Dma.USART2_RX.5.Instance=DMA1_Channel6
+Dma.USART2_RX.5.MemDataAlignment=DMA_MDATAALIGN_BYTE
+Dma.USART2_RX.5.MemInc=DMA_MINC_ENABLE
+Dma.USART2_RX.5.Mode=DMA_NORMAL
+Dma.USART2_RX.5.PeriphDataAlignment=DMA_PDATAALIGN_BYTE
+Dma.USART2_RX.5.PeriphInc=DMA_PINC_DISABLE
+Dma.USART2_RX.5.Polarity=HAL_DMAMUX_REQ_GEN_RISING
+Dma.USART2_RX.5.Priority=DMA_PRIORITY_LOW
+Dma.USART2_RX.5.RequestNumber=1
+Dma.USART2_RX.5.RequestParameters=Instance,Direction,PeriphInc,MemInc,PeriphDataAlignment,MemDataAlignment,Mode,Priority,SignalID,Polarity,RequestNumber,SyncSignalID,SyncPolarity,SyncEnable,EventEnable,SyncRequestNumber
+Dma.USART2_RX.5.SignalID=NONE
+Dma.USART2_RX.5.SyncEnable=DISABLE
+Dma.USART2_RX.5.SyncPolarity=HAL_DMAMUX_SYNC_NO_EVENT
+Dma.USART2_RX.5.SyncRequestNumber=1
+Dma.USART2_RX.5.SyncSignalID=NONE
 FDCAN2.CalculateBaudRateNominal=2083333
 FDCAN2.CalculateTimeBitNominal=480
@@ -216,43 +238,43 @@
 Mcu.Pin12=PA5
 Mcu.Pin13=PA6
-Mcu.Pin14=PA7
-Mcu.Pin15=PC4
-Mcu.Pin16=PC5
-Mcu.Pin17=PB0
-Mcu.Pin18=PB1
-Mcu.Pin19=PB10
+Mcu.Pin14=PC4
+Mcu.Pin15=PC5
+Mcu.Pin16=PB0
+Mcu.Pin17=PB1
+Mcu.Pin18=PB10
+Mcu.Pin19=PB11
 Mcu.Pin2=PC15-OSC32_OUT
-Mcu.Pin20=PB11
-Mcu.Pin21=PB12
-Mcu.Pin22=PB13
-Mcu.Pin23=PB14
-Mcu.Pin24=PB15
-Mcu.Pin25=PC6
-Mcu.Pin26=PC7
-Mcu.Pin27=PC8
-Mcu.Pin28=PC9
-Mcu.Pin29=PA8
+Mcu.Pin20=PB12
+Mcu.Pin21=PB13
+Mcu.Pin22=PB14
+Mcu.Pin23=PB15
+Mcu.Pin24=PC6
+Mcu.Pin25=PC7
+Mcu.Pin26=PC8
+Mcu.Pin27=PC9
+Mcu.Pin28=PA8
+Mcu.Pin29=PA9
 Mcu.Pin3=PF0-OSC_IN
-Mcu.Pin30=PA9
-Mcu.Pin31=PA10
-Mcu.Pin32=PA11
-Mcu.Pin33=PA12
-Mcu.Pin34=PA13
-Mcu.Pin35=PA14
-Mcu.Pin36=PA15
-Mcu.Pin37=PC10
-Mcu.Pin38=PC11
-Mcu.Pin39=PC12
+Mcu.Pin30=PA10
+Mcu.Pin31=PA11
+Mcu.Pin32=PA12
+Mcu.Pin33=PA13
+Mcu.Pin34=PA14
+Mcu.Pin35=PA15
+Mcu.Pin36=PC10
+Mcu.Pin37=PC11
+Mcu.Pin38=PC12
+Mcu.Pin39=PD2
 Mcu.Pin4=PF1-OSC_OUT
-Mcu.Pin40=PD2
-Mcu.Pin41=PB3
-Mcu.Pin42=PB4
-Mcu.Pin43=PB5
-Mcu.Pin44=PB6
-Mcu.Pin45=PB7
-Mcu.Pin46=PB9
-Mcu.Pin47=VP_ADC5_TempSens_Input
-Mcu.Pin48=VP_ADC5_Vbat_Input
-Mcu.Pin49=VP_CRC_VS_CRC
+Mcu.Pin40=PB3
+Mcu.Pin41=PB4
+Mcu.Pin42=PB5
+Mcu.Pin43=PB6
+Mcu.Pin44=PB7
+Mcu.Pin45=PB9
+Mcu.Pin46=VP_ADC5_TempSens_Input
+Mcu.Pin47=VP_ADC5_Vbat_Input
+Mcu.Pin48=VP_CRC_VS_CRC
+Mcu.Pin49=VP_SYS_V_VREFBUF
 Mcu.Pin5=PC0
 Mcu.Pin50=VP_SYS_VS_Systick
@@ -274,4 +296,5 @@
 NVIC.DMA1_Channel4_IRQn=true\:0\:0\:false\:false\:true\:false\:true\:true
 NVIC.DMA1_Channel5_IRQn=true\:0\:0\:false\:false\:true\:false\:true\:true
+NVIC.DMA1_Channel6_IRQn=true\:0\:0\:false\:false\:true\:false\:true\:true
 NVIC.DebugMonitor_IRQn=true\:0\:0\:false\:false\:true\:false\:false\:false
 NVIC.ForceEnableDMAVector=true
@@ -283,4 +306,6 @@
 NVIC.SVCall_IRQn=true\:0\:0\:false\:false\:true\:false\:false\:false
 NVIC.SysTick_IRQn=true\:15\:0\:false\:false\:true\:false\:true\:false
+NVIC.USART1_IRQn=true\:0\:0\:false\:false\:true\:true\:true\:true
+NVIC.USART2_IRQn=true\:0\:0\:false\:false\:true\:true\:true\:true
 NVIC.UsageFault_IRQn=true\:0\:0\:false\:false\:true\:false\:false\:false
 PA0.Locked=true
@@ -322,10 +347,6 @@
 PA6.GPIOParameters=GPIO_Label
 PA6.GPIO_Label=ADC2_IN3_UBAT+
-PA6.Mode=IN3-Differential
+PA6.Mode=IN3-Single-Ended
 PA6.Signal=ADC2_IN3
-PA7.GPIOParameters=GPIO_Label
-PA7.GPIO_Label=ADC2_IN4_UBAT-
-PA7.Mode=IN3-Differential
-PA7.Signal=ADC2_IN4
 PA8.GPIOParameters=GPIO_Label
 PA8.GPIO_Label=LVP_SENSE
@@ -524,6 +545,10 @@
 USART1.Parity=PARITY_EVEN
 USART1.VirtualMode-Asynchronous=VM_ASYNC
-USART2.IPParameters=VirtualMode-Asynchronous
+USART2.BaudRate=115200
+USART2.IPParameters=VirtualMode-Asynchronous,Parity,BaudRate,SwapParam,WordLength
+USART2.Parity=PARITY_EVEN
+USART2.SwapParam=ADVFEATURE_SWAP_ENABLE
 USART2.VirtualMode-Asynchronous=VM_ASYNC
+USART2.WordLength=WORDLENGTH_9B
 VP_ADC5_TempSens_Input.Mode=IN-TempSens
 VP_ADC5_TempSens_Input.Signal=ADC5_TempSens_Input
@@ -536,3 +561,5 @@
 VP_SYS_VS_Systick.Mode=SysTick
 VP_SYS_VS_Systick.Signal=SYS_VS_Systick
+VP_SYS_V_VREFBUF.Mode=ExternalMode
+VP_SYS_V_VREFBUF.Signal=SYS_V_VREFBUF
 board=custom
