Преглед на файлове

Sensors functionality enabled

Bartosz Jakubski преди 5 месеца
родител
ревизия
26d7339ce1
променени са 37 файла, в които са добавени 129445 реда и са изтрити 113384 реда
  1. 2 2
      OZE_Main/.mxproject
  2. 6 3
      OZE_Main/Core/Inc/measurements.h
  3. 118 12
      OZE_Main/Core/Src/main.c
  4. 6 3
      OZE_Main/Core/Src/mock_tasks.c
  5. 6 3
      OZE_Main/Core/Src/mqtt_client.c
  6. 22 0
      OZE_Main/Core/Src/stm32h7xx_hal_msp.c
  7. 2 2
      OZE_Main/Core/Src/syscalls.c
  8. 9 6
      OZE_Main/Core/Src/uart_tasks.c
  9. 75363 74054
      OZE_Main/Debug/OZE_Main.list
  10. 2996 2940
      OZE_Main/Debug/OZE_Main.map
  11. 99 55
      OZE_Main/OZE_Main.ioc
  12. 2 2
      OZE_Sensor/.mxproject
  13. 1 0
      OZE_Sensor/Core/Inc/adc_buffers.h
  14. 2 0
      OZE_Sensor/Core/Inc/main.h
  15. 11 0
      OZE_Sensor/Core/Inc/meas_tasks.h
  16. 6 3
      OZE_Sensor/Core/Inc/measurements.h
  17. 12 0
      OZE_Sensor/Core/Inc/peripherial.h
  18. 2 2
      OZE_Sensor/Core/Inc/stm32h7xx_hal_conf.h
  19. 2 0
      OZE_Sensor/Core/Inc/stm32h7xx_it.h
  20. 351 9
      OZE_Sensor/Core/Src/main.c
  21. 122 5
      OZE_Sensor/Core/Src/meas_tasks.c
  22. 6 3
      OZE_Sensor/Core/Src/mock_tasks.c
  23. 124 0
      OZE_Sensor/Core/Src/peripherial.c
  24. 1 1
      OZE_Sensor/Core/Src/serial_protocol.c
  25. 226 3
      OZE_Sensor/Core/Src/stm32h7xx_hal_msp.c
  26. 36 0
      OZE_Sensor/Core/Src/stm32h7xx_it.c
  27. 157 131
      OZE_Sensor/Core/Src/uart_tasks.c
  28. 8 2
      OZE_Sensor/Debug/Drivers/STM32H7xx_HAL_Driver/Src/subdir.mk
  29. 41937 34430
      OZE_Sensor/Debug/OZE_Sensor.list
  30. 2411 1663
      OZE_Sensor/Debug/OZE_Sensor.map
  31. 2 0
      OZE_Sensor/Debug/objects.list
  32. 554 0
      OZE_Sensor/Drivers/STM32H7xx_HAL_Driver/Inc/stm32h7xx_hal_dac.h
  33. 271 0
      OZE_Sensor/Drivers/STM32H7xx_HAL_Driver/Inc/stm32h7xx_hal_dac_ex.h
  34. 1864 0
      OZE_Sensor/Drivers/STM32H7xx_HAL_Driver/Inc/stm32h7xx_ll_dac.h
  35. 1591 0
      OZE_Sensor/Drivers/STM32H7xx_HAL_Driver/Src/stm32h7xx_hal_dac.c
  36. 927 0
      OZE_Sensor/Drivers/STM32H7xx_HAL_Driver/Src/stm32h7xx_hal_dac_ex.c
  37. 190 50
      OZE_Sensor/OZE_Sensor.ioc

Файловите разлики са ограничени, защото са твърде много
+ 2 - 2
OZE_Main/.mxproject


+ 6 - 3
OZE_Main/Core/Inc/measurements.h

@@ -31,9 +31,12 @@ struct _SesnorsInfo {
     float motorYAveCurrent;
     float motorXPeakCurrent;
     float motorYPeakCurrent;
-    uint8_t limitSwitchUp;
-    uint8_t limitSwitchDown;
-    uint8_t limitSwitchCenter;
+    uint8_t limitXSwitchUp;
+    uint8_t limitXSwitchDown;
+    uint8_t limitXSwitchCenter;
+    uint8_t limitYSwitchUp;
+    uint8_t limitYSwitchDown;
+    uint8_t limitYSwitchCenter;
     uint8_t powerSupplyFailMask;
 };
 

+ 118 - 12
OZE_Main/Core/Src/main.c

@@ -29,6 +29,7 @@
 /* USER CODE END Includes */
 
 /* Private typedef -----------------------------------------------------------*/
+typedef StaticTimer_t osStaticTimerDef_t;
 /* USER CODE BEGIN PTD */
 
 /* USER CODE END PTD */
@@ -64,6 +65,38 @@ const osThreadAttr_t defaultTask_attributes = {
   .stack_size = 512 * 4,
   .priority = (osPriority_t) osPriorityNormal,
 };
+/* Definitions for relay1Timer */
+osTimerId_t relay1TimerHandle;
+osStaticTimerDef_t relay1TimerControlBlock;
+const osTimerAttr_t relay1Timer_attributes = {
+  .name = "relay1Timer",
+  .cb_mem = &relay1TimerControlBlock,
+  .cb_size = sizeof(relay1TimerControlBlock),
+};
+/* Definitions for relay2Timer */
+osTimerId_t relay2TimerHandle;
+osStaticTimerDef_t relay2TimerControlBlock;
+const osTimerAttr_t relay2Timer_attributes = {
+  .name = "relay2Timer",
+  .cb_mem = &relay2TimerControlBlock,
+  .cb_size = sizeof(relay2TimerControlBlock),
+};
+/* Definitions for relay3Timer */
+osTimerId_t relay3TimerHandle;
+osStaticTimerDef_t relay3TimerControlBlock;
+const osTimerAttr_t relay3Timer_attributes = {
+  .name = "relay3Timer",
+  .cb_mem = &relay3TimerControlBlock,
+  .cb_size = sizeof(relay3TimerControlBlock),
+};
+/* Definitions for relay4Timer */
+osTimerId_t relay4TimerHandle;
+osStaticTimerDef_t relay4TimerControlBlock;
+const osTimerAttr_t relay4Timer_attributes = {
+  .name = "relay4Timer",
+  .cb_mem = &relay4TimerControlBlock,
+  .cb_size = sizeof(relay4TimerControlBlock),
+};
 /* USER CODE BEGIN PV */
 extern uint32_t MilliTimer;
 /* USER CODE END PV */
@@ -81,6 +114,9 @@ static void MX_USART2_UART_Init(void);
 static void MX_USART3_UART_Init(void);
 static void MX_USART6_UART_Init(void);
 void StartDefaultTask(void *argument);
+void relay1TimerCallback(void *argument);
+void relay2TimerCallback(void *argument);
+void relay3TimerCallback(void *argument);
 
 /* USER CODE BEGIN PFP */
 
@@ -88,9 +124,16 @@ void StartDefaultTask(void *argument);
 
 /* Private user code ---------------------------------------------------------*/
 /* USER CODE BEGIN 0 */
-void dmaCallback( struct __DMA_HandleTypeDef * hdma)
+//void dmaCallback( struct __DMA_HandleTypeDef * hdma)
+//{
+//	printf("DMA callback\n");
+//}
+
+int __io_putchar(int ch)
 {
-	printf("DMA callback\n");
+  HAL_UART_Transmit(&huart8, (uint8_t *)&ch, 1, 0xFFFF); // Use UART8 as debug interface
+//  ITM_SendChar(ch);	// Use SWV as debug interface
+  return ch;
 }
 /* USER CODE END 0 */
 
@@ -160,6 +203,19 @@ int main(void)
   /* add semaphores, ... */
   /* USER CODE END RTOS_SEMAPHORES */
 
+  /* Create the timer(s) */
+  /* creation of relay1Timer */
+  relay1TimerHandle = osTimerNew(relay1TimerCallback, osTimerOnce, NULL, &relay1Timer_attributes);
+
+  /* creation of relay2Timer */
+  relay2TimerHandle = osTimerNew(relay2TimerCallback, osTimerOnce, NULL, &relay2Timer_attributes);
+
+  /* creation of relay3Timer */
+  relay3TimerHandle = osTimerNew(relay3TimerCallback, osTimerOnce, NULL, &relay3Timer_attributes);
+
+  /* creation of relay4Timer */
+  relay4TimerHandle = osTimerNew(relay1TimerCallback, osTimerOnce, NULL, &relay4Timer_attributes);
+
   /* USER CODE BEGIN RTOS_TIMERS */
   /* start timers, add new ones, ... */
   /* USER CODE END RTOS_TIMERS */
@@ -397,8 +453,8 @@ static void MX_USART1_UART_Init(void)
   huart1.Init.OverSampling = UART_OVERSAMPLING_16;
   huart1.Init.OneBitSampling = UART_ONE_BIT_SAMPLE_DISABLE;
   huart1.Init.ClockPrescaler = UART_PRESCALER_DIV1;
-  huart1.AdvancedInit.AdvFeatureInit = UART_ADVFEATURE_RXINVERT_INIT;
-  huart1.AdvancedInit.RxPinLevelInvert = UART_ADVFEATURE_RXINV_ENABLE;
+  huart1.AdvancedInit.AdvFeatureInit = UART_ADVFEATURE_TXINVERT_INIT;
+  huart1.AdvancedInit.TxPinLevelInvert = UART_ADVFEATURE_TXINV_ENABLE;
   if (HAL_UART_Init(&huart1) != HAL_OK)
   {
     Error_Handler();
@@ -446,8 +502,8 @@ static void MX_USART2_UART_Init(void)
   huart2.Init.OverSampling = UART_OVERSAMPLING_16;
   huart2.Init.OneBitSampling = UART_ONE_BIT_SAMPLE_DISABLE;
   huart2.Init.ClockPrescaler = UART_PRESCALER_DIV1;
-  huart2.AdvancedInit.AdvFeatureInit = UART_ADVFEATURE_RXINVERT_INIT;
-  huart2.AdvancedInit.RxPinLevelInvert = UART_ADVFEATURE_RXINV_ENABLE;
+  huart2.AdvancedInit.AdvFeatureInit = UART_ADVFEATURE_TXINVERT_INIT;
+  huart2.AdvancedInit.TxPinLevelInvert = UART_ADVFEATURE_TXINV_ENABLE;
   if (HAL_UART_Init(&huart2) != HAL_OK)
   {
     Error_Handler();
@@ -495,8 +551,8 @@ static void MX_USART3_UART_Init(void)
   huart3.Init.OverSampling = UART_OVERSAMPLING_16;
   huart3.Init.OneBitSampling = UART_ONE_BIT_SAMPLE_DISABLE;
   huart3.Init.ClockPrescaler = UART_PRESCALER_DIV1;
-  huart3.AdvancedInit.AdvFeatureInit = UART_ADVFEATURE_RXINVERT_INIT;
-  huart3.AdvancedInit.RxPinLevelInvert = UART_ADVFEATURE_RXINV_ENABLE;
+  huart3.AdvancedInit.AdvFeatureInit = UART_ADVFEATURE_TXINVERT_INIT;
+  huart3.AdvancedInit.TxPinLevelInvert = UART_ADVFEATURE_TXINV_ENABLE;
   if (HAL_UART_Init(&huart3) != HAL_OK)
   {
     Error_Handler();
@@ -544,8 +600,8 @@ static void MX_USART6_UART_Init(void)
   huart6.Init.OverSampling = UART_OVERSAMPLING_16;
   huart6.Init.OneBitSampling = UART_ONE_BIT_SAMPLE_DISABLE;
   huart6.Init.ClockPrescaler = UART_PRESCALER_DIV1;
-  huart6.AdvancedInit.AdvFeatureInit = UART_ADVFEATURE_RXINVERT_INIT;
-  huart6.AdvancedInit.RxPinLevelInvert = UART_ADVFEATURE_RXINV_ENABLE;
+  huart6.AdvancedInit.AdvFeatureInit = UART_ADVFEATURE_TXINVERT_INIT;
+  huart6.AdvancedInit.TxPinLevelInvert = UART_ADVFEATURE_TXINV_ENABLE;
   if (HAL_UART_Init(&huart6) != HAL_OK)
   {
     Error_Handler();
@@ -594,17 +650,43 @@ static void MX_DMA_Init(void)
   */
 static void MX_GPIO_Init(void)
 {
+  GPIO_InitTypeDef GPIO_InitStruct = {0};
 /* USER CODE BEGIN MX_GPIO_Init_1 */
-	GPIO_InitTypeDef GPIO_InitStruct = {0};
 /* USER CODE END MX_GPIO_Init_1 */
 
   /* GPIO Ports Clock Enable */
+  __HAL_RCC_GPIOE_CLK_ENABLE();
   __HAL_RCC_GPIOH_CLK_ENABLE();
   __HAL_RCC_GPIOC_CLK_ENABLE();
   __HAL_RCC_GPIOA_CLK_ENABLE();
   __HAL_RCC_GPIOB_CLK_ENABLE();
   __HAL_RCC_GPIOD_CLK_ENABLE();
-  __HAL_RCC_GPIOE_CLK_ENABLE();
+
+  /*Configure GPIO pin Output Level */
+  HAL_GPIO_WritePin(GPIOE, GPIO_PIN_2|GPIO_PIN_3|GPIO_PIN_4|GPIO_PIN_5, GPIO_PIN_RESET);
+
+  /*Configure GPIO pin Output Level */
+  HAL_GPIO_WritePin(GPIOD, GPIO_PIN_11|GPIO_PIN_12|GPIO_PIN_13|GPIO_PIN_14, GPIO_PIN_RESET);
+
+  /*Configure GPIO pins : PE2 PE3 PE4 PE5 */
+  GPIO_InitStruct.Pin = GPIO_PIN_2|GPIO_PIN_3|GPIO_PIN_4|GPIO_PIN_5;
+  GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
+  GPIO_InitStruct.Pull = GPIO_NOPULL;
+  GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
+  HAL_GPIO_Init(GPIOE, &GPIO_InitStruct);
+
+  /*Configure GPIO pins : PD11 PD12 PD13 PD14 */
+  GPIO_InitStruct.Pin = GPIO_PIN_11|GPIO_PIN_12|GPIO_PIN_13|GPIO_PIN_14;
+  GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
+  GPIO_InitStruct.Pull = GPIO_NOPULL;
+  GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
+  HAL_GPIO_Init(GPIOD, &GPIO_InitStruct);
+
+  /*Configure GPIO pins : PD1 PD2 PD4 */
+  GPIO_InitStruct.Pin = GPIO_PIN_1|GPIO_PIN_2|GPIO_PIN_4;
+  GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
+  GPIO_InitStruct.Pull = GPIO_NOPULL;
+  HAL_GPIO_Init(GPIOD, &GPIO_InitStruct);
 
 /* USER CODE BEGIN MX_GPIO_Init_2 */
   GPIO_InitStruct.Pin = GPIO_PIN_14|GPIO_PIN_15;
@@ -653,6 +735,30 @@ void StartDefaultTask(void *argument)
   /* USER CODE END 5 */
 }
 
+/* relay1TimerCallback function */
+void relay1TimerCallback(void *argument)
+{
+  /* USER CODE BEGIN relay1TimerCallback */
+
+  /* USER CODE END relay1TimerCallback */
+}
+
+/* relay2TimerCallback function */
+void relay2TimerCallback(void *argument)
+{
+  /* USER CODE BEGIN relay2TimerCallback */
+
+  /* USER CODE END relay2TimerCallback */
+}
+
+/* relay3TimerCallback function */
+void relay3TimerCallback(void *argument)
+{
+  /* USER CODE BEGIN relay3TimerCallback */
+
+  /* USER CODE END relay3TimerCallback */
+}
+
  /* MPU Configuration */
 
 void MPU_Config(void)

+ 6 - 3
OZE_Main/Core/Src/mock_tasks.c

@@ -83,9 +83,12 @@ void MockMeasurmetsTask (void* argument) {
 			sensors->motorYAveCurrent = 3 + (0.01 * (counter % 100));
 			sensors->motorXPeakCurrent = 6 + (0.01 * (counter % 100));
 			sensors->motorYPeakCurrent = 6 + (0.01 * (counter % 100));
-			sensors->limitSwitchUp = (counter % 100) > 50 ? 1 : 0;
-			sensors->limitSwitchDown = (counter % 100) < 25 ? 1 : 0;
-			sensors->limitSwitchCenter = (counter % 100) > 35 ? 1 : 0;
+			sensors->limitXSwitchUp = (counter % 100) > 50 ? 1 : 0;
+			sensors->limitXSwitchDown = (counter % 100) < 25 ? 1 : 0;
+			sensors->limitXSwitchCenter = (counter % 100) > 35 ? 1 : 0;
+			sensors->limitYSwitchUp = (counter % 100) > 50 ? 1 : 0;
+			sensors->limitYSwitchDown = (counter % 100) < 25 ? 1 : 0;
+			sensors->limitYSwitchCenter = (counter % 100) > 35 ? 1 : 0;
 			sensors->powerSupplyFailMask = 0;
 			osMutexRelease(sensorsInfoMutex);
 		}

+ 6 - 3
OZE_Main/Core/Src/mqtt_client.c

@@ -135,9 +135,12 @@ void MqttClientPubTask (void* argument) {
                     bytesInBuffer += sprintf (&messageBuffer[bytesInBuffer], "\"motorYAveCurrent\":%.3f, ", sensors->motorYAveCurrent);
                     bytesInBuffer += sprintf (&messageBuffer[bytesInBuffer], "\"motorXPeakCurrent\":%.3f, ", sensors->motorXPeakCurrent);
                     bytesInBuffer += sprintf (&messageBuffer[bytesInBuffer], "\"motorYPeakCurrent\":%.3f, ", sensors->motorYPeakCurrent);
-                    bytesInBuffer += sprintf (&messageBuffer[bytesInBuffer], "\"limitSwitchUp\":%d, ", sensors->limitSwitchUp);
-                    bytesInBuffer += sprintf (&messageBuffer[bytesInBuffer], "\"limitSwitchDown\":%d, ", sensors->limitSwitchDown);
-                    bytesInBuffer += sprintf (&messageBuffer[bytesInBuffer], "\"limitSwitchCenter\":%d, ", sensors->limitSwitchCenter);
+                    bytesInBuffer += sprintf (&messageBuffer[bytesInBuffer], "\"limitXSwitchUp\":%d, ", sensors->limitXSwitchUp);
+                    bytesInBuffer += sprintf (&messageBuffer[bytesInBuffer], "\"limitXSwitchDown\":%d, ", sensors->limitXSwitchDown);
+                    bytesInBuffer += sprintf (&messageBuffer[bytesInBuffer], "\"limitXSwitchCenter\":%d, ", sensors->limitXSwitchCenter);
+                    bytesInBuffer += sprintf (&messageBuffer[bytesInBuffer], "\"limitYSwitchUp\":%d, ", sensors->limitYSwitchUp);
+                    bytesInBuffer += sprintf (&messageBuffer[bytesInBuffer], "\"limitYSwitchDown\":%d, ", sensors->limitYSwitchDown);
+                    bytesInBuffer += sprintf (&messageBuffer[bytesInBuffer], "\"limitYSwitchCenter\":%d, ", sensors->limitYSwitchCenter);
                     bytesInBuffer += sprintf (&messageBuffer[bytesInBuffer], "\"powerSupplyFailMask\":%d}", sensors->powerSupplyFailMask);
 
                     osMutexRelease (sensorsInfoMutex);

+ 22 - 0
OZE_Main/Core/Src/stm32h7xx_hal_msp.c

@@ -69,6 +69,8 @@ void HAL_MspInit(void)
   /* USER CODE BEGIN MspInit 0 */
 
   /* USER CODE END MspInit 0 */
+  PWREx_AVDTypeDef sConfigAVD = {0};
+  PWR_PVDTypeDef sConfigPVD = {0};
 
   __HAL_RCC_SYSCFG_CLK_ENABLE();
 
@@ -81,6 +83,26 @@ void HAL_MspInit(void)
   HAL_NVIC_SetPriority(RCC_IRQn, 5, 0);
   HAL_NVIC_EnableIRQ(RCC_IRQn);
 
+  /** AVD Configuration
+  */
+  sConfigAVD.AVDLevel = PWR_AVDLEVEL_3;
+  sConfigAVD.Mode = PWR_AVD_MODE_NORMAL;
+  HAL_PWREx_ConfigAVD(&sConfigAVD);
+
+  /** Enable the AVD Output
+  */
+  HAL_PWREx_EnableAVD();
+
+  /** PVD Configuration
+  */
+  sConfigPVD.PVDLevel = PWR_PVDLEVEL_6;
+  sConfigPVD.Mode = PWR_PVD_MODE_NORMAL;
+  HAL_PWR_ConfigPVD(&sConfigPVD);
+
+  /** Enable the PVD Output
+  */
+  HAL_PWR_EnablePVD();
+
   /* USER CODE BEGIN MspInit 1 */
 
   /* USER CODE END MspInit 1 */

+ 2 - 2
OZE_Main/Core/Src/syscalls.c

@@ -84,8 +84,8 @@ __attribute__((weak)) int _write(int file, char *ptr, int len)
 
   for (DataIdx = 0; DataIdx < len; DataIdx++)
   {
-//    __io_putchar(*ptr++);
-	  ITM_SendChar(*ptr++);
+    __io_putchar(*ptr++);
+//	  ITM_SendChar(*ptr++);
   }
   return len;
 }

+ 9 - 6
OZE_Main/Core/Src/uart_tasks.c

@@ -371,10 +371,10 @@ void UartTxTask (void* argument) {
             case spSetFanSpeed:
             case spSetMotorXOn:
             case spSetMotorYOn:
-                WriteDataToBuffer (outputDataBuffer, &outputDataBufferPos, &data.values.integerValues.value[0], sizeof (float));
-                WriteDataToBuffer (outputDataBuffer, &outputDataBufferPos, &data.values.integerValues.value[1], sizeof (float));
+                WriteDataToBuffer (outputDataBuffer, &outputDataBufferPos, &data.values.integerValues.value[0], sizeof (uint32_t));
+                WriteDataToBuffer (outputDataBuffer, &outputDataBufferPos, &data.values.integerValues.value[1], sizeof (uint32_t));
                 break;
-            case spSetDiodeOn: WriteDataToBuffer (outputDataBuffer, &outputDataBufferPos, &data.values.integerValues.value[0], sizeof (float)); break;
+            case spSetDiodeOn: WriteDataToBuffer (outputDataBuffer, &outputDataBufferPos, &data.values.integerValues.value[0], sizeof (uint32_t)); break;
             case spSetmotorXMaxCurrent:
             case spSetmotorYMaxCurrent: WriteDataToBuffer (outputDataBuffer, &outputDataBufferPos, &data.values.flaotValues.value[0], sizeof (float)); break;
             case spGetElectricalMeasurments:
@@ -436,9 +436,12 @@ void UartTxTask (void* argument) {
                     	ReadFloatFromBuffer(frameData.dataBuffer, &inputDataBufferPos, &sensors->motorYAveCurrent);
                     	ReadFloatFromBuffer(frameData.dataBuffer, &inputDataBufferPos, &sensors->motorXPeakCurrent);
                     	ReadFloatFromBuffer(frameData.dataBuffer, &inputDataBufferPos, &sensors->motorYPeakCurrent);
-                    	ReadByteFromBufer(frameData.dataBuffer, &inputDataBufferPos, &sensors->limitSwitchUp);
-                    	ReadByteFromBufer(frameData.dataBuffer, &inputDataBufferPos, &sensors->limitSwitchDown);
-                    	ReadByteFromBufer(frameData.dataBuffer, &inputDataBufferPos, &sensors->limitSwitchCenter);
+                    	ReadByteFromBufer(frameData.dataBuffer, &inputDataBufferPos, &sensors->limitXSwitchUp);
+                    	ReadByteFromBufer(frameData.dataBuffer, &inputDataBufferPos, &sensors->limitXSwitchDown);
+                    	ReadByteFromBufer(frameData.dataBuffer, &inputDataBufferPos, &sensors->limitXSwitchCenter);
+                    	ReadByteFromBufer(frameData.dataBuffer, &inputDataBufferPos, &sensors->limitYSwitchUp);
+                    	ReadByteFromBufer(frameData.dataBuffer, &inputDataBufferPos, &sensors->limitYSwitchDown);
+                    	ReadByteFromBufer(frameData.dataBuffer, &inputDataBufferPos, &sensors->limitYSwitchCenter);
                     	ReadByteFromBufer(frameData.dataBuffer, &inputDataBufferPos, &sensors->powerSupplyFailMask);
                     	osMutexRelease(sensorsInfoMutex);
                     	break;

Файловите разлики са ограничени, защото са твърде много
+ 75363 - 74054
OZE_Main/Debug/OZE_Main.list


Файловите разлики са ограничени, защото са твърде много
+ 2996 - 2940
OZE_Main/Debug/OZE_Main.map


+ 99 - 55
OZE_Main/OZE_Main.ioc

@@ -64,8 +64,9 @@ Dma.UART8_TX.1.SyncRequestNumber=1
 Dma.UART8_TX.1.SyncSignalID=NONE
 ETH.IPParameters=MediaInterface
 ETH.MediaInterface=HAL_ETH_MII_MODE
-FREERTOS.IPParameters=Tasks01,configUSE_NEWLIB_REENTRANT,configMINIMAL_STACK_SIZE,configCHECK_FOR_STACK_OVERFLOW,configTOTAL_HEAP_SIZE
+FREERTOS.IPParameters=Tasks01,configUSE_NEWLIB_REENTRANT,configMINIMAL_STACK_SIZE,configCHECK_FOR_STACK_OVERFLOW,configTOTAL_HEAP_SIZE,Timers01
 FREERTOS.Tasks01=defaultTask,24,512,StartDefaultTask,Default,NULL,Dynamic,NULL,NULL
+FREERTOS.Timers01=relay1Timer,relay1TimerCallback,osTimerOnce,Default,NULL,Static,relay1TimerControlBlock;relay2Timer,relay2TimerCallback,osTimerOnce,Default,NULL,Static,relay2TimerControlBlock;relay3Timer,relay3TimerCallback,osTimerOnce,Default,NULL,Static,relay3TimerControlBlock;relay4Timer,relay1TimerCallback,osTimerOnce,Default,NULL,Static,relay4TimerControlBlock
 FREERTOS.configCHECK_FOR_STACK_OVERFLOW=1
 FREERTOS.configMINIMAL_STACK_SIZE=512
 FREERTOS.configTOTAL_HEAP_SIZE=131072
@@ -96,60 +97,74 @@ Mcu.CPN=STM32H742VIT6
 Mcu.Family=STM32H7
 Mcu.IP0=CORTEX_M7
 Mcu.IP1=CRC
-Mcu.IP10=SYS
-Mcu.IP11=UART8
-Mcu.IP12=USART1
-Mcu.IP13=USART2
-Mcu.IP14=USART3
-Mcu.IP15=USART6
+Mcu.IP10=RNG
+Mcu.IP11=SYS
+Mcu.IP12=UART8
+Mcu.IP13=USART1
+Mcu.IP14=USART2
+Mcu.IP15=USART3
+Mcu.IP16=USART6
 Mcu.IP2=DEBUG
 Mcu.IP3=DMA
 Mcu.IP4=ETH
 Mcu.IP5=FREERTOS
 Mcu.IP6=LWIP
 Mcu.IP7=NVIC
-Mcu.IP8=RCC
-Mcu.IP9=RNG
-Mcu.IPNb=16
+Mcu.IP8=PWR
+Mcu.IP9=RCC
+Mcu.IPNb=17
 Mcu.Name=STM32H742V(G-I)Tx
 Mcu.Package=LQFP100
-Mcu.Pin0=PH0-OSC_IN (PH0)
-Mcu.Pin1=PH1-OSC_OUT (PH1)
-Mcu.Pin10=PC4
-Mcu.Pin11=PC5
-Mcu.Pin12=PB0
-Mcu.Pin13=PB1
-Mcu.Pin14=PB10
-Mcu.Pin15=PB11
-Mcu.Pin16=PB12
-Mcu.Pin17=PB13
-Mcu.Pin18=PB14
-Mcu.Pin19=PB15
-Mcu.Pin2=PC1
-Mcu.Pin20=PD8
-Mcu.Pin21=PD9
-Mcu.Pin22=PC6
-Mcu.Pin23=PC7
-Mcu.Pin24=PA13 (JTMS/SWDIO)
-Mcu.Pin25=PA14 (JTCK/SWCLK)
-Mcu.Pin26=PD5
-Mcu.Pin27=PD6
-Mcu.Pin28=PB8
-Mcu.Pin29=PE0
-Mcu.Pin3=PC2_C
-Mcu.Pin30=PE1
-Mcu.Pin31=VP_CRC_VS_CRC
-Mcu.Pin32=VP_FREERTOS_VS_CMSIS_V2
-Mcu.Pin33=VP_LWIP_VS_Enabled
-Mcu.Pin34=VP_RNG_VS_RNG
-Mcu.Pin35=VP_SYS_VS_tim6
-Mcu.Pin4=PC3_C
-Mcu.Pin5=PA0
-Mcu.Pin6=PA1
-Mcu.Pin7=PA2
-Mcu.Pin8=PA3
-Mcu.Pin9=PA7
-Mcu.PinsNb=36
+Mcu.Pin0=PE2
+Mcu.Pin1=PE3
+Mcu.Pin10=PA1
+Mcu.Pin11=PA2
+Mcu.Pin12=PA3
+Mcu.Pin13=PA7
+Mcu.Pin14=PC4
+Mcu.Pin15=PC5
+Mcu.Pin16=PB0
+Mcu.Pin17=PB1
+Mcu.Pin18=PB10
+Mcu.Pin19=PB11
+Mcu.Pin2=PE4
+Mcu.Pin20=PB12
+Mcu.Pin21=PB13
+Mcu.Pin22=PB14
+Mcu.Pin23=PB15
+Mcu.Pin24=PD8
+Mcu.Pin25=PD9
+Mcu.Pin26=PD11
+Mcu.Pin27=PD12
+Mcu.Pin28=PD13
+Mcu.Pin29=PD14
+Mcu.Pin3=PE5
+Mcu.Pin30=PC6
+Mcu.Pin31=PC7
+Mcu.Pin32=PA13 (JTMS/SWDIO)
+Mcu.Pin33=PA14 (JTCK/SWCLK)
+Mcu.Pin34=PD1
+Mcu.Pin35=PD2
+Mcu.Pin36=PD4
+Mcu.Pin37=PD5
+Mcu.Pin38=PD6
+Mcu.Pin39=PB8
+Mcu.Pin4=PH0-OSC_IN (PH0)
+Mcu.Pin40=PE0
+Mcu.Pin41=PE1
+Mcu.Pin42=VP_CRC_VS_CRC
+Mcu.Pin43=VP_FREERTOS_VS_CMSIS_V2
+Mcu.Pin44=VP_LWIP_VS_Enabled
+Mcu.Pin45=VP_PWR_VDDA
+Mcu.Pin46=VP_PWR_V_PVD_IN
+Mcu.Pin47=VP_RNG_VS_RNG
+Mcu.Pin48=VP_SYS_VS_tim6
+Mcu.Pin5=PH1-OSC_OUT (PH1)
+Mcu.Pin6=PC1
+Mcu.Pin7=PC2_C
+Mcu.Pin8=PC3_C
+Mcu.Pin9=PA0
+Mcu.PinsNb=49
 Mcu.ThirdPartyNb=0
 Mcu.UserConstants=
 Mcu.UserName=STM32H742VITx
@@ -270,6 +285,20 @@ PC7.GPIOParameters=GPIO_Speed
 PC7.GPIO_Speed=GPIO_SPEED_FREQ_HIGH
 PC7.Mode=Asynchronous
 PC7.Signal=USART6_RX
+PD1.Locked=true
+PD1.Signal=GPIO_Input
+PD11.Locked=true
+PD11.Signal=GPIO_Output
+PD12.Locked=true
+PD12.Signal=GPIO_Output
+PD13.Locked=true
+PD13.Signal=GPIO_Output
+PD14.Locked=true
+PD14.Signal=GPIO_Output
+PD2.Locked=true
+PD2.Signal=GPIO_Input
+PD4.Locked=true
+PD4.Signal=GPIO_Input
 PD5.GPIOParameters=GPIO_Speed
 PD5.GPIO_Speed=GPIO_SPEED_FREQ_HIGH
 PD5.Mode=Asynchronous
@@ -290,10 +319,21 @@ PE0.Mode=Asynchronous
 PE0.Signal=UART8_RX
 PE1.Mode=Asynchronous
 PE1.Signal=UART8_TX
+PE2.Locked=true
+PE2.Signal=GPIO_Output
+PE3.Locked=true
+PE3.Signal=GPIO_Output
+PE4.Locked=true
+PE4.Signal=GPIO_Output
+PE5.Locked=true
+PE5.Signal=GPIO_Output
 PH0-OSC_IN\ (PH0).Mode=HSE-External-Oscillator
 PH0-OSC_IN\ (PH0).Signal=RCC_OSC_IN
 PH1-OSC_OUT\ (PH1).Mode=HSE-External-Oscillator
 PH1-OSC_OUT\ (PH1).Signal=RCC_OSC_OUT
+PWR.AVDLevel=PWR_AVDLEVEL_3
+PWR.IPParameters=AVDLevel,PVDLevel
+PWR.PVDLevel=PWR_PVDLEVEL_6
 PinOutPanel.RotationAngle=0
 ProjectManager.AskForMigrate=true
 ProjectManager.BackupPrevious=true
@@ -405,20 +445,20 @@ RCC.VCOInput1Freq_Value=5000000
 RCC.VCOInput2Freq_Value=5000000
 RCC.VCOInput3Freq_Value=5000000
 USART1.IPParameters=VirtualMode-Asynchronous,TxPinLevelInvertParam,RxPinLevelInvertParam
-USART1.RxPinLevelInvertParam=ADVFEATURE_RXINV_ENABLE
-USART1.TxPinLevelInvertParam=ADVFEATURE_TXINV_DISABLE
+USART1.RxPinLevelInvertParam=ADVFEATURE_RXINV_DISABLE
+USART1.TxPinLevelInvertParam=ADVFEATURE_TXINV_ENABLE
 USART1.VirtualMode-Asynchronous=VM_ASYNC
 USART2.IPParameters=VirtualMode-Asynchronous,TxPinLevelInvertParam,RxPinLevelInvertParam
-USART2.RxPinLevelInvertParam=ADVFEATURE_RXINV_ENABLE
-USART2.TxPinLevelInvertParam=ADVFEATURE_TXINV_DISABLE
+USART2.RxPinLevelInvertParam=ADVFEATURE_RXINV_DISABLE
+USART2.TxPinLevelInvertParam=ADVFEATURE_TXINV_ENABLE
 USART2.VirtualMode-Asynchronous=VM_ASYNC
 USART3.IPParameters=VirtualMode-Asynchronous,TxPinLevelInvertParam,RxPinLevelInvertParam
-USART3.RxPinLevelInvertParam=ADVFEATURE_RXINV_ENABLE
-USART3.TxPinLevelInvertParam=ADVFEATURE_TXINV_DISABLE
+USART3.RxPinLevelInvertParam=ADVFEATURE_RXINV_DISABLE
+USART3.TxPinLevelInvertParam=ADVFEATURE_TXINV_ENABLE
 USART3.VirtualMode-Asynchronous=VM_ASYNC
 USART6.IPParameters=VirtualMode,TxPinLevelInvertParam,RxPinLevelInvertParam
-USART6.RxPinLevelInvertParam=ADVFEATURE_RXINV_ENABLE
-USART6.TxPinLevelInvertParam=ADVFEATURE_TXINV_DISABLE
+USART6.RxPinLevelInvertParam=ADVFEATURE_RXINV_DISABLE
+USART6.TxPinLevelInvertParam=ADVFEATURE_TXINV_ENABLE
 USART6.VirtualMode=VM_ASYNC
 VP_CRC_VS_CRC.Mode=CRC_Activate
 VP_CRC_VS_CRC.Signal=CRC_VS_CRC
@@ -426,6 +466,10 @@ VP_FREERTOS_VS_CMSIS_V2.Mode=CMSIS_V2
 VP_FREERTOS_VS_CMSIS_V2.Signal=FREERTOS_VS_CMSIS_V2
 VP_LWIP_VS_Enabled.Mode=Enabled
 VP_LWIP_VS_Enabled.Signal=LWIP_VS_Enabled
+VP_PWR_VDDA.Mode=AVD
+VP_PWR_VDDA.Signal=PWR_VDDA
+VP_PWR_V_PVD_IN.Mode=Mode_PVD_Int
+VP_PWR_V_PVD_IN.Signal=PWR_V_PVD_IN
 VP_RNG_VS_RNG.Mode=RNG_Activate
 VP_RNG_VS_RNG.Signal=RNG_VS_RNG
 VP_SYS_VS_tim6.Mode=TIM6

Файловите разлики са ограничени, защото са твърде много
+ 2 - 2
OZE_Sensor/.mxproject


+ 1 - 0
OZE_Sensor/Core/Inc/adc_buffers.h

@@ -23,6 +23,7 @@ enum _ADC1_DataInfo {
 	IL1Ref,
 	IL2Ref,
 	IL3Ref,
+	FanFB,
     ADC1LastData,
 };
 typedef enum _ADC1_DataInfo ADC1_DataInfo;

+ 2 - 0
OZE_Sensor/Core/Inc/main.h

@@ -49,6 +49,8 @@ extern "C" {
 
 /* USER CODE END EM */
 
+void HAL_TIM_MspPostInit(TIM_HandleTypeDef *htim);
+
 /* Exported functions prototypes ---------------------------------------------*/
 void Error_Handler(void);
 

+ 11 - 0
OZE_Sensor/Core/Inc/meas_tasks.h

@@ -12,12 +12,22 @@
 #include "FreeRTOSConfig.h"
 #include "task.h"
 #include "cmsis_os.h"
+#include "stm32h7xx_hal.h"
 
 #define GAIN_AUTO_CORRECTION
 
+struct _LimiterSwitchData
+{
+	uint16_t gpioPin;
+	GPIO_PinState pinState;
+};
+
+typedef struct _LimiterSwitchData LimiterSwitchData;
+
 extern osMessageQueueId_t adc1MeasDataQueue;
 extern osMessageQueueId_t adc2MeasDataQueue;
 extern osMessageQueueId_t adc3MeasDataQueue;
+extern osMessageQueueId_t limiterSwitchDataQueue;
 
 extern osMutexId_t resMeasurementsMutex;
 extern osMutexId_t sensorsInfoMutex;
@@ -26,5 +36,6 @@ void MeasTasksInit(void);
 void ADC1MeasTask(void *arg);
 void ADC2MeasTask(void *arg);
 void ADC3MeasTask(void *arg);
+void LimiterSwitchTask (void* arg);
 
 #endif /* INC_MEAS_TASKS_H_ */

+ 6 - 3
OZE_Sensor/Core/Inc/measurements.h

@@ -30,9 +30,12 @@ struct _SesnorsInfo {
     float motorYAveCurrent;
     float motorXPeakCurrent;
     float motorYPeakCurrent;
-    uint8_t limitSwitchUp;
-    uint8_t limitSwitchDown;
-    uint8_t limitSwitchCenter;
+    uint8_t limitXSwitchUp;
+    uint8_t limitXSwitchDown;
+    uint8_t limitXSwitchCenter;
+    uint8_t limitYSwitchUp;
+    uint8_t limitYSwitchDown;
+    uint8_t limitYSwitchCenter;
     uint8_t powerSupplyFailMask;
 };
 

+ 12 - 0
OZE_Sensor/Core/Inc/peripherial.h

@@ -9,6 +9,7 @@
 #define INC_PERIPHERIAL_H_
 
 #include "main.h"
+#include "cmsis_os.h"
 
 #define DBG_LED1 GPIO_PIN_4
 #define DBG_LED2 GPIO_PIN_5
@@ -38,6 +39,14 @@ enum _CurrentSensorGain
 };
 typedef enum _CurrentSensorGain CurrentSensorGain;
 
+enum _MotorDriverState
+{
+	HiZ,
+	Forward,
+	Reverse,
+	Brake
+};
+typedef enum _MotorDriverState MotorDriverState;
 
 void DbgLEDOn(uint8_t ledNumber);
 void DbgLEDOff(uint8_t ledNumber);
@@ -45,5 +54,8 @@ void DbgLEDToggle(uint8_t ledNumber);
 void EnableCurrentSensors(void);
 void DisableCurrentSensors(void);
 void SelectCurrentSensorGain(CurrentSensor sensor, CurrentSensorGain gain);
+void motorAction(TIM_HandleTypeDef *tim, TIM_OC_InitTypeDef *timerConf, uint32_t channel1, uint32_t channel2, MotorDriverState setState, uint32_t pulse);
+uint8_t motorControl (TIM_HandleTypeDef* htim, TIM_OC_InitTypeDef* motorTimerConfigOC, uint8_t channel1, uint8_t channel2, osTimerId_t motorTimerHandle,
+		int32_t motorPWMPulse, int32_t motorTimerPeriod, uint8_t switchLimiterUpStat, uint8_t switchLimiterDownStat) ;
 
 #endif /* INC_PERIPHERIAL_H_ */

+ 2 - 2
OZE_Sensor/Core/Inc/stm32h7xx_hal_conf.h

@@ -42,7 +42,7 @@
 /* #define HAL_CORDIC_MODULE_ENABLED   */
 #define HAL_CRC_MODULE_ENABLED
 /* #define HAL_CRYP_MODULE_ENABLED   */
-/* #define HAL_DAC_MODULE_ENABLED   */
+#define HAL_DAC_MODULE_ENABLED
 /* #define HAL_DCMI_MODULE_ENABLED   */
 /* #define HAL_DMA2D_MODULE_ENABLED   */
 /* #define HAL_ETH_MODULE_ENABLED   */
@@ -166,7 +166,7 @@
   * @brief This is the HAL system configuration section
   */
 #define  VDD_VALUE                    (3300UL) /*!< Value of VDD in mv */
-#define  TICK_INT_PRIORITY            (15UL) /*!< tick interrupt priority */
+#define  TICK_INT_PRIORITY            (5UL) /*!< tick interrupt priority */
 #define  USE_RTOS                     0
 #define  USE_SD_TRANSCEIVER           0U               /*!< use uSD Transceiver */
 #define  USE_SPI_CRC	              0U               /*!< use CRC in SPI */

+ 2 - 0
OZE_Sensor/Core/Inc/stm32h7xx_it.h

@@ -56,8 +56,10 @@ void RCC_IRQHandler(void);
 void DMA1_Stream0_IRQHandler(void);
 void DMA1_Stream1_IRQHandler(void);
 void DMA1_Stream2_IRQHandler(void);
+void EXTI9_5_IRQHandler(void);
 void TIM2_IRQHandler(void);
 void USART1_IRQHandler(void);
+void EXTI15_10_IRQHandler(void);
 void TIM6_DAC_IRQHandler(void);
 void UART8_IRQHandler(void);
 /* USER CODE BEGIN EFP */

+ 351 - 9
OZE_Sensor/Core/Src/main.c

@@ -22,15 +22,19 @@
 
 /* Private includes ----------------------------------------------------------*/
 /* USER CODE BEGIN Includes */
+#include "string.h"
+
 #include "uart_tasks.h"
 #include "mock_tasks.h"
 #include "node-red-config.h"
 #include "adc_buffers.h"
 #include "meas_tasks.h"
 #include "peripherial.h"
+#include "measurements.h"
 /* USER CODE END Includes */
 
 /* Private typedef -----------------------------------------------------------*/
+typedef StaticTimer_t osStaticTimerDef_t;
 /* USER CODE BEGIN PTD */
 
 /* USER CODE END PTD */
@@ -55,9 +59,13 @@ DMA_HandleTypeDef hdma_adc3;
 
 CRC_HandleTypeDef hcrc;
 
+DAC_HandleTypeDef hdac1;
+
 RNG_HandleTypeDef hrng;
 
+TIM_HandleTypeDef htim1;
 TIM_HandleTypeDef htim2;
+TIM_HandleTypeDef htim3;
 
 UART_HandleTypeDef huart8;
 UART_HandleTypeDef huart1;
@@ -69,8 +77,43 @@ const osThreadAttr_t defaultTask_attributes = {
   .stack_size = 512 * 4,
   .priority = (osPriority_t) osPriorityNormal,
 };
+/* Definitions for debugLedTimer */
+osTimerId_t debugLedTimerHandle;
+osStaticTimerDef_t debugLedTimerControlBlock;
+const osTimerAttr_t debugLedTimer_attributes = {
+  .name = "debugLedTimer",
+  .cb_mem = &debugLedTimerControlBlock,
+  .cb_size = sizeof(debugLedTimerControlBlock),
+};
+/* Definitions for fanTimer */
+osTimerId_t fanTimerHandle;
+osStaticTimerDef_t fanTimerControlBlock;
+const osTimerAttr_t fanTimer_attributes = {
+  .name = "fanTimer",
+  .cb_mem = &fanTimerControlBlock,
+  .cb_size = sizeof(fanTimerControlBlock),
+};
+/* Definitions for motorXTimer */
+osTimerId_t motorXTimerHandle;
+osStaticTimerDef_t motorXTimerControlBlock;
+const osTimerAttr_t motorXTimer_attributes = {
+  .name = "motorXTimer",
+  .cb_mem = &motorXTimerControlBlock,
+  .cb_size = sizeof(motorXTimerControlBlock),
+};
+/* Definitions for motorYTimer */
+osTimerId_t motorYTimerHandle;
+osStaticTimerDef_t motorYTimerControlBlock;
+const osTimerAttr_t motorYTimer_attributes = {
+  .name = "motorYTimer",
+  .cb_mem = &motorYTimerControlBlock,
+  .cb_size = sizeof(motorYTimerControlBlock),
+};
 /* USER CODE BEGIN PV */
-
+TIM_OC_InitTypeDef fanTimerConfigOC = { 0 };
+TIM_OC_InitTypeDef motorXYTimerConfigOC = { 0 };
+extern RESMeasurements resMeasurements;
+extern SesnorsInfo sensorsInfo;
 
 /* USER CODE END PV */
 
@@ -88,7 +131,14 @@ static void MX_CRC_Init(void);
 static void MX_ADC2_Init(void);
 static void MX_ADC3_Init(void);
 static void MX_TIM2_Init(void);
+static void MX_TIM1_Init(void);
+static void MX_TIM3_Init(void);
+static void MX_DAC1_Init(void);
 void StartDefaultTask(void *argument);
+void debugLedTimerCallback(void *argument);
+void fanTimerCallback(void *argument);
+void motorXTimerCallback(void *argument);
+void motorYTimerCallback(void *argument);
 
 /* USER CODE BEGIN PFP */
 
@@ -96,7 +146,20 @@ void StartDefaultTask(void *argument);
 
 /* Private user code ---------------------------------------------------------*/
 /* USER CODE BEGIN 0 */
+int __io_putchar(int ch)
+{
+  HAL_UART_Transmit(&huart8, (uint8_t *)&ch, 1, 0xFFFF); // Use UART8 as debug interface
+//  ITM_SendChar(ch);	// Use SWV as debug interface
+  return ch;
+}
 
+void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
+{
+	LimiterSwitchData limiterSwitchData = { 0 };
+	limiterSwitchData.gpioPin = GPIO_Pin;
+	limiterSwitchData.pinState = HAL_GPIO_ReadPin(GPIOD, GPIO_Pin);
+	osMessageQueuePut(limiterSwitchDataQueue, &limiterSwitchData, 0, 0);
+}
 /* USER CODE END 0 */
 
 /**
@@ -151,6 +214,9 @@ int main(void)
   MX_ADC2_Init();
   MX_ADC3_Init();
   MX_TIM2_Init();
+  MX_TIM1_Init();
+  MX_TIM3_Init();
+  MX_DAC1_Init();
   /* USER CODE BEGIN 2 */
 
   /* USER CODE END 2 */
@@ -166,6 +232,19 @@ int main(void)
   /* add semaphores, ... */
   /* USER CODE END RTOS_SEMAPHORES */
 
+  /* Create the timer(s) */
+  /* creation of debugLedTimer */
+  debugLedTimerHandle = osTimerNew(debugLedTimerCallback, osTimerOnce, NULL, &debugLedTimer_attributes);
+
+  /* creation of fanTimer */
+  fanTimerHandle = osTimerNew(fanTimerCallback, osTimerOnce, NULL, &fanTimer_attributes);
+
+  /* creation of motorXTimer */
+  motorXTimerHandle = osTimerNew(motorXTimerCallback, osTimerPeriodic, NULL, &motorXTimer_attributes);
+
+  /* creation of motorYTimer */
+  motorYTimerHandle = osTimerNew(motorYTimerCallback, osTimerPeriodic, NULL, &motorYTimer_attributes);
+
   /* USER CODE BEGIN RTOS_TIMERS */
   /* start timers, add new ones, ... */
   /* USER CODE END RTOS_TIMERS */
@@ -322,7 +401,7 @@ static void MX_ADC1_Init(void)
   hadc1.Init.EOCSelection = ADC_EOC_SEQ_CONV;
   hadc1.Init.LowPowerAutoWait = DISABLE;
   hadc1.Init.ContinuousConvMode = ENABLE;
-  hadc1.Init.NbrOfConversion = 6;
+  hadc1.Init.NbrOfConversion = 7;
   hadc1.Init.DiscontinuousConvMode = DISABLE;
   hadc1.Init.ExternalTrigConv = ADC_EXTERNALTRIG_T2_TRGO;
   hadc1.Init.ExternalTrigConvEdge = ADC_EXTERNALTRIGCONVEDGE_RISING;
@@ -401,6 +480,15 @@ static void MX_ADC1_Init(void)
   {
     Error_Handler();
   }
+
+  /** Configure Regular Channel
+  */
+  sConfig.Channel = ADC_CHANNEL_15;
+  sConfig.Rank = ADC_REGULAR_RANK_7;
+  if (HAL_ADC_ConfigChannel(&hadc1, &sConfig) != HAL_OK)
+  {
+    Error_Handler();
+  }
   /* USER CODE BEGIN ADC1_Init 2 */
   if (HAL_ADCEx_Calibration_Start(&hadc1, ADC_CALIB_OFFSET_LINEARITY, ADC_SINGLE_ENDED) != HAL_OK)
   {
@@ -621,6 +709,56 @@ static void MX_CRC_Init(void)
 }
 
 /**
+  * @brief DAC1 Initialization Function
+  * @param None
+  * @retval None
+  */
+static void MX_DAC1_Init(void)
+{
+
+  /* USER CODE BEGIN DAC1_Init 0 */
+
+  /* USER CODE END DAC1_Init 0 */
+
+  DAC_ChannelConfTypeDef sConfig = {0};
+
+  /* USER CODE BEGIN DAC1_Init 1 */
+
+  /* USER CODE END DAC1_Init 1 */
+
+  /** DAC Initialization
+  */
+  hdac1.Instance = DAC1;
+  if (HAL_DAC_Init(&hdac1) != HAL_OK)
+  {
+    Error_Handler();
+  }
+
+  /** DAC channel OUT1 config
+  */
+  sConfig.DAC_SampleAndHold = DAC_SAMPLEANDHOLD_DISABLE;
+  sConfig.DAC_Trigger = DAC_TRIGGER_NONE;
+  sConfig.DAC_OutputBuffer = DAC_OUTPUTBUFFER_ENABLE;
+  sConfig.DAC_ConnectOnChipPeripheral = DAC_CHIPCONNECT_DISABLE;
+  sConfig.DAC_UserTrimming = DAC_TRIMMING_FACTORY;
+  if (HAL_DAC_ConfigChannel(&hdac1, &sConfig, DAC_CHANNEL_1) != HAL_OK)
+  {
+    Error_Handler();
+  }
+
+  /** DAC channel OUT2 config
+  */
+  if (HAL_DAC_ConfigChannel(&hdac1, &sConfig, DAC_CHANNEL_2) != HAL_OK)
+  {
+    Error_Handler();
+  }
+  /* USER CODE BEGIN DAC1_Init 2 */
+
+  /* USER CODE END DAC1_Init 2 */
+
+}
+
+/**
   * @brief RNG Initialization Function
   * @param None
   * @retval None
@@ -648,6 +786,76 @@ static void MX_RNG_Init(void)
 }
 
 /**
+  * @brief TIM1 Initialization Function
+  * @param None
+  * @retval None
+  */
+static void MX_TIM1_Init(void)
+{
+
+  /* USER CODE BEGIN TIM1_Init 0 */
+
+  /* USER CODE END TIM1_Init 0 */
+
+  TIM_MasterConfigTypeDef sMasterConfig = {0};
+  TIM_OC_InitTypeDef sConfigOC = {0};
+  TIM_BreakDeadTimeConfigTypeDef sBreakDeadTimeConfig = {0};
+
+  /* USER CODE BEGIN TIM1_Init 1 */
+
+  /* USER CODE END TIM1_Init 1 */
+  htim1.Instance = TIM1;
+  htim1.Init.Prescaler = 199;
+  htim1.Init.CounterMode = TIM_COUNTERMODE_UP;
+  htim1.Init.Period = 999;
+  htim1.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;
+  htim1.Init.RepetitionCounter = 0;
+  htim1.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_ENABLE;
+  if (HAL_TIM_PWM_Init(&htim1) != HAL_OK)
+  {
+    Error_Handler();
+  }
+  sMasterConfig.MasterOutputTrigger = TIM_TRGO_RESET;
+  sMasterConfig.MasterOutputTrigger2 = TIM_TRGO2_RESET;
+  sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE;
+  if (HAL_TIMEx_MasterConfigSynchronization(&htim1, &sMasterConfig) != HAL_OK)
+  {
+    Error_Handler();
+  }
+  sConfigOC.OCMode = TIM_OCMODE_PWM1;
+  sConfigOC.Pulse = 99;
+  sConfigOC.OCPolarity = TIM_OCPOLARITY_HIGH;
+  sConfigOC.OCNPolarity = TIM_OCNPOLARITY_HIGH;
+  sConfigOC.OCFastMode = TIM_OCFAST_DISABLE;
+  sConfigOC.OCIdleState = TIM_OCIDLESTATE_RESET;
+  sConfigOC.OCNIdleState = TIM_OCNIDLESTATE_RESET;
+  if (HAL_TIM_PWM_ConfigChannel(&htim1, &sConfigOC, TIM_CHANNEL_2) != HAL_OK)
+  {
+    Error_Handler();
+  }
+  sBreakDeadTimeConfig.OffStateRunMode = TIM_OSSR_DISABLE;
+  sBreakDeadTimeConfig.OffStateIDLEMode = TIM_OSSI_DISABLE;
+  sBreakDeadTimeConfig.LockLevel = TIM_LOCKLEVEL_OFF;
+  sBreakDeadTimeConfig.DeadTime = 0;
+  sBreakDeadTimeConfig.BreakState = TIM_BREAK_DISABLE;
+  sBreakDeadTimeConfig.BreakPolarity = TIM_BREAKPOLARITY_HIGH;
+  sBreakDeadTimeConfig.BreakFilter = 0;
+  sBreakDeadTimeConfig.Break2State = TIM_BREAK2_DISABLE;
+  sBreakDeadTimeConfig.Break2Polarity = TIM_BREAK2POLARITY_HIGH;
+  sBreakDeadTimeConfig.Break2Filter = 0;
+  sBreakDeadTimeConfig.AutomaticOutput = TIM_AUTOMATICOUTPUT_DISABLE;
+  if (HAL_TIMEx_ConfigBreakDeadTime(&htim1, &sBreakDeadTimeConfig) != HAL_OK)
+  {
+    Error_Handler();
+  }
+  /* USER CODE BEGIN TIM1_Init 2 */
+  memcpy(&fanTimerConfigOC, &sConfigOC, sizeof(TIM_OC_InitTypeDef));
+  /* USER CODE END TIM1_Init 2 */
+  HAL_TIM_MspPostInit(&htim1);
+
+}
+
+/**
   * @brief TIM2 Initialization Function
   * @param None
   * @retval None
@@ -669,7 +877,7 @@ static void MX_TIM2_Init(void)
   htim2.Init.Prescaler = 0;
   htim2.Init.CounterMode = TIM_COUNTERMODE_UP;
   htim2.Init.Period = 9999999;
-  htim2.Init.ClockDivision = TIM_CLOCKDIVISION_DIV4;
+  htim2.Init.ClockDivision = TIM_CLOCKDIVISION_DIV2;
   htim2.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_ENABLE;
   if (HAL_TIM_Base_Init(&htim2) != HAL_OK)
   {
@@ -693,6 +901,72 @@ static void MX_TIM2_Init(void)
 }
 
 /**
+  * @brief TIM3 Initialization Function
+  * @param None
+  * @retval None
+  */
+static void MX_TIM3_Init(void)
+{
+
+  /* USER CODE BEGIN TIM3_Init 0 */
+
+  /* USER CODE END TIM3_Init 0 */
+
+  TIM_MasterConfigTypeDef sMasterConfig = {0};
+  TIM_OC_InitTypeDef sConfigOC = {0};
+
+  /* USER CODE BEGIN TIM3_Init 1 */
+
+  /* USER CODE END TIM3_Init 1 */
+  htim3.Instance = TIM3;
+  htim3.Init.Prescaler = 199;
+  htim3.Init.CounterMode = TIM_COUNTERMODE_UP;
+  htim3.Init.Period = 999;
+  htim3.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;
+  htim3.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_ENABLE;
+  if (HAL_TIM_PWM_Init(&htim3) != HAL_OK)
+  {
+    Error_Handler();
+  }
+  sMasterConfig.MasterOutputTrigger = TIM_TRGO_RESET;
+  sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE;
+  if (HAL_TIMEx_MasterConfigSynchronization(&htim3, &sMasterConfig) != HAL_OK)
+  {
+    Error_Handler();
+  }
+  sConfigOC.OCMode = TIM_OCMODE_COMBINED_PWM1;
+  sConfigOC.Pulse = 500;
+  sConfigOC.OCPolarity = TIM_OCPOLARITY_HIGH;
+  sConfigOC.OCFastMode = TIM_OCFAST_DISABLE;
+  if (HAL_TIM_PWM_ConfigChannel(&htim3, &sConfigOC, TIM_CHANNEL_1) != HAL_OK)
+  {
+    Error_Handler();
+  }
+  __HAL_TIM_DISABLE_OCxPRELOAD(&htim3, TIM_CHANNEL_1);
+  sConfigOC.OCMode = TIM_OCMODE_PWM1;
+  if (HAL_TIM_PWM_ConfigChannel(&htim3, &sConfigOC, TIM_CHANNEL_2) != HAL_OK)
+  {
+    Error_Handler();
+  }
+  __HAL_TIM_DISABLE_OCxPRELOAD(&htim3, TIM_CHANNEL_2);
+  if (HAL_TIM_PWM_ConfigChannel(&htim3, &sConfigOC, TIM_CHANNEL_3) != HAL_OK)
+  {
+    Error_Handler();
+  }
+  __HAL_TIM_DISABLE_OCxPRELOAD(&htim3, TIM_CHANNEL_3);
+  if (HAL_TIM_PWM_ConfigChannel(&htim3, &sConfigOC, TIM_CHANNEL_4) != HAL_OK)
+  {
+    Error_Handler();
+  }
+  __HAL_TIM_DISABLE_OCxPRELOAD(&htim3, TIM_CHANNEL_4);
+  /* USER CODE BEGIN TIM3_Init 2 */
+  memcpy(&motorXYTimerConfigOC, &sConfigOC, sizeof(TIM_OC_InitTypeDef));
+  /* USER CODE END TIM3_Init 2 */
+  HAL_TIM_MspPostInit(&htim3);
+
+}
+
+/**
   * @brief UART8 Initialization Function
   * @param None
   * @retval None
@@ -765,8 +1039,8 @@ static void MX_USART1_UART_Init(void)
   huart1.Init.OverSampling = UART_OVERSAMPLING_16;
   huart1.Init.OneBitSampling = UART_ONE_BIT_SAMPLE_DISABLE;
   huart1.Init.ClockPrescaler = UART_PRESCALER_DIV1;
-  huart1.AdvancedInit.AdvFeatureInit = UART_ADVFEATURE_RXINVERT_INIT;
-  huart1.AdvancedInit.RxPinLevelInvert = UART_ADVFEATURE_RXINV_ENABLE;
+  huart1.AdvancedInit.AdvFeatureInit = UART_ADVFEATURE_TXINVERT_INIT;
+  huart1.AdvancedInit.TxPinLevelInvert = UART_ADVFEATURE_TXINV_ENABLE;
   if (HAL_UART_Init(&huart1) != HAL_OK)
   {
     Error_Handler();
@@ -846,6 +1120,14 @@ static void MX_GPIO_Init(void)
   GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
   HAL_GPIO_Init(GPIOE, &GPIO_InitStruct);
 
+  /*Configure GPIO pins : PD8 PD9 PD10 PD11
+                           PD12 PD13 */
+  GPIO_InitStruct.Pin = GPIO_PIN_8|GPIO_PIN_9|GPIO_PIN_10|GPIO_PIN_11
+                          |GPIO_PIN_12|GPIO_PIN_13;
+  GPIO_InitStruct.Mode = GPIO_MODE_IT_RISING_FALLING;
+  GPIO_InitStruct.Pull = GPIO_NOPULL;
+  HAL_GPIO_Init(GPIOD, &GPIO_InitStruct);
+
   /*Configure GPIO pin : PD3 */
   GPIO_InitStruct.Pin = GPIO_PIN_3;
   GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
@@ -859,6 +1141,13 @@ static void MX_GPIO_Init(void)
   GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
   HAL_GPIO_Init(GPIOD, &GPIO_InitStruct);
 
+  /* EXTI interrupt init*/
+  HAL_NVIC_SetPriority(EXTI9_5_IRQn, 5, 0);
+  HAL_NVIC_EnableIRQ(EXTI9_5_IRQn);
+
+  HAL_NVIC_SetPriority(EXTI15_10_IRQn, 5, 0);
+  HAL_NVIC_EnableIRQ(EXTI15_10_IRQn);
+
 /* USER CODE BEGIN MX_GPIO_Init_2 */
 /* USER CODE END MX_GPIO_Init_2 */
 }
@@ -902,7 +1191,7 @@ void HAL_ADC_ConvCpltCallback(ADC_HandleTypeDef *hadc)
 		{
 		  Error_Handler();
 		}
-	}
+	}osTimerStop (debugLedTimerHandle);
 }
 
 /* USER CODE END 4 */
@@ -945,11 +1234,65 @@ void StartDefaultTask(void *argument)
   /* Infinite loop */
   for(;;)
   {
-	 osDelay(pdMS_TO_TICKS(1000));
+	 osDelay(pdMS_TO_TICKS(100));
+	 if(HAL_TIM_GetChannelState(&htim3, TIM_CHANNEL_1) == HAL_TIM_CHANNEL_STATE_READY &&
+			 HAL_TIM_GetChannelState(&htim3, TIM_CHANNEL_2) == HAL_TIM_CHANNEL_STATE_READY)
+	 {
+		if(osMutexAcquire(sensorsInfoMutex, osWaitForever) == osOK)
+		{
+			sensorsInfo.motorXStatus = 0;
+			osMutexRelease(sensorsInfoMutex);
+		}
+	 }
+	 if(HAL_TIM_GetChannelState(&htim3, TIM_CHANNEL_3) == HAL_TIM_CHANNEL_STATE_READY &&
+			 HAL_TIM_GetChannelState(&htim3, TIM_CHANNEL_4) == HAL_TIM_CHANNEL_STATE_READY)
+	 {
+		if(osMutexAcquire(sensorsInfoMutex, osWaitForever) == osOK)
+		{
+			sensorsInfo.motorYStatus = 0;
+			osMutexRelease(sensorsInfoMutex);
+		}
+	 }
   }
   /* USER CODE END 5 */
 }
 
+/* debugLedTimerCallback function */
+void debugLedTimerCallback(void *argument)
+{
+  /* USER CODE BEGIN debugLedTimerCallback */
+  DbgLEDOff (DBG_LED1);
+  /* USER CODE END debugLedTimerCallback */
+}
+
+/* fanTimerCallback function */
+void fanTimerCallback(void *argument)
+{
+  /* USER CODE BEGIN fanTimerCallback */
+	HAL_TIM_PWM_Stop(&htim1, TIM_CHANNEL_2);
+  /* USER CODE END fanTimerCallback */
+}
+
+/* motorXTimerCallback function */
+void motorXTimerCallback(void *argument)
+{
+  /* USER CODE BEGIN motorXTimerCallback */
+	motorAction(&htim3, &motorXYTimerConfigOC, TIM_CHANNEL_1, TIM_CHANNEL_2, HiZ, 0);
+	HAL_TIM_PWM_Stop(&htim3, TIM_CHANNEL_1);
+	HAL_TIM_PWM_Stop(&htim3, TIM_CHANNEL_2);
+  /* USER CODE END motorXTimerCallback */
+}
+
+/* motorYTimerCallback function */
+void motorYTimerCallback(void *argument)
+{
+  /* USER CODE BEGIN motorYTimerCallback */
+	motorAction(&htim3, &motorXYTimerConfigOC, TIM_CHANNEL_3, TIM_CHANNEL_4, HiZ, 0);
+	HAL_TIM_PWM_Stop(&htim3, TIM_CHANNEL_3);
+	HAL_TIM_PWM_Stop(&htim3, TIM_CHANNEL_4);
+  /* USER CODE END motorYTimerCallback */
+}
+
  /* MPU Configuration */
 
 void MPU_Config(void)
@@ -1021,8 +1364,7 @@ void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
   /* USER CODE BEGIN Callback 1 */
   else if (htim->Instance == TIM2)
   {
-//	  HAL_GPIO_TogglePin(GPIOD, GPIO_PIN_4);
-//	  HAL_ADC_Start_IT(&hadc1);
+
   }
 
   /* USER CODE END Callback 1 */

+ 122 - 5
OZE_Sensor/Core/Src/meas_tasks.c

@@ -8,6 +8,7 @@
 #include "meas_tasks.h"
 #include "adc_buffers.h"
 #include "measurements.h"
+#include "peripherial.h"
 #include "node-red-config.h"
 
 #include "cmsis_os.h"
@@ -26,10 +27,12 @@
 osThreadId_t adc1MeasTaskHandle = NULL;
 osThreadId_t adc2MeasTaskHandle = NULL;
 osThreadId_t adc3MeasTaskHandle = NULL;
+osThreadId_t limiterSwitchTaskHandle = NULL;
 
 osMessageQueueId_t adc1MeasDataQueue = NULL;
 osMessageQueueId_t adc2MeasDataQueue = NULL;
 osMessageQueueId_t adc3MeasDataQueue = NULL;
+osMessageQueueId_t limiterSwitchDataQueue = NULL;
 
 osMutexId_t vRefmVMutex;
 osMutexId_t resMeasurementsMutex;
@@ -43,6 +46,12 @@ SesnorsInfo sensorsInfo         = { 0 };
 
 uint16_t ILxRef[CURRENTS_COUNT] = { 0 };
 
+extern TIM_HandleTypeDef htim3;
+extern TIM_OC_InitTypeDef motorXYTimerConfigOC;
+extern osTimerId_t motorXTimerHandle;
+extern osTimerId_t motorYTimerHandle;
+
+
 void MeasTasksInit (void) {
     vRefmVMutex          = osMutexNew (NULL);
     resMeasurementsMutex = osMutexNew (NULL);
@@ -68,11 +77,18 @@ void MeasTasksInit (void) {
     adc1MeasTaskHandle = osThreadNew (ADC1MeasTask, NULL, &osThreadAttradc1MeasTask);
     adc2MeasTaskHandle = osThreadNew (ADC2MeasTask, NULL, &osThreadAttradc2MeasTask);
     adc3MeasTaskHandle = osThreadNew (ADC3MeasTask, NULL, &osThreadAttradc3MeasTask);
+
+    limiterSwitchDataQueue = osMessageQueueNew (8, sizeof (LimiterSwitchData), NULL);
+
+    osThreadAttr_t osThreadAttradc1LimiterSwitchTask = { 0 };
+    osThreadAttradc1LimiterSwitchTask.stack_size = configMINIMAL_STACK_SIZE * 2;
+    osThreadAttradc1LimiterSwitchTask.priority   = (osPriority_t)osPriorityNormal;
+    limiterSwitchTaskHandle = osThreadNew (LimiterSwitchTask, NULL, &osThreadAttradc1LimiterSwitchTask);
 }
 
 void ADC1MeasTask (void* arg) {
-    float circBuffer[VOLTAGES_COUNT][CIRC_BUFF_LEN];
-    float rms[VOLTAGES_COUNT];
+    float circBuffer[VOLTAGES_COUNT][CIRC_BUFF_LEN] = {0};
+    float rms[VOLTAGES_COUNT] = {0};;
     ADC1_Data adcData    = { 0 };
     uint32_t circBuffPos = 0;
     float gainCorrection = 1.0;
@@ -112,12 +128,18 @@ void ADC1MeasTask (void* arg) {
             }
             osMutexRelease (ILxRefMutex);
         }
+
+        float fanFBVoltage = adcData.adcDataBuffer[FanFB] * deltaADC * -4.35 + 12;
+        if (osMutexAcquire (sensorsInfoMutex, osWaitForever) == osOK) {
+        	sensorsInfo.fanVoltage = fanFBVoltage;
+        	osMutexRelease(sensorsInfoMutex);
+        }
     }
 }
 
 void ADC2MeasTask (void* arg) {
-    float circBuffer[CURRENTS_COUNT][CIRC_BUFF_LEN];
-    float rms[CURRENTS_COUNT];
+    float circBuffer[CURRENTS_COUNT][CIRC_BUFF_LEN] = {0};
+    float rms[CURRENTS_COUNT] = {0};
     ADC2_Data adcData    = { 0 };
     uint32_t circBuffPos = 0;
     float gainCorrection = 1.0;
@@ -158,7 +180,12 @@ void ADC2MeasTask (void* arg) {
 }
 
 void ADC3MeasTask (void* arg) {
-    ADC3_Data adcData = { 0 };
+    float motorXSensCircBuffer[CIRC_BUFF_LEN] = { 0 };
+    float motorYSensCircBuffer[CIRC_BUFF_LEN] = { 0 };
+    float pvT1CircBuffer[CIRC_BUFF_LEN]       = { 0 };
+    float pvT2CircBuffer[CIRC_BUFF_LEN]       = { 0 };
+    uint32_t circBuffPos                      = 0;
+    ADC3_Data adcData                         = { 0 };
     while (pdTRUE) {
         osMessageQueueGet (adc3MeasDataQueue, &adcData, 0, osWaitForever);
         uint32_t vRef = __LL_ADC_CALC_VREFANALOG_VOLTAGE (adcData.adcDataBuffer[VrefInt], LL_ADC_RESOLUTION_16B);
@@ -166,5 +193,95 @@ void ADC3MeasTask (void* arg) {
             vRefmV = vRef;
             osMutexRelease (vRefmVMutex);
         }
+        float motorXCurrentSense          = adcData.adcDataBuffer[motorXSense] * deltaADC * 10 / 8.33333;
+        float motorYCurrentSense          = adcData.adcDataBuffer[motorYSense] * deltaADC * 10 / 8.33333;
+        motorXSensCircBuffer[circBuffPos] = motorXCurrentSense;
+        motorYSensCircBuffer[circBuffPos] = motorYCurrentSense;
+        pvT1CircBuffer[circBuffPos]       = adcData.adcDataBuffer[pvTemp1] * deltaADC * 45.33333333 - 63;
+        pvT2CircBuffer[circBuffPos]       = adcData.adcDataBuffer[pvTemp2] * deltaADC * 45.33333333 - 63;
+        float motorXAveCurrent            = 0;
+        float motorYAveCurrent            = 0;
+        float pvT1AveTemp                 = 0;
+        float pvT2AveTemp                 = 0;
+        for (uint8_t i = 0; i < CIRC_BUFF_LEN; i++) {
+            motorXAveCurrent += motorXSensCircBuffer[i];
+            motorYAveCurrent += motorYSensCircBuffer[i];
+            pvT1AveTemp += pvT1CircBuffer[i];
+            pvT2AveTemp += pvT2CircBuffer[i];
+        }
+        motorXAveCurrent /= CIRC_BUFF_LEN;
+        motorYAveCurrent /= CIRC_BUFF_LEN;
+        pvT1AveTemp /= CIRC_BUFF_LEN;
+        pvT2AveTemp /= CIRC_BUFF_LEN;
+        if (osMutexAcquire (sensorsInfoMutex, osWaitForever) == osOK) {
+            if (sensorsInfo.motorXStatus == 1) {
+                sensorsInfo.motorXAveCurrent = motorXAveCurrent;
+                if (sensorsInfo.motorXPeakCurrent < motorXCurrentSense) {
+                    sensorsInfo.motorXPeakCurrent = motorXCurrentSense;
+                }
+            }
+            if (sensorsInfo.motorYStatus == 1) {
+                sensorsInfo.motorYAveCurrent = motorYAveCurrent;
+                if (sensorsInfo.motorYPeakCurrent < motorYCurrentSense) {
+                    sensorsInfo.motorYPeakCurrent = motorYCurrentSense;
+                }
+            }
+            sensorsInfo.pvTemperature[0] = pvT1AveTemp;
+            sensorsInfo.pvTemperature[1] = pvT2AveTemp;
+            osMutexRelease (sensorsInfoMutex);
+        }
+        ++circBuffPos;
+        circBuffPos = circBuffPos % CIRC_BUFF_LEN;
     }
 }
+
+void LimiterSwitchTask (void* arg) {
+	LimiterSwitchData limiterSwitchData = { 0 };
+	limiterSwitchData.gpioPin = GPIO_PIN_8;
+	for(uint8_t i = 0; i < 6; i++)
+	{
+		limiterSwitchData.pinState = HAL_GPIO_ReadPin(GPIOD, limiterSwitchData.gpioPin);
+		osMessageQueuePut(limiterSwitchDataQueue, &limiterSwitchData, 0, 0);
+		limiterSwitchData.gpioPin = limiterSwitchData.gpioPin << 1;
+	}
+	while (pdTRUE) {
+		osMessageQueueGet (limiterSwitchDataQueue, &limiterSwitchData, 0, osWaitForever);
+		if(osMutexAcquire(sensorsInfoMutex, osWaitForever) == osOK)
+		{
+			switch(limiterSwitchData.gpioPin)
+			{
+			case GPIO_PIN_8:
+				sensorsInfo.limitYSwitchCenter = limiterSwitchData.pinState == GPIO_PIN_SET ? 0 : 1;
+				break;
+			case GPIO_PIN_9:
+				sensorsInfo.limitYSwitchDown = limiterSwitchData.pinState == GPIO_PIN_SET ? 0 : 1;
+				break;
+			case GPIO_PIN_10:
+				sensorsInfo.limitXSwitchCenter = limiterSwitchData.pinState == GPIO_PIN_SET ? 0 : 1;
+				break;
+			case GPIO_PIN_11:
+				sensorsInfo.limitYSwitchUp = limiterSwitchData.pinState == GPIO_PIN_SET ? 0 : 1;
+				break;
+			case GPIO_PIN_12:
+				sensorsInfo.limitXSwitchUp = limiterSwitchData.pinState == GPIO_PIN_SET ? 0 : 1;
+				break;
+			case GPIO_PIN_13:
+				sensorsInfo.limitXSwitchDown = limiterSwitchData.pinState == GPIO_PIN_SET ? 0 : 1;
+				break;
+			default:
+				break;
+			}
+			if((sensorsInfo.limitXSwitchDown == 1) ||(sensorsInfo.limitXSwitchUp == 1))
+			{
+				sensorsInfo.motorXStatus = motorControl(&htim3, &motorXYTimerConfigOC, TIM_CHANNEL_1, TIM_CHANNEL_2, motorXTimerHandle, 0, 0, sensorsInfo.limitXSwitchUp, sensorsInfo.limitXSwitchDown);
+			}
+			if((sensorsInfo.limitYSwitchDown == 1) ||(sensorsInfo.limitYSwitchUp == 1))
+			{
+				sensorsInfo.motorYStatus = motorControl(&htim3, &motorXYTimerConfigOC, TIM_CHANNEL_3, TIM_CHANNEL_4, motorYTimerHandle, 0, 0, sensorsInfo.limitYSwitchUp, sensorsInfo.limitYSwitchDown);
+			}
+//			sensorsInfo.motorXStatus = motorControl(&htim3, &motorXYTimerConfigOC, TIM_CHANNEL_1, TIM_CHANNEL_2, motorXTimerHandle, 0, 0, sensorsInfo.limitXSwitchUp, sensorsInfo.limitXSwitchDown);
+//			sensorsInfo.motorYStatus = motorControl(&htim3, &motorXYTimerConfigOC, TIM_CHANNEL_3, TIM_CHANNEL_4, motorYTimerHandle, 0, 0, sensorsInfo.limitYSwitchUp, sensorsInfo.limitYSwitchDown);
+			osMutexRelease(sensorsInfoMutex);
+		}
+	}
+}

+ 6 - 3
OZE_Sensor/Core/Src/mock_tasks.c

@@ -77,9 +77,12 @@ void MockMeasurmetsTask (void* argument) {
 		sensorsInfo.motorYAveCurrent = 3 + (0.01 * (counter % 100));
 		sensorsInfo.motorXPeakCurrent = 6 + (0.01 * (counter % 100));
 		sensorsInfo.motorYPeakCurrent = 6 + (0.01 * (counter % 100));
-		sensorsInfo.limitSwitchUp = (counter % 100) > 50 ? 1 : 0;
-		sensorsInfo.limitSwitchDown = (counter % 100) < 25 ? 1 : 0;
-		sensorsInfo.limitSwitchCenter = (counter % 100) > 35 ? 1 : 0;
+		sensorsInfo.limitXSwitchUp = (counter % 100) > 50 ? 1 : 0;
+		sensorsInfo.limitXSwitchDown = (counter % 100) < 25 ? 1 : 0;
+		sensorsInfo.limitXSwitchCenter = (counter % 100) > 35 ? 1 : 0;
+		sensorsInfo.limitYSwitchUp = (counter % 100) > 50 ? 1 : 0;
+		sensorsInfo.limitYSwitchDown = (counter % 100) < 25 ? 1 : 0;
+		sensorsInfo.limitYSwitchCenter = (counter % 100) > 35 ? 1 : 0;
 		sensorsInfo.powerSupplyFailMask = 0;
     	osMutexRelease(sensorsInfoMutex);
     	counter++;

+ 124 - 0
OZE_Sensor/Core/Src/peripherial.c

@@ -5,6 +5,7 @@
  *      Author: jakubski
  */
 
+#include <stdlib.h>
 
 #include "peripherial.h"
 
@@ -60,3 +61,126 @@ void SelectCurrentSensorGain(CurrentSensor sensor, CurrentSensorGain gain)
 		HAL_GPIO_WritePin(GPIOE, gain1Gpio, gpioState);
 	}
 }
+
+uint8_t motorControl (TIM_HandleTypeDef* htim, TIM_OC_InitTypeDef* motorTimerConfigOC, uint8_t channel1, uint8_t channel2, osTimerId_t motorTimerHandle, int32_t motorPWMPulse,
+		int32_t motorTimerPeriod, uint8_t switchLimiterUpStat, uint8_t switchLimiterDownStat) {
+    uint32_t motorStatus           = 0;
+    MotorDriverState setMotorYState = HiZ;
+
+    HAL_TIM_PWM_Stop (htim, channel1);
+    HAL_TIM_PWM_Stop (htim, channel2);
+    if (motorTimerPeriod > 0) {
+        if (motorPWMPulse > 0) {
+            // Forward
+            if (switchLimiterUpStat == 0) {
+                setMotorYState = Forward;
+                motorAction (htim, motorTimerConfigOC, channel1, channel2, setMotorYState, abs (motorPWMPulse) * 10);
+                HAL_TIM_PWM_Start (htim, channel1);
+//                HAL_TIM_PWM_Stop (htim, channel2);
+                motorStatus = 1;
+            }
+            else
+            {
+            	HAL_TIM_PWM_Stop (htim, channel1);
+            }
+            HAL_TIM_PWM_Stop (htim, channel2);
+        } else if (motorPWMPulse < 0) {
+            // Reverse
+            if (switchLimiterDownStat == 0) {
+                setMotorYState = Reverse;
+                motorAction (htim, motorTimerConfigOC, channel1, channel2, setMotorYState, abs (motorPWMPulse) * 10);
+                HAL_TIM_PWM_Start (htim, channel2);
+                motorStatus = 1;
+            }
+            else
+            {
+            	HAL_TIM_PWM_Stop (htim, channel2);
+            }
+            HAL_TIM_PWM_Stop (htim, channel1);
+        } else {
+            // Brake
+            setMotorYState = Brake;
+            motorAction (htim, motorTimerConfigOC, channel1, channel2, setMotorYState, abs (motorPWMPulse) * 10);
+            HAL_TIM_PWM_Start (htim, channel1);
+            HAL_TIM_PWM_Start (htim, channel2);
+            motorStatus = 0;
+        }
+        osTimerStart (motorTimerHandle, motorTimerPeriod * 1000);
+    } else if ((motorTimerPeriod == 0) && (motorPWMPulse == 0)) {
+        motorAction (htim, motorTimerConfigOC, channel1, channel2, HiZ, abs (motorPWMPulse) * 10);
+        HAL_TIM_PWM_Stop (htim, channel1);
+        HAL_TIM_PWM_Stop (htim, channel2);
+        osTimerStop (motorTimerHandle);
+        motorStatus = 0;
+    } else if (motorTimerPeriod == -1) {
+        if (motorPWMPulse > 0) {
+            // Forward
+            if (switchLimiterUpStat == 0) {
+                setMotorYState = Forward;
+                motorAction (htim, motorTimerConfigOC, channel1, channel2, setMotorYState, abs (motorPWMPulse) * 10);
+                HAL_TIM_PWM_Start (htim, channel1);
+                motorStatus = 1;
+            }
+            else
+            {
+            	HAL_TIM_PWM_Stop (htim, channel1);
+            }
+            HAL_TIM_PWM_Stop (htim, channel2);
+        } else {
+            // Reverse
+            if (switchLimiterDownStat == 0) {
+                setMotorYState = Reverse;
+                motorAction (htim, motorTimerConfigOC, channel1, channel2, setMotorYState, abs (motorPWMPulse) * 10);
+                HAL_TIM_PWM_Start (htim, channel2);
+                motorStatus = 1;
+            }
+            else
+            {
+            	HAL_TIM_PWM_Stop (htim, channel2);
+            }
+            HAL_TIM_PWM_Stop (htim, channel1);
+        }
+    }
+    return motorStatus;
+}
+
+void motorAction(TIM_HandleTypeDef *tim, TIM_OC_InitTypeDef *timerConf, uint32_t channel1, uint32_t channel2, MotorDriverState setState, uint32_t pulse)
+{
+	timerConf->Pulse = pulse;
+	switch(setState)
+	{
+	case Forward:
+	case Reverse:
+	case HiZ:
+		timerConf->OCPolarity = TIM_OCPOLARITY_HIGH;
+	    if (HAL_TIM_PWM_ConfigChannel (tim, timerConf, channel1) != HAL_OK) {
+	        Error_Handler ();
+	    }
+		timerConf->OCPolarity = TIM_OCPOLARITY_HIGH;
+	    if (HAL_TIM_PWM_ConfigChannel (tim, timerConf, channel2) != HAL_OK) {
+	        Error_Handler ();
+	    }
+		break;
+	case Brake:
+		timerConf->OCPolarity = TIM_OCPOLARITY_LOW;
+	    if (HAL_TIM_PWM_ConfigChannel (tim, timerConf, channel1) != HAL_OK) {
+	        Error_Handler ();
+	    }
+		timerConf->OCPolarity = TIM_OCPOLARITY_LOW;
+	    if (HAL_TIM_PWM_ConfigChannel (tim, timerConf, channel2) != HAL_OK) {
+	        Error_Handler ();
+	    }
+		break;
+	default:
+		timerConf->OCPolarity = TIM_OCPOLARITY_HIGH;
+	    if (HAL_TIM_PWM_ConfigChannel (tim, timerConf, channel1) != HAL_OK) {
+	        Error_Handler ();
+	    }
+		timerConf->OCPolarity = TIM_OCPOLARITY_HIGH;
+	    if (HAL_TIM_PWM_ConfigChannel (tim, timerConf, channel2) != HAL_OK) {
+	        Error_Handler ();
+	    }
+		break;
+	}
+
+}

+ 1 - 1
OZE_Sensor/Core/Src/serial_protocol.c

@@ -67,7 +67,7 @@ void ReadShortWordFromBufer(uint8_t* buff, uint16_t* buffPos, uint16_t* data)
 
 void ReadWordFromBufer(uint8_t* buff, uint16_t* buffPos, uint32_t* data)
 {
-	*data = CONVERT_BYTES_TO_SHORT_WORD(&buff[*buffPos]);
+	*data = CONVERT_BYTES_TO_WORD(&buff[*buffPos]);
 	*buffPos += sizeof(uint32_t);
 }
 

+ 226 - 3
OZE_Sensor/Core/Src/stm32h7xx_hal_msp.c

@@ -62,7 +62,9 @@ extern DMA_HandleTypeDef hdma_adc3;
 /* USER CODE BEGIN 0 */
 
 /* USER CODE END 0 */
-/**
+
+void HAL_TIM_MspPostInit(TIM_HandleTypeDef *htim);
+                                        /**
   * Initializes the Global MSP.
   */
 void HAL_MspInit(void)
@@ -71,6 +73,8 @@ void HAL_MspInit(void)
   /* USER CODE BEGIN MspInit 0 */
 
   /* USER CODE END MspInit 0 */
+  PWREx_AVDTypeDef sConfigAVD = {0};
+  PWR_PVDTypeDef sConfigPVD = {0};
 
   __HAL_RCC_SYSCFG_CLK_ENABLE();
 
@@ -83,6 +87,38 @@ void HAL_MspInit(void)
   HAL_NVIC_SetPriority(RCC_IRQn, 5, 0);
   HAL_NVIC_EnableIRQ(RCC_IRQn);
 
+  /** AVD Configuration
+  */
+  sConfigAVD.AVDLevel = PWR_AVDLEVEL_3;
+  sConfigAVD.Mode = PWR_AVD_MODE_NORMAL;
+  HAL_PWREx_ConfigAVD(&sConfigAVD);
+
+  /** Enable the AVD Output
+  */
+  HAL_PWREx_EnableAVD();
+
+  /** PVD Configuration
+  */
+  sConfigPVD.PVDLevel = PWR_PVDLEVEL_6;
+  sConfigPVD.Mode = PWR_PVD_MODE_NORMAL;
+  HAL_PWR_ConfigPVD(&sConfigPVD);
+
+  /** Enable the PVD Output
+  */
+  HAL_PWR_EnablePVD();
+
+  /** Enable the VREF clock
+  */
+  __HAL_RCC_VREF_CLK_ENABLE();
+
+  /** Disable the Internal Voltage Reference buffer
+  */
+  HAL_SYSCFG_DisableVREFBUF();
+
+  /** Configure the internal voltage reference buffer high impedance mode
+  */
+  HAL_SYSCFG_VREFBUF_HighImpedanceConfig(SYSCFG_VREFBUF_HIGH_IMPEDANCE_ENABLE);
+
   /* USER CODE BEGIN MspInit 1 */
 
   /* USER CODE END MspInit 1 */
@@ -117,11 +153,13 @@ void HAL_ADC_MspInit(ADC_HandleTypeDef* hadc)
     PA0     ------> ADC1_INP16
     PA1     ------> ADC1_INP17
     PA2     ------> ADC1_INP14
+    PA3     ------> ADC1_INP15
     PA7     ------> ADC1_INP7
     PC5     ------> ADC1_INP8
     PB0     ------> ADC1_INP9
     */
-    GPIO_InitStruct.Pin = GPIO_PIN_0|GPIO_PIN_1|GPIO_PIN_2|GPIO_PIN_7;
+    GPIO_InitStruct.Pin = GPIO_PIN_0|GPIO_PIN_1|GPIO_PIN_2|GPIO_PIN_3
+                          |GPIO_PIN_7;
     GPIO_InitStruct.Mode = GPIO_MODE_ANALOG;
     GPIO_InitStruct.Pull = GPIO_NOPULL;
     HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
@@ -289,11 +327,13 @@ void HAL_ADC_MspDeInit(ADC_HandleTypeDef* hadc)
     PA0     ------> ADC1_INP16
     PA1     ------> ADC1_INP17
     PA2     ------> ADC1_INP14
+    PA3     ------> ADC1_INP15
     PA7     ------> ADC1_INP7
     PC5     ------> ADC1_INP8
     PB0     ------> ADC1_INP9
     */
-    HAL_GPIO_DeInit(GPIOA, GPIO_PIN_0|GPIO_PIN_1|GPIO_PIN_2|GPIO_PIN_7);
+    HAL_GPIO_DeInit(GPIOA, GPIO_PIN_0|GPIO_PIN_1|GPIO_PIN_2|GPIO_PIN_3
+                          |GPIO_PIN_7);
 
     HAL_GPIO_DeInit(GPIOC, GPIO_PIN_5);
 
@@ -403,6 +443,74 @@ void HAL_CRC_MspDeInit(CRC_HandleTypeDef* hcrc)
 }
 
 /**
+* @brief DAC MSP Initialization
+* This function configures the hardware resources used in this example
+* @param hdac: DAC handle pointer
+* @retval None
+*/
+void HAL_DAC_MspInit(DAC_HandleTypeDef* hdac)
+{
+  GPIO_InitTypeDef GPIO_InitStruct = {0};
+  if(hdac->Instance==DAC1)
+  {
+  /* USER CODE BEGIN DAC1_MspInit 0 */
+
+  /* USER CODE END DAC1_MspInit 0 */
+    /* Peripheral clock enable */
+    __HAL_RCC_DAC12_CLK_ENABLE();
+
+    __HAL_RCC_GPIOA_CLK_ENABLE();
+    /**DAC1 GPIO Configuration
+    PA4     ------> DAC1_OUT1
+    PA5     ------> DAC1_OUT2
+    */
+    GPIO_InitStruct.Pin = GPIO_PIN_4|GPIO_PIN_5;
+    GPIO_InitStruct.Mode = GPIO_MODE_ANALOG;
+    GPIO_InitStruct.Pull = GPIO_NOPULL;
+    HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
+
+    /* DAC1 interrupt Init */
+    HAL_NVIC_SetPriority(TIM6_DAC_IRQn, 5, 0);
+    HAL_NVIC_EnableIRQ(TIM6_DAC_IRQn);
+  /* USER CODE BEGIN DAC1_MspInit 1 */
+
+  /* USER CODE END DAC1_MspInit 1 */
+  }
+
+}
+
+/**
+* @brief DAC MSP De-Initialization
+* This function freeze the hardware resources used in this example
+* @param hdac: DAC handle pointer
+* @retval None
+*/
+void HAL_DAC_MspDeInit(DAC_HandleTypeDef* hdac)
+{
+  if(hdac->Instance==DAC1)
+  {
+  /* USER CODE BEGIN DAC1_MspDeInit 0 */
+
+  /* USER CODE END DAC1_MspDeInit 0 */
+    /* Peripheral clock disable */
+    __HAL_RCC_DAC12_CLK_DISABLE();
+
+    /**DAC1 GPIO Configuration
+    PA4     ------> DAC1_OUT1
+    PA5     ------> DAC1_OUT2
+    */
+    HAL_GPIO_DeInit(GPIOA, GPIO_PIN_4|GPIO_PIN_5);
+
+    /* DAC1 interrupt DeInit */
+    HAL_NVIC_DisableIRQ(TIM6_DAC_IRQn);
+  /* USER CODE BEGIN DAC1_MspDeInit 1 */
+
+  /* USER CODE END DAC1_MspDeInit 1 */
+  }
+
+}
+
+/**
 * @brief RNG MSP Initialization
 * This function configures the hardware resources used in this example
 * @param hrng: RNG handle pointer
@@ -458,6 +566,39 @@ void HAL_RNG_MspDeInit(RNG_HandleTypeDef* hrng)
 }
 
 /**
+* @brief TIM_PWM MSP Initialization
+* This function configures the hardware resources used in this example
+* @param htim_pwm: TIM_PWM handle pointer
+* @retval None
+*/
+void HAL_TIM_PWM_MspInit(TIM_HandleTypeDef* htim_pwm)
+{
+  if(htim_pwm->Instance==TIM1)
+  {
+  /* USER CODE BEGIN TIM1_MspInit 0 */
+
+  /* USER CODE END TIM1_MspInit 0 */
+    /* Peripheral clock enable */
+    __HAL_RCC_TIM1_CLK_ENABLE();
+  /* USER CODE BEGIN TIM1_MspInit 1 */
+
+  /* USER CODE END TIM1_MspInit 1 */
+  }
+  else if(htim_pwm->Instance==TIM3)
+  {
+  /* USER CODE BEGIN TIM3_MspInit 0 */
+
+  /* USER CODE END TIM3_MspInit 0 */
+    /* Peripheral clock enable */
+    __HAL_RCC_TIM3_CLK_ENABLE();
+  /* USER CODE BEGIN TIM3_MspInit 1 */
+
+  /* USER CODE END TIM3_MspInit 1 */
+  }
+
+}
+
+/**
 * @brief TIM_Base MSP Initialization
 * This function configures the hardware resources used in this example
 * @param htim_base: TIM_Base handle pointer
@@ -482,6 +623,88 @@ void HAL_TIM_Base_MspInit(TIM_HandleTypeDef* htim_base)
 
 }
 
+void HAL_TIM_MspPostInit(TIM_HandleTypeDef* htim)
+{
+  GPIO_InitTypeDef GPIO_InitStruct = {0};
+  if(htim->Instance==TIM1)
+  {
+  /* USER CODE BEGIN TIM1_MspPostInit 0 */
+
+  /* USER CODE END TIM1_MspPostInit 0 */
+    __HAL_RCC_GPIOA_CLK_ENABLE();
+    /**TIM1 GPIO Configuration
+    PA9     ------> TIM1_CH2
+    */
+    GPIO_InitStruct.Pin = GPIO_PIN_9;
+    GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
+    GPIO_InitStruct.Pull = GPIO_NOPULL;
+    GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
+    GPIO_InitStruct.Alternate = GPIO_AF1_TIM1;
+    HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
+
+  /* USER CODE BEGIN TIM1_MspPostInit 1 */
+
+  /* USER CODE END TIM1_MspPostInit 1 */
+  }
+  else if(htim->Instance==TIM3)
+  {
+  /* USER CODE BEGIN TIM3_MspPostInit 0 */
+
+  /* USER CODE END TIM3_MspPostInit 0 */
+
+    __HAL_RCC_GPIOC_CLK_ENABLE();
+    /**TIM3 GPIO Configuration
+    PC6     ------> TIM3_CH1
+    PC7     ------> TIM3_CH2
+    PC8     ------> TIM3_CH3
+    PC9     ------> TIM3_CH4
+    */
+    GPIO_InitStruct.Pin = GPIO_PIN_6|GPIO_PIN_7|GPIO_PIN_8|GPIO_PIN_9;
+    GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
+    GPIO_InitStruct.Pull = GPIO_NOPULL;
+    GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_MEDIUM;
+    GPIO_InitStruct.Alternate = GPIO_AF2_TIM3;
+    HAL_GPIO_Init(GPIOC, &GPIO_InitStruct);
+
+  /* USER CODE BEGIN TIM3_MspPostInit 1 */
+
+  /* USER CODE END TIM3_MspPostInit 1 */
+  }
+
+}
+/**
+* @brief TIM_PWM MSP De-Initialization
+* This function freeze the hardware resources used in this example
+* @param htim_pwm: TIM_PWM handle pointer
+* @retval None
+*/
+void HAL_TIM_PWM_MspDeInit(TIM_HandleTypeDef* htim_pwm)
+{
+  if(htim_pwm->Instance==TIM1)
+  {
+  /* USER CODE BEGIN TIM1_MspDeInit 0 */
+
+  /* USER CODE END TIM1_MspDeInit 0 */
+    /* Peripheral clock disable */
+    __HAL_RCC_TIM1_CLK_DISABLE();
+  /* USER CODE BEGIN TIM1_MspDeInit 1 */
+
+  /* USER CODE END TIM1_MspDeInit 1 */
+  }
+  else if(htim_pwm->Instance==TIM3)
+  {
+  /* USER CODE BEGIN TIM3_MspDeInit 0 */
+
+  /* USER CODE END TIM3_MspDeInit 0 */
+    /* Peripheral clock disable */
+    __HAL_RCC_TIM3_CLK_DISABLE();
+  /* USER CODE BEGIN TIM3_MspDeInit 1 */
+
+  /* USER CODE END TIM3_MspDeInit 1 */
+  }
+
+}
+
 /**
 * @brief TIM_Base MSP De-Initialization
 * This function freeze the hardware resources used in this example

+ 36 - 0
OZE_Sensor/Core/Src/stm32h7xx_it.c

@@ -58,6 +58,7 @@
 extern DMA_HandleTypeDef hdma_adc1;
 extern DMA_HandleTypeDef hdma_adc2;
 extern DMA_HandleTypeDef hdma_adc3;
+extern DAC_HandleTypeDef hdac1;
 extern TIM_HandleTypeDef htim2;
 extern UART_HandleTypeDef huart8;
 extern UART_HandleTypeDef huart1;
@@ -221,6 +222,21 @@ void DMA1_Stream2_IRQHandler(void)
 }
 
 /**
+  * @brief This function handles EXTI line[9:5] interrupts.
+  */
+void EXTI9_5_IRQHandler(void)
+{
+  /* USER CODE BEGIN EXTI9_5_IRQn 0 */
+
+  /* USER CODE END EXTI9_5_IRQn 0 */
+  HAL_GPIO_EXTI_IRQHandler(GPIO_PIN_8);
+  HAL_GPIO_EXTI_IRQHandler(GPIO_PIN_9);
+  /* USER CODE BEGIN EXTI9_5_IRQn 1 */
+
+  /* USER CODE END EXTI9_5_IRQn 1 */
+}
+
+/**
   * @brief This function handles TIM2 global interrupt.
   */
 void TIM2_IRQHandler(void)
@@ -249,6 +265,23 @@ void USART1_IRQHandler(void)
 }
 
 /**
+  * @brief This function handles EXTI line[15:10] interrupts.
+  */
+void EXTI15_10_IRQHandler(void)
+{
+  /* USER CODE BEGIN EXTI15_10_IRQn 0 */
+
+  /* USER CODE END EXTI15_10_IRQn 0 */
+  HAL_GPIO_EXTI_IRQHandler(GPIO_PIN_10);
+  HAL_GPIO_EXTI_IRQHandler(GPIO_PIN_11);
+  HAL_GPIO_EXTI_IRQHandler(GPIO_PIN_12);
+  HAL_GPIO_EXTI_IRQHandler(GPIO_PIN_13);
+  /* USER CODE BEGIN EXTI15_10_IRQn 1 */
+
+  /* USER CODE END EXTI15_10_IRQn 1 */
+}
+
+/**
   * @brief This function handles TIM6 global interrupt, DAC1_CH1 and DAC1_CH2 underrun error interrupts.
   */
 void TIM6_DAC_IRQHandler(void)
@@ -256,6 +289,9 @@ void TIM6_DAC_IRQHandler(void)
   /* USER CODE BEGIN TIM6_DAC_IRQn 0 */
 
   /* USER CODE END TIM6_DAC_IRQn 0 */
+  if (hdac1.State != HAL_DAC_STATE_RESET) {
+    HAL_DAC_IRQHandler(&hdac1);
+  }
   HAL_TIM_IRQHandler(&htim6);
   /* USER CODE BEGIN TIM6_DAC_IRQn 1 */
 

+ 157 - 131
OZE_Sensor/Core/Src/uart_tasks.c

@@ -9,6 +9,7 @@
 #include "main.h"
 
 #include <stdio.h>
+#include <stdlib.h>
 #include <string.h>
 
 #include "interprocess_data.h"
@@ -16,21 +17,25 @@
 #include "mock_tasks.h"
 #include "uart_tasks.h"
 #include "meas_tasks.h"
+#include "peripherial.h"
+#include "adc_buffers.h"
 
 enum SerialReceiverStates { srWaitForHeader, srCheckCrc, srRecieveData, srExecuteCmd, srFail, srFinish, srLast };
 
-// osThreadId_t uart8RecieveTaskHandle;
-// osThreadId_t uart8TransmitTaskHandle;
-//  osSemaphoreDef_t uart8RxSemaphoreDef;
-//  osSemaphoreId_t uart8RxSemaphore = NULL;
-
-// osMessageQueueId_t uart8DecodedFrameDataTaskQueue;
-// osMessageQueueId_t uart8SendCmdToSlaveQueue;
-
 extern UART_HandleTypeDef huart1;
 extern UART_HandleTypeDef huart8;
 extern DMA_HandleTypeDef hdma_uart8_rx;
 extern CRC_HandleTypeDef hcrc;
+extern DAC_HandleTypeDef hdac1;
+extern osTimerId_t debugLedTimerHandle;
+extern osTimerId_t fanTimerHandle;
+extern osTimerId_t motorXTimerHandle;
+extern osTimerId_t motorYTimerHandle;
+
+extern TIM_HandleTypeDef htim1;
+extern TIM_HandleTypeDef htim3;
+extern TIM_OC_InitTypeDef fanTimerConfigOC;
+extern TIM_OC_InitTypeDef motorXYTimerConfigOC;
 
 uint8_t uart1RxBuffer[UART1_RX_BUFF_SIZE]        = { 0 };
 uint8_t uart1TxBuffer[UART1_TX_BUFF_SIZE]        = { 0 };
@@ -53,17 +58,7 @@ UartTaskData* uartTasks[] = { &uart8TaskData, NULL };
 uint8_t outputDataBuffer[OUTPUT_DATA_BUFF_SIZE];
 uint16_t outputDataBufferPos = 0;
 
-
-//extern uint32_t slaveLastSeen[SLAVES_COUNT];
-//extern RESMeasurements resMeasurements[SLAVES_COUNT];
-//extern SesnorsInfo sensorsInfo[SLAVES_COUNT];
-//extern osMutexId_t resMeasurementsMutex;
-//extern osMutexId_t sensorsInfoMutex;
-//RESMeasurements resMeasurements = { 0 };
-//SesnorsInfo sensorsInfo         = { 0 };
 uint32_t slaveLastSeen[SLAVES_COUNT] = { 0 };
-//osMutexId_t resMeasurementsMutex;
-//osMutexId_t sensorsInfoMutex;
 
 extern RNG_HandleTypeDef hrng;
 
@@ -79,56 +74,21 @@ void UartTasksInit(void) {
   uart1TaskData.processDataCb = Uart1ReceivedDataProcessCallback;
   uart1TaskData.processRxDataMsgBuffer = NULL;
 
-//  uart8TaskData.uartRxBuffer = uart8RxBuffer;
-//  uart8TaskData.uartRxBufferLen = UART8_RX_BUFF_SIZE;
-//  uart8TaskData.uartTxBuffer = uart8TxBuffer;
-//  uart8TaskData.uartRxBufferLen = UART8_TX_BUFF_SIZE;
-//  uart8TaskData.frameData = uart8TaskFrameData;
-//  uart8TaskData.frameDataLen = UART8_RX_BUFF_SIZE;
-//  uart8TaskData.huart = &huart8;
-//  uart8TaskData.uartNumber = 8;
-//  uart8TaskData.processDataCb = Uart8ReceivedDataProcessCallback;
-//  uart8TaskData.processRxDataMsgBuffer = NULL;
-
   UartTaskCreate(&uart1TaskData);
-//  UartTaskCreate(&uart8TaskData);
 }
 
 void UartTaskCreate (UartTaskData* uartTaskData) {
     osThreadAttr_t osThreadAttrRxUart = { 0 };
-//    osThreadAttr_t osThreadAttrTxUart = { 0 };
-
     osThreadAttrRxUart.stack_size = configMINIMAL_STACK_SIZE * 2;
     osThreadAttrRxUart.priority   = (osPriority_t)osPriorityHigh;
     uartTaskData->uartRecieveTaskHandle = osThreadNew (UartRxTask, uartTaskData, &osThreadAttrRxUart);
-
-//    osMessageQueueAttr_t uartTxMsgQueueAttr = { 0 };
-//    uartTaskData->sendCmdToSlaveQueue = osMessageQueueNew (16, sizeof (InterProcessData), &uartTxMsgQueueAttr);
-
-//    osThreadAttrTxUart.stack_size        = configMINIMAL_STACK_SIZE * 4;
-//    osThreadAttrTxUart.priority          = (osPriority_t)osPriorityNormal;
-//    uartTaskData->uartTransmitTaskHandle = osThreadNew (UartTxTask, uartTaskData, &osThreadAttrTxUart);
 }
 
 void Uart8TasksInit (void) {
     osThreadAttr_t osThreadAttrRxUart = { 0 };
-//    osThreadAttr_t osThreadAttrTxUart = { 0 };
-#if 0
-	osMessageQueueAttr_t uartRxMsgQueueAttr = { 0 };
-	uartRxMsgQueueAttr.name = "uart8RxMsgQueue";
-	uart8DecodedFrameDataTaskQueue = osMessageQueueNew(4, sizeof(SerialProtocolFrameData), &uartRxMsgQueueAttr);
-	uart8TaskData.processDataQueue = uart8DecodedFrameDataTaskQueue;
-#else
-//    uart8TaskData.processDataQueue = NULL;
-#endif
 
-//	uart8TaskData.processRxDataMsgBuffer = xMessageBufferCreate( INPUT_DATA_BUFF_SIZE );
-//    uart8TaskData.processDataCb = NULL;
     uart8TaskData.processDataCb = Uart8ReceivedDataProcessCallback;
 
-//    resMeasurementsMutex = osMutexNew (NULL);
-//    sensorsInfoMutex     = osMutexNew (NULL);
-
     osThreadAttrRxUart.name       = "os_thread_uart8_rx";
     osThreadAttrRxUart.stack_size = configMINIMAL_STACK_SIZE * 2;
     osThreadAttrRxUart.priority   = (osPriority_t)osPriorityHigh;
@@ -142,20 +102,10 @@ void Uart8TasksInit (void) {
     uart8TaskData.huart                 = &huart8;
     uart8TaskData.uartNumber            = 8;
     uart8TaskData.uartRecieveTaskHandle = osThreadNew (UartRxTask, &uart8TaskData, &osThreadAttrRxUart);
-
-
-//    osMessageQueueAttr_t uartTxMsgQueueAttr = { 0 };
-//    uartTxMsgQueueAttr.name                 = "uart8TxMsgQueue";
-//    uart8TaskData.sendCmdToSlaveQueue       = osMessageQueueNew (16, sizeof (InterProcessData), &uartTxMsgQueueAttr);
-//
-//    osThreadAttrTxUart.name              = "os_thread_uart8_tx";
-//    osThreadAttrTxUart.stack_size        = configMINIMAL_STACK_SIZE * 4;
-//    osThreadAttrTxUart.priority          = (osPriority_t)osPriorityNormal;
-//    uart8TaskData.uartTransmitTaskHandle = osThreadNew (UartTxTask, &uart8TaskData, &osThreadAttrTxUart);
 }
 
 void HAL_UART_RxCpltCallback (UART_HandleTypeDef* huart) {
-    //	osSemaphoreRelease(uart8RxSemaphore);
+
 }
 
 void HAL_UARTEx_RxEventCallback(UART_HandleTypeDef* huart, uint16_t Size) {
@@ -178,8 +128,6 @@ void HandleUartRxCallback (UartTaskData* uartTaskData, UART_HandleTypeDef* huart
     uartTaskData->frameBytesCount += Size;
     osMutexRelease (uartTaskData->rxDataBufferMutex);
     xTaskNotifyFromISR (uartTaskData->uartRecieveTaskHandle, Size, eSetValueWithOverwrite, &pxHigherPriorityTaskWoken);
-    //	HAL_UARTEx_ReceiveToIdle_DMA(huart, uart8RxBuffer, UART8_RX_BUFF_SIZE);
-    //	__HAL_DMA_DISABLE_IT(&hdma_uart8_rx, DMA_IT_HT);
     HAL_UARTEx_ReceiveToIdle_IT (uartTaskData->huart, uartTaskData->uartRxBuffer, uartTaskData->uartRxBufferLen);
     portEND_SWITCHING_ISR (pxHigherPriorityTaskWoken);
 }
@@ -201,11 +149,7 @@ void UartRxTask (void* argument) {
 
     uartTaskData->rxDataBufferMutex = osMutexNew (NULL);
     HAL_UARTEx_ReceiveToIdle_IT (uartTaskData->huart, uartTaskData->uartRxBuffer, uartTaskData->uartRxBufferLen);
-    //	HAL_UARTEx_ReceiveToIdle_DMA(&huart8, uart8RxBuffer, 32);
     while (pdTRUE) {
-        //		HAL_UART_Receive_IT(&huart8, uart8RxBuffer, 1);
-        //		if(osSemaphoreAcquire(uart8RxSemaphore, pdMS_TO_TICKS(1000)) !=
-        // osOK) 		if(xTaskNotifyWait(0, 0, &bytesRec, portMAX_DELAY) == pdTrue)
         frameTimeout = !(xTaskNotifyWait (0, 0, &bytesRec, pdMS_TO_TICKS (FRAME_TIMEOUT_MS)));
 
         osMutexAcquire (uartTaskData->rxDataBufferMutex, osWaitForever);
@@ -348,80 +292,162 @@ void Uart8ReceivedDataProcessCallback (void* arg, SerialProtocolFrameData* spFra
 }
 
 void Uart1ReceivedDataProcessCallback (void* arg, SerialProtocolFrameData* spFrameData) {
-    UartTaskData* uartTaskData = (UartTaskData*)arg;
-    uint16_t dataToSend        = 0;
-    outputDataBufferPos = 0;
+    UartTaskData* uartTaskData          = (UartTaskData*)arg;
+    uint16_t dataToSend                 = 0;
+    outputDataBufferPos                 = 0;
+    uint16_t inputDataBufferPos         = 0;
     SerialProtocolRespStatus respStatus = spUnknownCommand;
     switch (spFrameData->frameHeader.frameCommand) {
     case spGetElectricalMeasurments:
-    	osMutexAcquire (resMeasurementsMutex, osWaitForever);
-		for(int i = 0; i < 3; i++)
-		{
-			WriteDataToBuffer(outputDataBuffer, &outputDataBufferPos, &resMeasurements.voltageRMS[i], sizeof(float));
-		}
-		for(int i = 0; i < 3; i++)
-		{
-			WriteDataToBuffer(outputDataBuffer, &outputDataBufferPos, &resMeasurements.voltagePeak[i], sizeof(float));
-		}
-		for(int i = 0; i < 3; i++)
-		{
-			WriteDataToBuffer(outputDataBuffer, &outputDataBufferPos, &resMeasurements.currentRMS[i], sizeof(float));
-		}
-		for(int i = 0; i < 3; i++)
-		{
-			WriteDataToBuffer(outputDataBuffer, &outputDataBufferPos, &resMeasurements.currentPeak[i], sizeof(float));
-		}
-		for(int i = 0; i < 3; i++)
-		{
-			WriteDataToBuffer(outputDataBuffer, &outputDataBufferPos, &resMeasurements.power[i], sizeof(float));
-		}
-        osMutexRelease(resMeasurementsMutex);
-        respStatus = spOK;
+        if (osMutexAcquire (resMeasurementsMutex, osWaitForever) == osOK) {
+            for (int i = 0; i < 3; i++) {
+                WriteDataToBuffer (outputDataBuffer, &outputDataBufferPos, &resMeasurements.voltageRMS[i], sizeof (float));
+            }
+            for (int i = 0; i < 3; i++) {
+                WriteDataToBuffer (outputDataBuffer, &outputDataBufferPos, &resMeasurements.voltagePeak[i], sizeof (float));
+            }
+            for (int i = 0; i < 3; i++) {
+                WriteDataToBuffer (outputDataBuffer, &outputDataBufferPos, &resMeasurements.currentRMS[i], sizeof (float));
+            }
+            for (int i = 0; i < 3; i++) {
+                WriteDataToBuffer (outputDataBuffer, &outputDataBufferPos, &resMeasurements.currentPeak[i], sizeof (float));
+            }
+            for (int i = 0; i < 3; i++) {
+                WriteDataToBuffer (outputDataBuffer, &outputDataBufferPos, &resMeasurements.power[i], sizeof (float));
+            }
+            osMutexRelease (resMeasurementsMutex);
+            respStatus = spOK;
+        } else {
+            respStatus = spInternalError;
+        }
         break;
     case spGetSensorMeasurments:
-    	osMutexAcquire (sensorsInfoMutex, osWaitForever);
-    	WriteDataToBuffer(outputDataBuffer, &outputDataBufferPos, &sensorsInfo.pvTemperature[0], sizeof(float));
-		WriteDataToBuffer(outputDataBuffer, &outputDataBufferPos, &sensorsInfo.pvTemperature[1], sizeof(float));
-		WriteDataToBuffer(outputDataBuffer, &outputDataBufferPos, &sensorsInfo.fanVoltage, sizeof(float));
-		WriteDataToBuffer(outputDataBuffer, &outputDataBufferPos, &sensorsInfo.pvEncoder, sizeof(float));
-		WriteDataToBuffer(outputDataBuffer, &outputDataBufferPos, &sensorsInfo.motorXStatus, sizeof(uint8_t));
-		WriteDataToBuffer(outputDataBuffer, &outputDataBufferPos, &sensorsInfo.motorYStatus, sizeof(uint8_t));
-		WriteDataToBuffer(outputDataBuffer, &outputDataBufferPos, &sensorsInfo.motorXAveCurrent, sizeof(float));
-		WriteDataToBuffer(outputDataBuffer, &outputDataBufferPos, &sensorsInfo.motorYAveCurrent, sizeof(float));
-		WriteDataToBuffer(outputDataBuffer, &outputDataBufferPos, &sensorsInfo.motorXPeakCurrent, sizeof(float));
-		WriteDataToBuffer(outputDataBuffer, &outputDataBufferPos, &sensorsInfo.motorYPeakCurrent, sizeof(float));
-		WriteDataToBuffer(outputDataBuffer, &outputDataBufferPos, &sensorsInfo.limitSwitchUp, sizeof(uint8_t));
-		WriteDataToBuffer(outputDataBuffer, &outputDataBufferPos, &sensorsInfo.limitSwitchDown, sizeof(uint8_t));
-		WriteDataToBuffer(outputDataBuffer, &outputDataBufferPos, &sensorsInfo.limitSwitchCenter, sizeof(uint8_t));
-		WriteDataToBuffer(outputDataBuffer, &outputDataBufferPos, &sensorsInfo.powerSupplyFailMask, sizeof(uint8_t));
-    	osMutexRelease(sensorsInfoMutex);
-    	respStatus = spOK;
-    	break;
+        if (osMutexAcquire (sensorsInfoMutex, osWaitForever) == osOK) {
+            WriteDataToBuffer (outputDataBuffer, &outputDataBufferPos, &sensorsInfo.pvTemperature[0], sizeof (float));
+            WriteDataToBuffer (outputDataBuffer, &outputDataBufferPos, &sensorsInfo.pvTemperature[1], sizeof (float));
+            WriteDataToBuffer (outputDataBuffer, &outputDataBufferPos, &sensorsInfo.fanVoltage, sizeof (float));
+            WriteDataToBuffer (outputDataBuffer, &outputDataBufferPos, &sensorsInfo.pvEncoder, sizeof (float));
+            WriteDataToBuffer (outputDataBuffer, &outputDataBufferPos, &sensorsInfo.motorXStatus, sizeof (uint8_t));
+            WriteDataToBuffer (outputDataBuffer, &outputDataBufferPos, &sensorsInfo.motorYStatus, sizeof (uint8_t));
+            WriteDataToBuffer (outputDataBuffer, &outputDataBufferPos, &sensorsInfo.motorXAveCurrent, sizeof (float));
+            WriteDataToBuffer (outputDataBuffer, &outputDataBufferPos, &sensorsInfo.motorYAveCurrent, sizeof (float));
+            WriteDataToBuffer (outputDataBuffer, &outputDataBufferPos, &sensorsInfo.motorXPeakCurrent, sizeof (float));
+            WriteDataToBuffer (outputDataBuffer, &outputDataBufferPos, &sensorsInfo.motorYPeakCurrent, sizeof (float));
+            WriteDataToBuffer (outputDataBuffer, &outputDataBufferPos, &sensorsInfo.limitXSwitchUp, sizeof (uint8_t));
+            WriteDataToBuffer (outputDataBuffer, &outputDataBufferPos, &sensorsInfo.limitXSwitchDown, sizeof (uint8_t));
+            WriteDataToBuffer (outputDataBuffer, &outputDataBufferPos, &sensorsInfo.limitXSwitchCenter, sizeof (uint8_t));
+            WriteDataToBuffer (outputDataBuffer, &outputDataBufferPos, &sensorsInfo.limitYSwitchUp, sizeof (uint8_t));
+            WriteDataToBuffer (outputDataBuffer, &outputDataBufferPos, &sensorsInfo.limitYSwitchDown, sizeof (uint8_t));
+            WriteDataToBuffer (outputDataBuffer, &outputDataBufferPos, &sensorsInfo.limitYSwitchCenter, sizeof (uint8_t));
+            WriteDataToBuffer (outputDataBuffer, &outputDataBufferPos, &sensorsInfo.powerSupplyFailMask, sizeof (uint8_t));
+            osMutexRelease (sensorsInfoMutex);
+            respStatus = spOK;
+        } else {
+            respStatus = spInternalError;
+        }
+        break;
     case spSetFanSpeed:
+        osTimerStop (fanTimerHandle);
+        int32_t fanTimerPeriod = 0;
+        uint32_t pulse         = 0;
+        ReadWordFromBufer (spFrameData->dataBuffer, &inputDataBufferPos, &pulse);
+        ReadWordFromBufer (spFrameData->dataBuffer, &inputDataBufferPos, (uint32_t*)&fanTimerPeriod);
+        fanTimerConfigOC.Pulse = pulse * 10;
+        if (HAL_TIM_PWM_ConfigChannel (&htim1, &fanTimerConfigOC, TIM_CHANNEL_2) != HAL_OK) {
+            Error_Handler ();
+        }
+        if (fanTimerPeriod > 0) {
+            osTimerStart (fanTimerHandle, fanTimerPeriod * 1000);
+            HAL_TIM_PWM_Start (&htim1, TIM_CHANNEL_2);
+        } else if (fanTimerPeriod == 0) {
+            osTimerStop (fanTimerHandle);
+            HAL_TIM_PWM_Stop (&htim1, TIM_CHANNEL_2);
+        } else if (fanTimerPeriod == -1) {
+            HAL_TIM_PWM_Start (&htim1, TIM_CHANNEL_2);
+        }
+        respStatus = spOK;
+        break;
     case spSetMotorXOn:
+        int32_t motorXPWMPulse    = 0;
+        int32_t motorXTimerPeriod = 0;
+        uint32_t motorXStatus     = 0;
+        ReadWordFromBufer (spFrameData->dataBuffer, &inputDataBufferPos, (uint32_t*)&motorXPWMPulse);
+        ReadWordFromBufer (spFrameData->dataBuffer, &inputDataBufferPos, (uint32_t*)&motorXTimerPeriod);
+        if (osMutexAcquire (sensorsInfoMutex, osWaitForever) == osOK) {
+            motorXStatus =
+            motorControl (&htim3, &motorXYTimerConfigOC, TIM_CHANNEL_1, TIM_CHANNEL_2, motorXTimerHandle, motorXPWMPulse, motorXTimerPeriod, sensorsInfo.limitXSwitchUp, sensorsInfo.limitXSwitchDown);
+            sensorsInfo.motorXStatus = motorXStatus;
+            if (motorXStatus == 1) {
+                sensorsInfo.motorXPeakCurrent = 0.0;
+            }
+            osMutexRelease (sensorsInfoMutex);
+            respStatus = spOK;
+        } else {
+            respStatus = spInternalError;
+        }
+        break;
     case spSetMotorYOn:
-    	respStatus = spOK;
+        int32_t motorYPWMPulse    = 0;
+        int32_t motorYTimerPeriod = 0;
+        uint32_t motorYStatus     = 0;
+        ReadWordFromBufer (spFrameData->dataBuffer, &inputDataBufferPos, (uint32_t*)&motorYPWMPulse);
+        ReadWordFromBufer (spFrameData->dataBuffer, &inputDataBufferPos, (uint32_t*)&motorYTimerPeriod);
+        if (osMutexAcquire (sensorsInfoMutex, osWaitForever) == osOK) {
+            motorYStatus =
+            motorControl (&htim3, &motorXYTimerConfigOC, TIM_CHANNEL_3, TIM_CHANNEL_4, motorYTimerHandle, motorYPWMPulse, motorYTimerPeriod, sensorsInfo.limitYSwitchUp, sensorsInfo.limitYSwitchDown);
+            sensorsInfo.motorYStatus = motorYStatus;
+            if (motorYStatus == 1) {
+                sensorsInfo.motorYPeakCurrent = 0.0;
+            }
+            osMutexRelease (sensorsInfoMutex);
+            respStatus = spOK;
+        } else {
+            respStatus = spInternalError;
+        }
         break;
     case spSetDiodeOn:
-    	respStatus = spOK;
-    	break;
+        osTimerStop (debugLedTimerHandle);
+        int32_t dbgLedTimerPeriod = 0;
+        ReadWordFromBufer (spFrameData->dataBuffer, &inputDataBufferPos, (uint32_t*)&dbgLedTimerPeriod);
+        if (dbgLedTimerPeriod > 0) {
+            osTimerStart (debugLedTimerHandle, dbgLedTimerPeriod * 1000);
+            DbgLEDOn (DBG_LED1);
+        } else if (dbgLedTimerPeriod == 0) {
+            DbgLEDOff (DBG_LED1);
+        } else if (dbgLedTimerPeriod == -1) {
+            DbgLEDOn (DBG_LED1);
+        }
+        respStatus = spOK;
+        break;
     case spSetmotorXMaxCurrent:
+        float motorXMaxCurrent = 0;
+        ReadWordFromBufer (spFrameData->dataBuffer, &inputDataBufferPos, (uint32_t*)&motorXMaxCurrent);
+        uint32_t dacDataCh1 = (uint32_t)(4095 * motorXMaxCurrent / (EXT_VREF_mV * 0.001));
+        HAL_DAC_SetValue (&hdac1, DAC_CHANNEL_1, DAC_ALIGN_12B_R, dacDataCh1);
+        HAL_DAC_Start (&hdac1, DAC_CHANNEL_1);
+        respStatus = spOK;
+        break;
     case spSetmotorYMaxCurrent:
-    	respStatus = spOK;
-    	break;
+        float motorYMaxCurrent = 0;
+        ReadWordFromBufer (spFrameData->dataBuffer, &inputDataBufferPos, (uint32_t*)&motorYMaxCurrent);
+        uint32_t dacDataCh2 = (uint32_t)(4095 * motorYMaxCurrent / (EXT_VREF_mV * 0.001));
+        HAL_DAC_SetValue (&hdac1, DAC_CHANNEL_2, DAC_ALIGN_12B_R, dacDataCh2);
+        HAL_DAC_Start (&hdac1, DAC_CHANNEL_2);
+        respStatus = spOK;
+        break;
     case spClearPeakMeasurments:
-    	osMutexAcquire (resMeasurementsMutex, osWaitForever);
-		for(int i = 0; i < 3; i++)
-		{
-			resMeasurements.voltagePeak[i] = resMeasurements.voltageRMS[i];
-			resMeasurements.currentPeak[i] = resMeasurements.currentRMS[i];
-		}
-    	osMutexRelease(resMeasurementsMutex);
-    	respStatus = spOK;
-    	break;
-    default:
-    	respStatus = spUnknownCommand;
-    	break;
+        if (osMutexAcquire (resMeasurementsMutex, osWaitForever) == osOK) {
+            for (int i = 0; i < 3; i++) {
+                resMeasurements.voltagePeak[i] = resMeasurements.voltageRMS[i];
+                resMeasurements.currentPeak[i] = resMeasurements.currentRMS[i];
+            }
+            osMutexRelease (resMeasurementsMutex);
+            respStatus = spOK;
+        } else {
+            respStatus = spInternalError;
+        }
+        break;
+    default: respStatus = spUnknownCommand; break;
     }
     dataToSend = PrepareRespFrame (uartTaskData->uartTxBuffer, spFrameData->frameHeader.frameId, spFrameData->frameHeader.frameCommand, respStatus, outputDataBuffer, outputDataBufferPos);
     if (dataToSend > 0) {

Файловите разлики са ограничени, защото са твърде много
+ 8 - 2
OZE_Sensor/Debug/Drivers/STM32H7xx_HAL_Driver/Src/subdir.mk


Файловите разлики са ограничени, защото са твърде много
+ 41937 - 34430
OZE_Sensor/Debug/OZE_Sensor.list


Файловите разлики са ограничени, защото са твърде много
+ 2411 - 1663
OZE_Sensor/Debug/OZE_Sensor.map


+ 2 - 0
OZE_Sensor/Debug/objects.list

@@ -19,6 +19,8 @@
 "./Drivers/STM32H7xx_HAL_Driver/Src/stm32h7xx_hal_cortex.o"
 "./Drivers/STM32H7xx_HAL_Driver/Src/stm32h7xx_hal_crc.o"
 "./Drivers/STM32H7xx_HAL_Driver/Src/stm32h7xx_hal_crc_ex.o"
+"./Drivers/STM32H7xx_HAL_Driver/Src/stm32h7xx_hal_dac.o"
+"./Drivers/STM32H7xx_HAL_Driver/Src/stm32h7xx_hal_dac_ex.o"
 "./Drivers/STM32H7xx_HAL_Driver/Src/stm32h7xx_hal_dma.o"
 "./Drivers/STM32H7xx_HAL_Driver/Src/stm32h7xx_hal_dma_ex.o"
 "./Drivers/STM32H7xx_HAL_Driver/Src/stm32h7xx_hal_exti.o"

+ 554 - 0
OZE_Sensor/Drivers/STM32H7xx_HAL_Driver/Inc/stm32h7xx_hal_dac.h

@@ -0,0 +1,554 @@
+/**
+  ******************************************************************************
+  * @file    stm32h7xx_hal_dac.h
+  * @author  MCD Application Team
+  * @brief   Header file of DAC HAL module.
+  ******************************************************************************
+  * @attention
+  *
+  * Copyright (c) 2017 STMicroelectronics.
+  * All rights reserved.
+  *
+  * This software is licensed under terms that can be found in the LICENSE file
+  * in the root directory of this software component.
+  * If no LICENSE file comes with this software, it is provided AS-IS.
+  *
+  ******************************************************************************
+  */
+
+/* Define to prevent recursive inclusion -------------------------------------*/
+#ifndef STM32H7xx_HAL_DAC_H
+#define STM32H7xx_HAL_DAC_H
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/** @addtogroup STM32H7xx_HAL_Driver
+  * @{
+  */
+
+/* Includes ------------------------------------------------------------------*/
+#include "stm32h7xx_hal_def.h"
+
+#if defined(DAC1) || defined(DAC2)
+
+/** @addtogroup DAC
+  * @{
+  */
+
+/* Exported types ------------------------------------------------------------*/
+
+/** @defgroup DAC_Exported_Types DAC Exported Types
+  * @{
+  */
+
+/**
+  * @brief  HAL State structures definition
+  */
+typedef enum
+{
+  HAL_DAC_STATE_RESET             = 0x00U,  /*!< DAC not yet initialized or disabled  */
+  HAL_DAC_STATE_READY             = 0x01U,  /*!< DAC initialized and ready for use    */
+  HAL_DAC_STATE_BUSY              = 0x02U,  /*!< DAC internal processing is ongoing   */
+  HAL_DAC_STATE_TIMEOUT           = 0x03U,  /*!< DAC timeout state                    */
+  HAL_DAC_STATE_ERROR             = 0x04U   /*!< DAC error state                      */
+
+} HAL_DAC_StateTypeDef;
+
+/**
+  * @brief  DAC handle Structure definition
+  */
+#if (USE_HAL_DAC_REGISTER_CALLBACKS == 1)
+typedef struct __DAC_HandleTypeDef
+#else
+typedef struct
+#endif /* USE_HAL_DAC_REGISTER_CALLBACKS */
+{
+  DAC_TypeDef                 *Instance;     /*!< Register base address             */
+
+  __IO HAL_DAC_StateTypeDef   State;         /*!< DAC communication state           */
+
+  HAL_LockTypeDef             Lock;          /*!< DAC locking object                */
+
+  DMA_HandleTypeDef           *DMA_Handle1;  /*!< Pointer DMA handler for channel 1 */
+
+  DMA_HandleTypeDef           *DMA_Handle2;  /*!< Pointer DMA handler for channel 2 */
+
+  __IO uint32_t               ErrorCode;     /*!< DAC Error code                    */
+
+#if (USE_HAL_DAC_REGISTER_CALLBACKS == 1)
+  void (* ConvCpltCallbackCh1)(struct __DAC_HandleTypeDef *hdac);
+  void (* ConvHalfCpltCallbackCh1)(struct __DAC_HandleTypeDef *hdac);
+  void (* ErrorCallbackCh1)(struct __DAC_HandleTypeDef *hdac);
+  void (* DMAUnderrunCallbackCh1)(struct __DAC_HandleTypeDef *hdac);
+
+  void (* ConvCpltCallbackCh2)(struct __DAC_HandleTypeDef *hdac);
+  void (* ConvHalfCpltCallbackCh2)(struct __DAC_HandleTypeDef *hdac);
+  void (* ErrorCallbackCh2)(struct __DAC_HandleTypeDef *hdac);
+  void (* DMAUnderrunCallbackCh2)(struct __DAC_HandleTypeDef *hdac);
+
+
+  void (* MspInitCallback)(struct __DAC_HandleTypeDef *hdac);
+  void (* MspDeInitCallback)(struct __DAC_HandleTypeDef *hdac);
+#endif /* USE_HAL_DAC_REGISTER_CALLBACKS */
+
+} DAC_HandleTypeDef;
+
+/**
+  * @brief   DAC Configuration sample and hold Channel structure definition
+  */
+typedef struct
+{
+  uint32_t DAC_SampleTime ;          /*!< Specifies the Sample time for the selected channel.
+                                          This parameter applies when DAC_SampleAndHold is DAC_SAMPLEANDHOLD_ENABLE.
+                                          This parameter must be a number between Min_Data = 0 and Max_Data = 1023 */
+
+  uint32_t DAC_HoldTime ;            /*!< Specifies the hold time for the selected channel
+                                          This parameter applies when DAC_SampleAndHold is DAC_SAMPLEANDHOLD_ENABLE.
+                                          This parameter must be a number between Min_Data = 0 and Max_Data = 1023 */
+
+  uint32_t DAC_RefreshTime ;         /*!< Specifies the refresh time for the selected channel
+                                          This parameter applies when DAC_SampleAndHold is DAC_SAMPLEANDHOLD_ENABLE.
+                                          This parameter must be a number between Min_Data = 0 and Max_Data = 255 */
+} DAC_SampleAndHoldConfTypeDef;
+
+/**
+  * @brief   DAC Configuration regular Channel structure definition
+  */
+typedef struct
+{
+  uint32_t DAC_SampleAndHold;            /*!< Specifies whether the DAC mode.
+                                              This parameter can be a value of @ref DAC_SampleAndHold */
+
+  uint32_t DAC_Trigger;                  /*!< Specifies the external trigger for the selected DAC channel.
+                                              This parameter can be a value of @ref DAC_trigger_selection */
+
+  uint32_t DAC_OutputBuffer;             /*!< Specifies whether the DAC channel output buffer is enabled or disabled.
+                                               This parameter can be a value of @ref DAC_output_buffer */
+
+  uint32_t DAC_ConnectOnChipPeripheral ; /*!< Specifies whether the DAC output is connected or not to on chip peripheral.
+                                              This parameter can be a value of @ref DAC_ConnectOnChipPeripheral */
+
+  uint32_t DAC_UserTrimming;             /*!< Specifies the trimming mode
+                                              This parameter must be a value of @ref DAC_UserTrimming
+                                              DAC_UserTrimming is either factory or user trimming */
+
+  uint32_t DAC_TrimmingValue;             /*!< Specifies the offset trimming value
+                                               i.e. when DAC_SampleAndHold is DAC_TRIMMING_USER.
+                                               This parameter must be a number between Min_Data = 1 and Max_Data = 31 */
+  DAC_SampleAndHoldConfTypeDef  DAC_SampleAndHoldConfig;  /*!< Sample and Hold settings */
+} DAC_ChannelConfTypeDef;
+
+#if (USE_HAL_DAC_REGISTER_CALLBACKS == 1)
+/**
+  * @brief  HAL DAC Callback ID enumeration definition
+  */
+typedef enum
+{
+  HAL_DAC_CH1_COMPLETE_CB_ID                 = 0x00U,  /*!< DAC CH1 Complete Callback ID      */
+  HAL_DAC_CH1_HALF_COMPLETE_CB_ID            = 0x01U,  /*!< DAC CH1 half Complete Callback ID */
+  HAL_DAC_CH1_ERROR_ID                       = 0x02U,  /*!< DAC CH1 error Callback ID         */
+  HAL_DAC_CH1_UNDERRUN_CB_ID                 = 0x03U,  /*!< DAC CH1 underrun Callback ID      */
+
+  HAL_DAC_CH2_COMPLETE_CB_ID                 = 0x04U,  /*!< DAC CH2 Complete Callback ID      */
+  HAL_DAC_CH2_HALF_COMPLETE_CB_ID            = 0x05U,  /*!< DAC CH2 half Complete Callback ID */
+  HAL_DAC_CH2_ERROR_ID                       = 0x06U,  /*!< DAC CH2 error Callback ID         */
+  HAL_DAC_CH2_UNDERRUN_CB_ID                 = 0x07U,  /*!< DAC CH2 underrun Callback ID      */
+
+  HAL_DAC_MSPINIT_CB_ID                      = 0x08U,  /*!< DAC MspInit Callback ID           */
+  HAL_DAC_MSPDEINIT_CB_ID                    = 0x09U,  /*!< DAC MspDeInit Callback ID         */
+  HAL_DAC_ALL_CB_ID                          = 0x0AU   /*!< DAC All ID                        */
+} HAL_DAC_CallbackIDTypeDef;
+
+/**
+  * @brief  HAL DAC Callback pointer definition
+  */
+typedef void (*pDAC_CallbackTypeDef)(DAC_HandleTypeDef *hdac);
+#endif /* USE_HAL_DAC_REGISTER_CALLBACKS */
+
+/**
+  * @}
+  */
+
+/* Exported constants --------------------------------------------------------*/
+
+/** @defgroup DAC_Exported_Constants DAC Exported Constants
+  * @{
+  */
+
+/** @defgroup DAC_Error_Code DAC Error Code
+  * @{
+  */
+#define  HAL_DAC_ERROR_NONE              0x00U    /*!< No error                          */
+#define  HAL_DAC_ERROR_DMAUNDERRUNCH1    0x01U    /*!< DAC channel1 DMA underrun error   */
+#define  HAL_DAC_ERROR_DMAUNDERRUNCH2    0x02U    /*!< DAC channel2 DMA underrun error   */
+#define  HAL_DAC_ERROR_DMA               0x04U    /*!< DMA error                         */
+#define  HAL_DAC_ERROR_TIMEOUT           0x08U    /*!< Timeout error                     */
+#if (USE_HAL_DAC_REGISTER_CALLBACKS == 1)
+#define HAL_DAC_ERROR_INVALID_CALLBACK   0x10U    /*!< Invalid callback error            */
+#endif /* USE_HAL_DAC_REGISTER_CALLBACKS */
+
+/**
+  * @}
+  */
+
+/** @defgroup DAC_trigger_selection DAC trigger selection
+  * @{
+  */
+#define DAC_TRIGGER_NONE                0x00000000U                                                                       /*!< Conversion is automatic once the DAC_DHRxxxx register has been loaded, and not by external trigger */
+#define DAC_TRIGGER_SOFTWARE            (                                                                    DAC_CR_TEN1) /*!< Conversion started by software trigger for DAC channel */
+#define DAC_TRIGGER_T1_TRGO             (                                                   DAC_CR_TSEL1_0 | DAC_CR_TEN1) /*!< TIM1 TRGO selected as external conversion trigger for DAC channel */
+#define DAC_TRIGGER_T2_TRGO             (                                  DAC_CR_TSEL1_1                  | DAC_CR_TEN1) /*!< TIM2 TRGO selected as external conversion trigger for DAC channel */
+#define DAC_TRIGGER_T4_TRGO             (                                  DAC_CR_TSEL1_1 | DAC_CR_TSEL1_0 | DAC_CR_TEN1) /*!< TIM4 TRGO selected as external conversion trigger for DAC channel */
+#define DAC_TRIGGER_T5_TRGO             (                 DAC_CR_TSEL1_2                                   | DAC_CR_TEN1) /*!< TIM5 TRGO selected as external conversion trigger for DAC channel */
+#define DAC_TRIGGER_T6_TRGO             (                 DAC_CR_TSEL1_2                  | DAC_CR_TSEL1_0 | DAC_CR_TEN1) /*!< TIM6 TRGO selected as external conversion trigger for DAC channel */
+#define DAC_TRIGGER_T7_TRGO             (                 DAC_CR_TSEL1_2 | DAC_CR_TSEL1_1                  | DAC_CR_TEN1) /*!< TIM7 TRGO selected as external conversion trigger for DAC channel */
+#define DAC_TRIGGER_T8_TRGO             (                 DAC_CR_TSEL1_2 | DAC_CR_TSEL1_1 | DAC_CR_TSEL1_0 | DAC_CR_TEN1) /*!< TIM8 TRGO selected as external conversion trigger for DAC channel */
+#define DAC_TRIGGER_T15_TRGO            (DAC_CR_TSEL1_3                                                    | DAC_CR_TEN1) /*!< TIM15 TRGO selected as external conversion trigger for DAC channel */
+#if defined(HRTIM1)
+#define DAC_TRIGGER_HR1_TRGO1           (DAC_CR_TSEL1_3                                   | DAC_CR_TSEL1_0 | DAC_CR_TEN1) /*!< HR1 TRGO1 selected as external conversion trigger for DAC channel */
+#define DAC_TRIGGER_HR1_TRGO2           (DAC_CR_TSEL1_3                  | DAC_CR_TSEL1_1                  | DAC_CR_TEN1) /*!< HR1 TRGO2 selected as external conversion trigger for DAC channel */
+#endif /* HRTIM12 */
+#define DAC_TRIGGER_LPTIM1_OUT          (DAC_CR_TSEL1_3                  | DAC_CR_TSEL1_1 | DAC_CR_TSEL1_0 | DAC_CR_TEN1) /*!< LPTIM1 OUT TRGO selected as external conversion trigger for DAC channel */
+#define DAC_TRIGGER_LPTIM2_OUT          (DAC_CR_TSEL1_3 | DAC_CR_TSEL1_2                                   | DAC_CR_TEN1) /*!< LPTIM2 OUT TRGO selected as external conversion trigger for DAC channel */
+#define DAC_TRIGGER_EXT_IT9             (DAC_CR_TSEL1_3 | DAC_CR_TSEL1_2                  | DAC_CR_TSEL1_0 | DAC_CR_TEN1) /*!< EXTI Line9 event selected as external conversion trigger for DAC channel */
+#if defined(TIM23)
+#define DAC_TRIGGER_T23_TRGO            (DAC_CR_TSEL1_3 | DAC_CR_TSEL1_2 | DAC_CR_TSEL1_1                  | DAC_CR_TEN1) /*!< TIM23 TRGO selected as external conversion trigger for DAC channel */
+#endif /* TIM23 */
+#if defined(TIM24)
+#define DAC_TRIGGER_T24_TRGO            (DAC_CR_TSEL1_3 | DAC_CR_TSEL1_2 | DAC_CR_TSEL1_1 | DAC_CR_TSEL1_0 | DAC_CR_TEN1) /*!< TIM24 TRGO selected as external conversion trigger for DAC channel */
+#endif /* TIM24 */
+#if defined(DAC2)
+#define DAC_TRIGGER_LPTIM3_OUT          (DAC_CR_TSEL1_3 | DAC_CR_TSEL1_2 | DAC_CR_TSEL1_1                  | DAC_CR_TEN1) /*!< LPTIM3 OUT TRGO selected as external conversion trigger for DAC channel */
+#endif /* DAC2 */
+
+/**
+  * @}
+  */
+
+/** @defgroup DAC_output_buffer DAC output buffer
+  * @{
+  */
+#define DAC_OUTPUTBUFFER_ENABLE            0x00000000U
+#define DAC_OUTPUTBUFFER_DISABLE           (DAC_MCR_MODE1_1)
+
+/**
+  * @}
+  */
+
+/** @defgroup DAC_Channel_selection DAC Channel selection
+  * @{
+  */
+#define DAC_CHANNEL_1                      0x00000000U
+
+#define DAC_CHANNEL_2                      0x00000010U
+
+/**
+  * @}
+  */
+
+/** @defgroup DAC_data_alignment DAC data alignment
+  * @{
+  */
+#define DAC_ALIGN_12B_R                    0x00000000U
+#define DAC_ALIGN_12B_L                    0x00000004U
+#define DAC_ALIGN_8B_R                     0x00000008U
+
+/**
+  * @}
+  */
+
+/** @defgroup DAC_flags_definition DAC flags definition
+  * @{
+  */
+#define DAC_FLAG_DMAUDR1                   (DAC_SR_DMAUDR1)
+
+#define DAC_FLAG_DMAUDR2                   (DAC_SR_DMAUDR2)
+
+
+/**
+  * @}
+  */
+
+/** @defgroup DAC_IT_definition  DAC IT definition
+  * @{
+  */
+#define DAC_IT_DMAUDR1                   (DAC_SR_DMAUDR1)
+
+#define DAC_IT_DMAUDR2                   (DAC_SR_DMAUDR2)
+
+
+/**
+  * @}
+  */
+
+/** @defgroup DAC_ConnectOnChipPeripheral DAC ConnectOnChipPeripheral
+  * @{
+  */
+#define DAC_CHIPCONNECT_EXTERNAL       (1UL << 0)
+#define DAC_CHIPCONNECT_INTERNAL       (1UL << 1)
+#define DAC_CHIPCONNECT_BOTH           (1UL << 2)
+
+/**
+  * @}
+  */
+
+/** @defgroup DAC_UserTrimming DAC User Trimming
+  * @{
+  */
+#define DAC_TRIMMING_FACTORY        (0x00000000UL)        /*!< Factory trimming */
+#define DAC_TRIMMING_USER           (0x00000001UL)        /*!< User trimming */
+/**
+  * @}
+  */
+
+/** @defgroup DAC_SampleAndHold DAC power mode
+  * @{
+  */
+#define DAC_SAMPLEANDHOLD_DISABLE     (0x00000000UL)
+#define DAC_SAMPLEANDHOLD_ENABLE      (DAC_MCR_MODE1_2)
+
+/**
+  * @}
+  */
+/**
+  * @}
+  */
+
+/* Exported macro ------------------------------------------------------------*/
+
+/** @defgroup DAC_Exported_Macros DAC Exported Macros
+  * @{
+  */
+
+/** @brief Reset DAC handle state.
+  * @param  __HANDLE__ specifies the DAC handle.
+  * @retval None
+  */
+#if (USE_HAL_DAC_REGISTER_CALLBACKS == 1)
+#define __HAL_DAC_RESET_HANDLE_STATE(__HANDLE__) do {                                                        \
+                                                      (__HANDLE__)->State             = HAL_DAC_STATE_RESET; \
+                                                      (__HANDLE__)->MspInitCallback   = NULL;                \
+                                                      (__HANDLE__)->MspDeInitCallback = NULL;                \
+                                                     } while(0)
+#else
+#define __HAL_DAC_RESET_HANDLE_STATE(__HANDLE__) ((__HANDLE__)->State = HAL_DAC_STATE_RESET)
+#endif /* USE_HAL_DAC_REGISTER_CALLBACKS */
+
+/** @brief Enable the DAC channel.
+  * @param  __HANDLE__ specifies the DAC handle.
+  * @param  __DAC_Channel__ specifies the DAC channel
+  * @retval None
+  */
+#define __HAL_DAC_ENABLE(__HANDLE__, __DAC_Channel__) \
+  ((__HANDLE__)->Instance->CR |=  (DAC_CR_EN1 << ((__DAC_Channel__) & 0x10UL)))
+
+/** @brief Disable the DAC channel.
+  * @param  __HANDLE__ specifies the DAC handle
+  * @param  __DAC_Channel__ specifies the DAC channel.
+  * @retval None
+  */
+#define __HAL_DAC_DISABLE(__HANDLE__, __DAC_Channel__) \
+  ((__HANDLE__)->Instance->CR &=  ~(DAC_CR_EN1 << ((__DAC_Channel__) & 0x10UL)))
+
+/** @brief Set DHR12R1 alignment.
+  * @param  __ALIGNMENT__ specifies the DAC alignment
+  * @retval None
+  */
+#define DAC_DHR12R1_ALIGNMENT(__ALIGNMENT__) (0x00000008UL + (__ALIGNMENT__))
+
+
+/** @brief  Set DHR12R2 alignment.
+  * @param  __ALIGNMENT__ specifies the DAC alignment
+  * @retval None
+  */
+#define DAC_DHR12R2_ALIGNMENT(__ALIGNMENT__) (0x00000014UL + (__ALIGNMENT__))
+
+
+/** @brief  Set DHR12RD alignment.
+  * @param  __ALIGNMENT__ specifies the DAC alignment
+  * @retval None
+  */
+#define DAC_DHR12RD_ALIGNMENT(__ALIGNMENT__) (0x00000020UL + (__ALIGNMENT__))
+
+/** @brief Enable the DAC interrupt.
+  * @param  __HANDLE__ specifies the DAC handle
+  * @param  __INTERRUPT__ specifies the DAC interrupt.
+  *          This parameter can be any combination of the following values:
+  *            @arg DAC_IT_DMAUDR1 DAC channel 1 DMA underrun interrupt
+  *            @arg DAC_IT_DMAUDR2 DAC channel 2 DMA underrun interrupt
+  * @retval None
+  */
+#define __HAL_DAC_ENABLE_IT(__HANDLE__, __INTERRUPT__) (((__HANDLE__)->Instance->CR) |= (__INTERRUPT__))
+
+/** @brief Disable the DAC interrupt.
+  * @param  __HANDLE__ specifies the DAC handle
+  * @param  __INTERRUPT__ specifies the DAC interrupt.
+  *          This parameter can be any combination of the following values:
+  *            @arg DAC_IT_DMAUDR1 DAC channel 1 DMA underrun interrupt
+  *            @arg DAC_IT_DMAUDR2 DAC channel 2 DMA underrun interrupt
+  * @retval None
+  */
+#define __HAL_DAC_DISABLE_IT(__HANDLE__, __INTERRUPT__) (((__HANDLE__)->Instance->CR) &= ~(__INTERRUPT__))
+
+/** @brief  Check whether the specified DAC interrupt source is enabled or not.
+  * @param __HANDLE__ DAC handle
+  * @param __INTERRUPT__ DAC interrupt source to check
+  *          This parameter can be any combination of the following values:
+  *            @arg DAC_IT_DMAUDR1 DAC channel 1 DMA underrun interrupt
+  *            @arg DAC_IT_DMAUDR2 DAC channel 2 DMA underrun interrupt
+  * @retval State of interruption (SET or RESET)
+  */
+#define __HAL_DAC_GET_IT_SOURCE(__HANDLE__, __INTERRUPT__) (((__HANDLE__)->Instance->CR\
+                                                             & (__INTERRUPT__)) == (__INTERRUPT__))
+
+/** @brief  Get the selected DAC's flag status.
+  * @param  __HANDLE__ specifies the DAC handle.
+  * @param  __FLAG__ specifies the DAC flag to get.
+  *          This parameter can be any combination of the following values:
+  *            @arg DAC_FLAG_DMAUDR1 DAC channel 1 DMA underrun flag
+  *            @arg DAC_FLAG_DMAUDR2 DAC channel 2 DMA underrun flag
+  * @retval None
+  */
+#define __HAL_DAC_GET_FLAG(__HANDLE__, __FLAG__) ((((__HANDLE__)->Instance->SR) & (__FLAG__)) == (__FLAG__))
+
+/** @brief  Clear the DAC's flag.
+  * @param  __HANDLE__ specifies the DAC handle.
+  * @param  __FLAG__ specifies the DAC flag to clear.
+  *          This parameter can be any combination of the following values:
+  *            @arg DAC_FLAG_DMAUDR1 DAC channel 1 DMA underrun flag
+  *            @arg DAC_FLAG_DMAUDR2 DAC channel 2 DMA underrun flag
+  * @retval None
+  */
+#define __HAL_DAC_CLEAR_FLAG(__HANDLE__, __FLAG__) (((__HANDLE__)->Instance->SR) = (__FLAG__))
+
+/**
+  * @}
+  */
+
+/* Private macro -------------------------------------------------------------*/
+
+/** @defgroup DAC_Private_Macros DAC Private Macros
+  * @{
+  */
+#define IS_DAC_OUTPUT_BUFFER_STATE(STATE) (((STATE) == DAC_OUTPUTBUFFER_ENABLE) || \
+                                           ((STATE) == DAC_OUTPUTBUFFER_DISABLE))
+
+#define IS_DAC_CHANNEL(CHANNEL) (((CHANNEL) == DAC_CHANNEL_1) || \
+                                 ((CHANNEL) == DAC_CHANNEL_2))
+
+#define IS_DAC_ALIGN(ALIGN) (((ALIGN) == DAC_ALIGN_12B_R) || \
+                             ((ALIGN) == DAC_ALIGN_12B_L) || \
+                             ((ALIGN) == DAC_ALIGN_8B_R))
+
+#define IS_DAC_DATA(DATA) ((DATA) <= 0xFFF0UL)
+
+#define IS_DAC_REFRESHTIME(TIME)   ((TIME) <= 0x000000FFUL)
+
+/**
+  * @}
+  */
+
+/* Include DAC HAL Extended module */
+#include "stm32h7xx_hal_dac_ex.h"
+
+/* Exported functions --------------------------------------------------------*/
+
+/** @addtogroup DAC_Exported_Functions
+  * @{
+  */
+
+/** @addtogroup DAC_Exported_Functions_Group1
+  * @{
+  */
+/* Initialization and de-initialization functions *****************************/
+HAL_StatusTypeDef HAL_DAC_Init(DAC_HandleTypeDef *hdac);
+HAL_StatusTypeDef HAL_DAC_DeInit(DAC_HandleTypeDef *hdac);
+void HAL_DAC_MspInit(DAC_HandleTypeDef *hdac);
+void HAL_DAC_MspDeInit(DAC_HandleTypeDef *hdac);
+
+/**
+  * @}
+  */
+
+/** @addtogroup DAC_Exported_Functions_Group2
+  * @{
+  */
+/* IO operation functions *****************************************************/
+HAL_StatusTypeDef HAL_DAC_Start(DAC_HandleTypeDef *hdac, uint32_t Channel);
+HAL_StatusTypeDef HAL_DAC_Stop(DAC_HandleTypeDef *hdac, uint32_t Channel);
+HAL_StatusTypeDef HAL_DAC_Start_DMA(DAC_HandleTypeDef *hdac, uint32_t Channel, const uint32_t *pData, uint32_t Length,
+                                    uint32_t Alignment);
+HAL_StatusTypeDef HAL_DAC_Stop_DMA(DAC_HandleTypeDef *hdac, uint32_t Channel);
+void HAL_DAC_IRQHandler(DAC_HandleTypeDef *hdac);
+HAL_StatusTypeDef HAL_DAC_SetValue(DAC_HandleTypeDef *hdac, uint32_t Channel, uint32_t Alignment, uint32_t Data);
+
+void HAL_DAC_ConvCpltCallbackCh1(DAC_HandleTypeDef *hdac);
+void HAL_DAC_ConvHalfCpltCallbackCh1(DAC_HandleTypeDef *hdac);
+void HAL_DAC_ErrorCallbackCh1(DAC_HandleTypeDef *hdac);
+void HAL_DAC_DMAUnderrunCallbackCh1(DAC_HandleTypeDef *hdac);
+
+#if (USE_HAL_DAC_REGISTER_CALLBACKS == 1)
+/* DAC callback registering/unregistering */
+HAL_StatusTypeDef     HAL_DAC_RegisterCallback(DAC_HandleTypeDef *hdac, HAL_DAC_CallbackIDTypeDef CallbackID,
+                                               pDAC_CallbackTypeDef pCallback);
+HAL_StatusTypeDef     HAL_DAC_UnRegisterCallback(DAC_HandleTypeDef *hdac, HAL_DAC_CallbackIDTypeDef CallbackID);
+#endif /* USE_HAL_DAC_REGISTER_CALLBACKS */
+
+/**
+  * @}
+  */
+
+/** @addtogroup DAC_Exported_Functions_Group3
+  * @{
+  */
+/* Peripheral Control functions ***********************************************/
+uint32_t HAL_DAC_GetValue(const DAC_HandleTypeDef *hdac, uint32_t Channel);
+HAL_StatusTypeDef HAL_DAC_ConfigChannel(DAC_HandleTypeDef *hdac,
+                                        const DAC_ChannelConfTypeDef *sConfig, uint32_t Channel);
+/**
+  * @}
+  */
+
+/** @addtogroup DAC_Exported_Functions_Group4
+  * @{
+  */
+/* Peripheral State and Error functions ***************************************/
+HAL_DAC_StateTypeDef HAL_DAC_GetState(const DAC_HandleTypeDef *hdac);
+uint32_t HAL_DAC_GetError(const DAC_HandleTypeDef *hdac);
+
+/**
+  * @}
+  */
+
+/**
+  * @}
+  */
+
+/** @defgroup DAC_Private_Functions DAC Private Functions
+  * @{
+  */
+void DAC_DMAConvCpltCh1(DMA_HandleTypeDef *hdma);
+void DAC_DMAErrorCh1(DMA_HandleTypeDef *hdma);
+void DAC_DMAHalfConvCpltCh1(DMA_HandleTypeDef *hdma);
+/**
+  * @}
+  */
+
+/**
+  * @}
+  */
+
+#endif /* DAC1 || DAC2 */
+
+/**
+  * @}
+  */
+
+#ifdef __cplusplus
+}
+#endif
+
+
+#endif /* STM32H7xx_HAL_DAC_H */

+ 271 - 0
OZE_Sensor/Drivers/STM32H7xx_HAL_Driver/Inc/stm32h7xx_hal_dac_ex.h

@@ -0,0 +1,271 @@
+/**
+  ******************************************************************************
+  * @file    stm32h7xx_hal_dac_ex.h
+  * @author  MCD Application Team
+  * @brief   Header file of DAC HAL Extended module.
+  ******************************************************************************
+  * @attention
+  *
+  * Copyright (c) 2017 STMicroelectronics.
+  * All rights reserved.
+  *
+  * This software is licensed under terms that can be found in the LICENSE file
+  * in the root directory of this software component.
+  * If no LICENSE file comes with this software, it is provided AS-IS.
+  *
+  ******************************************************************************
+  */
+
+/* Define to prevent recursive inclusion -------------------------------------*/
+#ifndef STM32H7xx_HAL_DAC_EX_H
+#define STM32H7xx_HAL_DAC_EX_H
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/** @addtogroup STM32H7xx_HAL_Driver
+  * @{
+  */
+
+/* Includes ------------------------------------------------------------------*/
+#include "stm32h7xx_hal_def.h"
+
+#if defined(DAC1) || defined(DAC2)
+
+/** @addtogroup DACEx
+  * @{
+  */
+
+/* Exported types ------------------------------------------------------------*/
+
+/**
+  * @brief  HAL State structures definition
+  */
+
+/* Exported constants --------------------------------------------------------*/
+
+/** @defgroup DACEx_Exported_Constants DACEx Exported Constants
+  * @{
+  */
+
+/** @defgroup DACEx_lfsrunmask_triangleamplitude DACEx lfsrunmask triangle amplitude
+  * @{
+  */
+#define DAC_LFSRUNMASK_BIT0                0x00000000UL                                                        /*!< Unmask DAC channel LFSR bit0 for noise wave generation */
+#define DAC_LFSRUNMASK_BITS1_0             (                                                   DAC_CR_MAMP1_0) /*!< Unmask DAC channel LFSR bit[1:0] for noise wave generation */
+#define DAC_LFSRUNMASK_BITS2_0             (                                  DAC_CR_MAMP1_1                 ) /*!< Unmask DAC channel LFSR bit[2:0] for noise wave generation */
+#define DAC_LFSRUNMASK_BITS3_0             (                                  DAC_CR_MAMP1_1 | DAC_CR_MAMP1_0) /*!< Unmask DAC channel LFSR bit[3:0] for noise wave generation */
+#define DAC_LFSRUNMASK_BITS4_0             (                 DAC_CR_MAMP1_2                                  ) /*!< Unmask DAC channel LFSR bit[4:0] for noise wave generation */
+#define DAC_LFSRUNMASK_BITS5_0             (                 DAC_CR_MAMP1_2                  | DAC_CR_MAMP1_0) /*!< Unmask DAC channel LFSR bit[5:0] for noise wave generation */
+#define DAC_LFSRUNMASK_BITS6_0             (                 DAC_CR_MAMP1_2 | DAC_CR_MAMP1_1                 ) /*!< Unmask DAC channel LFSR bit[6:0] for noise wave generation */
+#define DAC_LFSRUNMASK_BITS7_0             (                 DAC_CR_MAMP1_2 | DAC_CR_MAMP1_1 | DAC_CR_MAMP1_0) /*!< Unmask DAC channel LFSR bit[7:0] for noise wave generation */
+#define DAC_LFSRUNMASK_BITS8_0             (DAC_CR_MAMP1_3                                                   ) /*!< Unmask DAC channel LFSR bit[8:0] for noise wave generation */
+#define DAC_LFSRUNMASK_BITS9_0             (DAC_CR_MAMP1_3                                   | DAC_CR_MAMP1_0) /*!< Unmask DAC channel LFSR bit[9:0] for noise wave generation */
+#define DAC_LFSRUNMASK_BITS10_0            (DAC_CR_MAMP1_3                  | DAC_CR_MAMP1_1                 ) /*!< Unmask DAC channel LFSR bit[10:0] for noise wave generation */
+#define DAC_LFSRUNMASK_BITS11_0            (DAC_CR_MAMP1_3                  | DAC_CR_MAMP1_1 | DAC_CR_MAMP1_0) /*!< Unmask DAC channel LFSR bit[11:0] for noise wave generation */
+#define DAC_TRIANGLEAMPLITUDE_1            0x00000000UL                                                        /*!< Select max triangle amplitude of 1 */
+#define DAC_TRIANGLEAMPLITUDE_3            (                                                   DAC_CR_MAMP1_0) /*!< Select max triangle amplitude of 3 */
+#define DAC_TRIANGLEAMPLITUDE_7            (                                  DAC_CR_MAMP1_1                 ) /*!< Select max triangle amplitude of 7 */
+#define DAC_TRIANGLEAMPLITUDE_15           (                                  DAC_CR_MAMP1_1 | DAC_CR_MAMP1_0) /*!< Select max triangle amplitude of 15 */
+#define DAC_TRIANGLEAMPLITUDE_31           (                 DAC_CR_MAMP1_2                                  ) /*!< Select max triangle amplitude of 31 */
+#define DAC_TRIANGLEAMPLITUDE_63           (                 DAC_CR_MAMP1_2                  | DAC_CR_MAMP1_0) /*!< Select max triangle amplitude of 63 */
+#define DAC_TRIANGLEAMPLITUDE_127          (                 DAC_CR_MAMP1_2 | DAC_CR_MAMP1_1                 ) /*!< Select max triangle amplitude of 127 */
+#define DAC_TRIANGLEAMPLITUDE_255          (                 DAC_CR_MAMP1_2 | DAC_CR_MAMP1_1 | DAC_CR_MAMP1_0) /*!< Select max triangle amplitude of 255 */
+#define DAC_TRIANGLEAMPLITUDE_511          (DAC_CR_MAMP1_3                                                   ) /*!< Select max triangle amplitude of 511 */
+#define DAC_TRIANGLEAMPLITUDE_1023         (DAC_CR_MAMP1_3                                   | DAC_CR_MAMP1_0) /*!< Select max triangle amplitude of 1023 */
+#define DAC_TRIANGLEAMPLITUDE_2047         (DAC_CR_MAMP1_3                  | DAC_CR_MAMP1_1                 ) /*!< Select max triangle amplitude of 2047 */
+#define DAC_TRIANGLEAMPLITUDE_4095         (DAC_CR_MAMP1_3                  | DAC_CR_MAMP1_1 | DAC_CR_MAMP1_0) /*!< Select max triangle amplitude of 4095 */
+
+/**
+  * @}
+  */
+
+
+/**
+  * @}
+  */
+
+/* Exported macro ------------------------------------------------------------*/
+
+
+/* Private macro -------------------------------------------------------------*/
+
+/** @defgroup DACEx_Private_Macros DACEx Private Macros
+  * @{
+  */
+#if defined(HRTIM1)
+#define IS_DAC_TRIGGER(TRIGGER) (((TRIGGER) == DAC_TRIGGER_NONE)       || \
+                                 ((TRIGGER) == DAC_TRIGGER_T1_TRGO)    || \
+                                 ((TRIGGER) == DAC_TRIGGER_T2_TRGO)    || \
+                                 ((TRIGGER) == DAC_TRIGGER_T4_TRGO)    || \
+                                 ((TRIGGER) == DAC_TRIGGER_T5_TRGO)    || \
+                                 ((TRIGGER) == DAC_TRIGGER_T6_TRGO)    || \
+                                 ((TRIGGER) == DAC_TRIGGER_T7_TRGO)    || \
+                                 ((TRIGGER) == DAC_TRIGGER_T8_TRGO)    || \
+                                 ((TRIGGER) == DAC_TRIGGER_T15_TRGO)   || \
+                                 ((TRIGGER) == DAC_TRIGGER_HR1_TRGO1)  || \
+                                 ((TRIGGER) == DAC_TRIGGER_HR1_TRGO2)  || \
+                                 ((TRIGGER) == DAC_TRIGGER_LPTIM1_OUT) || \
+                                 ((TRIGGER) == DAC_TRIGGER_LPTIM2_OUT) || \
+                                 ((TRIGGER) == DAC_TRIGGER_EXT_IT9)    || \
+                                 ((TRIGGER) == DAC_TRIGGER_SOFTWARE))
+#elif defined(DAC2)
+#define IS_DAC_TRIGGER(TRIGGER) (((TRIGGER) == DAC_TRIGGER_NONE)       || \
+                                 ((TRIGGER) == DAC_TRIGGER_T1_TRGO)    || \
+                                 ((TRIGGER) == DAC_TRIGGER_T2_TRGO)    || \
+                                 ((TRIGGER) == DAC_TRIGGER_T4_TRGO)    || \
+                                 ((TRIGGER) == DAC_TRIGGER_T5_TRGO)    || \
+                                 ((TRIGGER) == DAC_TRIGGER_T6_TRGO)    || \
+                                 ((TRIGGER) == DAC_TRIGGER_T7_TRGO)    || \
+                                 ((TRIGGER) == DAC_TRIGGER_T8_TRGO)    || \
+                                 ((TRIGGER) == DAC_TRIGGER_T15_TRGO)   || \
+                                 ((TRIGGER) == DAC_TRIGGER_LPTIM1_OUT) || \
+                                 ((TRIGGER) == DAC_TRIGGER_LPTIM2_OUT) || \
+                                 ((TRIGGER) == DAC_TRIGGER_EXT_IT9)    || \
+                                 ((TRIGGER) == DAC_TRIGGER_LPTIM3_OUT) || \
+                                 ((TRIGGER) == DAC_TRIGGER_SOFTWARE))
+#else
+#define IS_DAC_TRIGGER(TRIGGER) (((TRIGGER) == DAC_TRIGGER_NONE)       || \
+                                 ((TRIGGER) == DAC_TRIGGER_T1_TRGO)    || \
+                                 ((TRIGGER) == DAC_TRIGGER_T2_TRGO)    || \
+                                 ((TRIGGER) == DAC_TRIGGER_T4_TRGO)    || \
+                                 ((TRIGGER) == DAC_TRIGGER_T5_TRGO)    || \
+                                 ((TRIGGER) == DAC_TRIGGER_T6_TRGO)    || \
+                                 ((TRIGGER) == DAC_TRIGGER_T7_TRGO)    || \
+                                 ((TRIGGER) == DAC_TRIGGER_T8_TRGO)    || \
+                                 ((TRIGGER) == DAC_TRIGGER_T15_TRGO)   || \
+                                 ((TRIGGER) == DAC_TRIGGER_LPTIM1_OUT) || \
+                                 ((TRIGGER) == DAC_TRIGGER_LPTIM2_OUT) || \
+                                 ((TRIGGER) == DAC_TRIGGER_EXT_IT9)    || \
+                                 ((TRIGGER) == DAC_TRIGGER_T23_TRGO)   || \
+                                 ((TRIGGER) == DAC_TRIGGER_T24_TRGO)   || \
+                                 ((TRIGGER) == DAC_TRIGGER_SOFTWARE))
+#endif /* HRTIM1 */
+
+#define IS_DAC_SAMPLETIME(TIME) ((TIME) <= 0x000003FFU)
+
+#define IS_DAC_HOLDTIME(TIME)   ((TIME) <= 0x000003FFU)
+
+#define IS_DAC_SAMPLEANDHOLD(MODE) (((MODE) == DAC_SAMPLEANDHOLD_DISABLE) || \
+                                    ((MODE) == DAC_SAMPLEANDHOLD_ENABLE))
+
+#define IS_DAC_TRIMMINGVALUE(TRIMMINGVALUE) ((TRIMMINGVALUE) <= 0x1FU)
+
+#define IS_DAC_NEWTRIMMINGVALUE(TRIMMINGVALUE) ((TRIMMINGVALUE) <= 0x1FU)
+
+#define IS_DAC_CHIP_CONNECTION(CONNECT) (((CONNECT) == DAC_CHIPCONNECT_EXTERNAL) || \
+                                         ((CONNECT) == DAC_CHIPCONNECT_INTERNAL) || \
+                                         ((CONNECT) == DAC_CHIPCONNECT_BOTH))
+
+#define IS_DAC_TRIMMING(TRIMMING) (((TRIMMING) == DAC_TRIMMING_FACTORY) || \
+                                   ((TRIMMING) == DAC_TRIMMING_USER))
+
+#define IS_DAC_LFSR_UNMASK_TRIANGLE_AMPLITUDE(VALUE) (((VALUE) == DAC_LFSRUNMASK_BIT0) || \
+                                                      ((VALUE) == DAC_LFSRUNMASK_BITS1_0) || \
+                                                      ((VALUE) == DAC_LFSRUNMASK_BITS2_0) || \
+                                                      ((VALUE) == DAC_LFSRUNMASK_BITS3_0) || \
+                                                      ((VALUE) == DAC_LFSRUNMASK_BITS4_0) || \
+                                                      ((VALUE) == DAC_LFSRUNMASK_BITS5_0) || \
+                                                      ((VALUE) == DAC_LFSRUNMASK_BITS6_0) || \
+                                                      ((VALUE) == DAC_LFSRUNMASK_BITS7_0) || \
+                                                      ((VALUE) == DAC_LFSRUNMASK_BITS8_0) || \
+                                                      ((VALUE) == DAC_LFSRUNMASK_BITS9_0) || \
+                                                      ((VALUE) == DAC_LFSRUNMASK_BITS10_0) || \
+                                                      ((VALUE) == DAC_LFSRUNMASK_BITS11_0) || \
+                                                      ((VALUE) == DAC_TRIANGLEAMPLITUDE_1) || \
+                                                      ((VALUE) == DAC_TRIANGLEAMPLITUDE_3) || \
+                                                      ((VALUE) == DAC_TRIANGLEAMPLITUDE_7) || \
+                                                      ((VALUE) == DAC_TRIANGLEAMPLITUDE_15) || \
+                                                      ((VALUE) == DAC_TRIANGLEAMPLITUDE_31) || \
+                                                      ((VALUE) == DAC_TRIANGLEAMPLITUDE_63) || \
+                                                      ((VALUE) == DAC_TRIANGLEAMPLITUDE_127) || \
+                                                      ((VALUE) == DAC_TRIANGLEAMPLITUDE_255) || \
+                                                      ((VALUE) == DAC_TRIANGLEAMPLITUDE_511) || \
+                                                      ((VALUE) == DAC_TRIANGLEAMPLITUDE_1023) || \
+                                                      ((VALUE) == DAC_TRIANGLEAMPLITUDE_2047) || \
+                                                      ((VALUE) == DAC_TRIANGLEAMPLITUDE_4095))
+/**
+  * @}
+  */
+
+/* Exported functions --------------------------------------------------------*/
+/* Extended features functions ***********************************************/
+
+/** @addtogroup DACEx_Exported_Functions
+  * @{
+  */
+
+/** @addtogroup DACEx_Exported_Functions_Group2
+  * @{
+  */
+/* IO operation functions *****************************************************/
+
+HAL_StatusTypeDef HAL_DACEx_TriangleWaveGenerate(DAC_HandleTypeDef *hdac, uint32_t Channel, uint32_t Amplitude);
+HAL_StatusTypeDef HAL_DACEx_NoiseWaveGenerate(DAC_HandleTypeDef *hdac, uint32_t Channel, uint32_t Amplitude);
+
+HAL_StatusTypeDef HAL_DACEx_DualStart(DAC_HandleTypeDef *hdac);
+HAL_StatusTypeDef HAL_DACEx_DualStop(DAC_HandleTypeDef *hdac);
+HAL_StatusTypeDef HAL_DACEx_DualStart_DMA(DAC_HandleTypeDef *hdac, uint32_t Channel,
+                                          const uint32_t *pData, uint32_t Length, uint32_t Alignment);
+HAL_StatusTypeDef HAL_DACEx_DualStop_DMA(DAC_HandleTypeDef *hdac, uint32_t Channel);
+HAL_StatusTypeDef HAL_DACEx_DualSetValue(DAC_HandleTypeDef *hdac, uint32_t Alignment, uint32_t Data1, uint32_t Data2);
+uint32_t HAL_DACEx_DualGetValue(const DAC_HandleTypeDef *hdac);
+
+void HAL_DACEx_ConvCpltCallbackCh2(DAC_HandleTypeDef *hdac);
+void HAL_DACEx_ConvHalfCpltCallbackCh2(DAC_HandleTypeDef *hdac);
+void HAL_DACEx_ErrorCallbackCh2(DAC_HandleTypeDef *hdac);
+void HAL_DACEx_DMAUnderrunCallbackCh2(DAC_HandleTypeDef *hdac);
+
+
+/**
+  * @}
+  */
+
+/** @addtogroup DACEx_Exported_Functions_Group3
+  * @{
+  */
+/* Peripheral Control functions ***********************************************/
+
+HAL_StatusTypeDef HAL_DACEx_SelfCalibrate(DAC_HandleTypeDef *hdac, DAC_ChannelConfTypeDef *sConfig, uint32_t Channel);
+HAL_StatusTypeDef HAL_DACEx_SetUserTrimming(DAC_HandleTypeDef *hdac, DAC_ChannelConfTypeDef *sConfig, uint32_t Channel,
+                                            uint32_t NewTrimmingValue);
+uint32_t HAL_DACEx_GetTrimOffset(const DAC_HandleTypeDef *hdac, uint32_t Channel);
+
+/**
+  * @}
+  */
+
+/**
+  * @}
+  */
+
+/** @addtogroup DACEx_Private_Functions
+  * @{
+  */
+
+/* DAC_DMAConvCpltCh2 / DAC_DMAErrorCh2 / DAC_DMAHalfConvCpltCh2 */
+/* are called by HAL_DAC_Start_DMA */
+void DAC_DMAConvCpltCh2(DMA_HandleTypeDef *hdma);
+void DAC_DMAErrorCh2(DMA_HandleTypeDef *hdma);
+void DAC_DMAHalfConvCpltCh2(DMA_HandleTypeDef *hdma);
+
+/**
+  * @}
+  */
+
+/**
+  * @}
+  */
+
+#endif /* DAC1 || DAC2 */
+
+/**
+  * @}
+  */
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* STM32H7xx_HAL_DAC_EX_H */

Файловите разлики са ограничени, защото са твърде много
+ 1864 - 0
OZE_Sensor/Drivers/STM32H7xx_HAL_Driver/Inc/stm32h7xx_ll_dac.h


Файловите разлики са ограничени, защото са твърде много
+ 1591 - 0
OZE_Sensor/Drivers/STM32H7xx_HAL_Driver/Src/stm32h7xx_hal_dac.c


+ 927 - 0
OZE_Sensor/Drivers/STM32H7xx_HAL_Driver/Src/stm32h7xx_hal_dac_ex.c

@@ -0,0 +1,927 @@
+/**
+  ******************************************************************************
+  * @file    stm32h7xx_hal_dac_ex.c
+  * @author  MCD Application Team
+  * @brief   Extended DAC HAL module driver.
+  *          This file provides firmware functions to manage the extended
+  *          functionalities of the DAC peripheral.
+  *
+  *
+  ******************************************************************************
+  * @attention
+  *
+  * Copyright (c) 2017 STMicroelectronics.
+  * All rights reserved.
+  *
+  * This software is licensed under terms that can be found in the LICENSE file
+  * in the root directory of this software component.
+  * If no LICENSE file comes with this software, it is provided AS-IS.
+  *
+  ******************************************************************************
+  @verbatim
+  ==============================================================================
+                      ##### How to use this driver #####
+  ==============================================================================
+    [..]
+     *** Dual mode IO operation ***
+     ==============================
+     [..]
+      (+) Use HAL_DACEx_DualStart() to enable both channel and start conversion
+          for dual mode operation.
+          If software trigger is selected, using HAL_DACEx_DualStart() will start
+          the conversion of the value previously set by HAL_DACEx_DualSetValue().
+      (+) Use HAL_DACEx_DualStop() to disable both channel and stop conversion
+          for dual mode operation.
+      (+) Use HAL_DACEx_DualStart_DMA() to enable both channel and start conversion
+          for dual mode operation using DMA to feed DAC converters.
+          First issued trigger will start the conversion of the value previously
+          set by HAL_DACEx_DualSetValue().
+          The same callbacks that are used in single mode are called in dual mode to notify
+          transfer completion (half complete or complete), errors or underrun.
+      (+) Use HAL_DACEx_DualStop_DMA() to disable both channel and stop conversion
+          for dual mode operation using DMA to feed DAC converters.
+      (+) When Dual mode is enabled (i.e. DAC Channel1 and Channel2 are used simultaneously) :
+          Use HAL_DACEx_DualGetValue() to get digital data to be converted and use
+          HAL_DACEx_DualSetValue() to set digital value to converted simultaneously in
+          Channel 1 and Channel 2.
+     *** Signal generation operation ***
+     ===================================
+     [..]
+      (+) Use HAL_DACEx_TriangleWaveGenerate() to generate Triangle signal.
+      (+) Use HAL_DACEx_NoiseWaveGenerate() to generate Noise signal.
+
+      (+) HAL_DACEx_SelfCalibrate to calibrate one DAC channel.
+      (+) HAL_DACEx_SetUserTrimming to set user trimming value.
+      (+) HAL_DACEx_GetTrimOffset to retrieve trimming value (factory setting
+          after reset, user setting if HAL_DACEx_SetUserTrimming have been used
+          at least one time after reset).
+
+ @endverbatim
+  ******************************************************************************
+  */
+
+
+/* Includes ------------------------------------------------------------------*/
+#include "stm32h7xx_hal.h"
+
+/** @addtogroup STM32H7xx_HAL_Driver
+  * @{
+  */
+
+#ifdef HAL_DAC_MODULE_ENABLED
+
+#if defined(DAC1) || defined(DAC2)
+
+/** @defgroup DACEx DACEx
+  * @brief DAC Extended HAL module driver
+  * @{
+  */
+
+/* Private typedef -----------------------------------------------------------*/
+/* Private define ------------------------------------------------------------*/
+
+/* Delay for DAC minimum trimming time.                                       */
+/* Note: minimum time needed between two calibration steps                    */
+/*       The delay below is specified under conditions:                       */
+/*        - DAC channel output buffer enabled                                 */
+/* Literal set to maximum value (refer to device datasheet,                   */
+/* electrical characteristics, parameter "tTRIM").                            */
+/* Unit: us                                                                   */
+#define DAC_DELAY_TRIM_US          (50UL)     /*!< Delay for DAC minimum trimming time */
+
+/* Private macro -------------------------------------------------------------*/
+/* Private variables ---------------------------------------------------------*/
+/* Private function prototypes -----------------------------------------------*/
+/* Exported functions --------------------------------------------------------*/
+
+/** @defgroup DACEx_Exported_Functions DACEx Exported Functions
+  * @{
+  */
+
+/** @defgroup DACEx_Exported_Functions_Group2 IO operation functions
+  *  @brief    Extended IO operation functions
+  *
+@verbatim
+  ==============================================================================
+                 ##### Extended features functions #####
+  ==============================================================================
+    [..]  This section provides functions allowing to:
+      (+) Start conversion.
+      (+) Stop conversion.
+      (+) Start conversion and enable DMA transfer.
+      (+) Stop conversion and disable DMA transfer.
+      (+) Get result of conversion.
+      (+) Get result of dual mode conversion.
+
+@endverbatim
+  * @{
+  */
+
+
+/**
+  * @brief  Enables DAC and starts conversion of both channels.
+  * @param  hdac pointer to a DAC_HandleTypeDef structure that contains
+  *         the configuration information for the specified DAC.
+  * @retval HAL status
+  */
+HAL_StatusTypeDef HAL_DACEx_DualStart(DAC_HandleTypeDef *hdac)
+{
+  uint32_t tmp_swtrig = 0UL;
+
+  /* Check the DAC peripheral handle */
+  if (hdac == NULL)
+  {
+    return HAL_ERROR;
+  }
+
+
+  /* Process locked */
+  __HAL_LOCK(hdac);
+
+  /* Change DAC state */
+  hdac->State = HAL_DAC_STATE_BUSY;
+
+  /* Enable the Peripheral */
+  __HAL_DAC_ENABLE(hdac, DAC_CHANNEL_1);
+  __HAL_DAC_ENABLE(hdac, DAC_CHANNEL_2);
+
+  /* Check if software trigger enabled */
+  if ((hdac->Instance->CR & (DAC_CR_TEN1 | DAC_CR_TSEL1)) == DAC_TRIGGER_SOFTWARE)
+  {
+    tmp_swtrig |= DAC_SWTRIGR_SWTRIG1;
+  }
+  if ((hdac->Instance->CR & (DAC_CR_TEN2 | DAC_CR_TSEL2)) == (DAC_TRIGGER_SOFTWARE << (DAC_CHANNEL_2 & 0x10UL)))
+  {
+    tmp_swtrig |= DAC_SWTRIGR_SWTRIG2;
+  }
+  /* Enable the selected DAC software conversion*/
+  SET_BIT(hdac->Instance->SWTRIGR, tmp_swtrig);
+
+  /* Change DAC state */
+  hdac->State = HAL_DAC_STATE_READY;
+
+  /* Process unlocked */
+  __HAL_UNLOCK(hdac);
+
+  /* Return function status */
+  return HAL_OK;
+}
+
+/**
+  * @brief  Disables DAC and stop conversion of both channels.
+  * @param  hdac pointer to a DAC_HandleTypeDef structure that contains
+  *         the configuration information for the specified DAC.
+  * @retval HAL status
+  */
+HAL_StatusTypeDef HAL_DACEx_DualStop(DAC_HandleTypeDef *hdac)
+{
+  /* Check the DAC peripheral handle */
+  if (hdac == NULL)
+  {
+    return HAL_ERROR;
+  }
+
+
+  /* Disable the Peripheral */
+  __HAL_DAC_DISABLE(hdac, DAC_CHANNEL_1);
+  __HAL_DAC_DISABLE(hdac, DAC_CHANNEL_2);
+
+  /* Change DAC state */
+  hdac->State = HAL_DAC_STATE_READY;
+
+  /* Return function status */
+  return HAL_OK;
+}
+
+/**
+  * @brief  Enables DAC and starts conversion of both channel 1 and 2 of the same DAC.
+  * @param  hdac pointer to a DAC_HandleTypeDef structure that contains
+  *         the configuration information for the specified DAC.
+  * @param  Channel The DAC channel that will request data from DMA.
+  *          This parameter can be one of the following values:
+  *            @arg DAC_CHANNEL_1: DAC Channel1 selected
+  *            @arg DAC_CHANNEL_2: DAC Channel2 selected
+  * @param  pData The destination peripheral Buffer address.
+  * @param  Length The length of data to be transferred from memory to DAC peripheral
+  * @param  Alignment Specifies the data alignment for DAC channel.
+  *          This parameter can be one of the following values:
+  *            @arg DAC_ALIGN_8B_R: 8bit right data alignment selected
+  *            @arg DAC_ALIGN_12B_L: 12bit left data alignment selected
+  *            @arg DAC_ALIGN_12B_R: 12bit right data alignment selected
+  * @retval HAL status
+  */
+HAL_StatusTypeDef HAL_DACEx_DualStart_DMA(DAC_HandleTypeDef *hdac, uint32_t Channel,
+                                          const uint32_t *pData, uint32_t Length, uint32_t Alignment)
+{
+  HAL_StatusTypeDef status;
+  uint32_t tmpreg = 0UL;
+
+  /* Check the DAC peripheral handle */
+  if (hdac == NULL)
+  {
+    return HAL_ERROR;
+  }
+
+  /* Check the parameters */
+  assert_param(IS_DAC_CHANNEL(Channel));
+  assert_param(IS_DAC_ALIGN(Alignment));
+
+  /* Process locked */
+  __HAL_LOCK(hdac);
+
+  /* Change DAC state */
+  hdac->State = HAL_DAC_STATE_BUSY;
+
+  if (Channel == DAC_CHANNEL_1)
+  {
+    /* Set the DMA transfer complete callback for channel1 */
+    hdac->DMA_Handle1->XferCpltCallback = DAC_DMAConvCpltCh1;
+
+    /* Set the DMA half transfer complete callback for channel1 */
+    hdac->DMA_Handle1->XferHalfCpltCallback = DAC_DMAHalfConvCpltCh1;
+
+    /* Set the DMA error callback for channel1 */
+    hdac->DMA_Handle1->XferErrorCallback = DAC_DMAErrorCh1;
+
+    /* Enable the selected DAC channel1 DMA request */
+    SET_BIT(hdac->Instance->CR, DAC_CR_DMAEN1);
+  }
+  else
+  {
+    /* Set the DMA transfer complete callback for channel2 */
+    hdac->DMA_Handle2->XferCpltCallback = DAC_DMAConvCpltCh2;
+
+    /* Set the DMA half transfer complete callback for channel2 */
+    hdac->DMA_Handle2->XferHalfCpltCallback = DAC_DMAHalfConvCpltCh2;
+
+    /* Set the DMA error callback for channel2 */
+    hdac->DMA_Handle2->XferErrorCallback = DAC_DMAErrorCh2;
+
+    /* Enable the selected DAC channel2 DMA request */
+    SET_BIT(hdac->Instance->CR, DAC_CR_DMAEN2);
+  }
+
+  switch (Alignment)
+  {
+    case DAC_ALIGN_12B_R:
+      /* Get DHR12R1 address */
+      tmpreg = (uint32_t)&hdac->Instance->DHR12RD;
+      break;
+    case DAC_ALIGN_12B_L:
+      /* Get DHR12L1 address */
+      tmpreg = (uint32_t)&hdac->Instance->DHR12LD;
+      break;
+    case DAC_ALIGN_8B_R:
+      /* Get DHR8R1 address */
+      tmpreg = (uint32_t)&hdac->Instance->DHR8RD;
+      break;
+    default:
+      break;
+  }
+
+  /* Enable the DMA channel */
+  if (Channel == DAC_CHANNEL_1)
+  {
+    /* Enable the DAC DMA underrun interrupt */
+    __HAL_DAC_ENABLE_IT(hdac, DAC_IT_DMAUDR1);
+
+    /* Enable the DMA channel */
+    status = HAL_DMA_Start_IT(hdac->DMA_Handle1, (uint32_t)pData, tmpreg, Length);
+  }
+  else
+  {
+    /* Enable the DAC DMA underrun interrupt */
+    __HAL_DAC_ENABLE_IT(hdac, DAC_IT_DMAUDR2);
+
+    /* Enable the DMA channel */
+    status = HAL_DMA_Start_IT(hdac->DMA_Handle2, (uint32_t)pData, tmpreg, Length);
+  }
+
+  /* Process Unlocked */
+  __HAL_UNLOCK(hdac);
+
+  if (status == HAL_OK)
+  {
+    /* Enable the Peripheral */
+    __HAL_DAC_ENABLE(hdac, DAC_CHANNEL_1);
+    __HAL_DAC_ENABLE(hdac, DAC_CHANNEL_2);
+  }
+  else
+  {
+    hdac->ErrorCode |= HAL_DAC_ERROR_DMA;
+  }
+
+  /* Return function status */
+  return status;
+}
+
+/**
+  * @brief  Disables DAC and stop conversion both channel.
+  * @param  hdac pointer to a DAC_HandleTypeDef structure that contains
+  *         the configuration information for the specified DAC.
+  * @param  Channel The DAC channel that requests data from DMA.
+  *          This parameter can be one of the following values:
+  *            @arg DAC_CHANNEL_1: DAC Channel1 selected
+  *            @arg DAC_CHANNEL_2: DAC Channel2 selected
+  * @retval HAL status
+  */
+HAL_StatusTypeDef HAL_DACEx_DualStop_DMA(DAC_HandleTypeDef *hdac, uint32_t Channel)
+{
+  HAL_StatusTypeDef status;
+
+  /* Check the DAC peripheral handle */
+  if (hdac == NULL)
+  {
+    return HAL_ERROR;
+  }
+
+
+  /* Disable the selected DAC channel DMA request */
+  CLEAR_BIT(hdac->Instance->CR, DAC_CR_DMAEN2 | DAC_CR_DMAEN1);
+
+  /* Disable the Peripheral */
+  __HAL_DAC_DISABLE(hdac, DAC_CHANNEL_1);
+  __HAL_DAC_DISABLE(hdac, DAC_CHANNEL_2);
+
+  /* Disable the DMA channel */
+
+  /* Channel1 is used */
+  if (Channel == DAC_CHANNEL_1)
+  {
+    /* Disable the DMA channel */
+    status = HAL_DMA_Abort(hdac->DMA_Handle1);
+
+    /* Disable the DAC DMA underrun interrupt */
+    __HAL_DAC_DISABLE_IT(hdac, DAC_IT_DMAUDR1);
+  }
+  else
+  {
+    /* Disable the DMA channel */
+    status = HAL_DMA_Abort(hdac->DMA_Handle2);
+
+    /* Disable the DAC DMA underrun interrupt */
+    __HAL_DAC_DISABLE_IT(hdac, DAC_IT_DMAUDR2);
+  }
+
+  /* Check if DMA Channel effectively disabled */
+  if (status != HAL_OK)
+  {
+    /* Update DAC state machine to error */
+    hdac->State = HAL_DAC_STATE_ERROR;
+  }
+  else
+  {
+    /* Change DAC state */
+    hdac->State = HAL_DAC_STATE_READY;
+  }
+
+  /* Return function status */
+  return status;
+}
+
+
+/**
+  * @brief  Enable or disable the selected DAC channel wave generation.
+  * @param  hdac pointer to a DAC_HandleTypeDef structure that contains
+  *         the configuration information for the specified DAC.
+  * @param  Channel The selected DAC channel.
+  *          This parameter can be one of the following values:
+  *            @arg DAC_CHANNEL_1: DAC Channel1 selected
+  *            @arg DAC_CHANNEL_2: DAC Channel2 selected
+  * @param  Amplitude Select max triangle amplitude.
+  *          This parameter can be one of the following values:
+  *            @arg DAC_TRIANGLEAMPLITUDE_1: Select max triangle amplitude of 1
+  *            @arg DAC_TRIANGLEAMPLITUDE_3: Select max triangle amplitude of 3
+  *            @arg DAC_TRIANGLEAMPLITUDE_7: Select max triangle amplitude of 7
+  *            @arg DAC_TRIANGLEAMPLITUDE_15: Select max triangle amplitude of 15
+  *            @arg DAC_TRIANGLEAMPLITUDE_31: Select max triangle amplitude of 31
+  *            @arg DAC_TRIANGLEAMPLITUDE_63: Select max triangle amplitude of 63
+  *            @arg DAC_TRIANGLEAMPLITUDE_127: Select max triangle amplitude of 127
+  *            @arg DAC_TRIANGLEAMPLITUDE_255: Select max triangle amplitude of 255
+  *            @arg DAC_TRIANGLEAMPLITUDE_511: Select max triangle amplitude of 511
+  *            @arg DAC_TRIANGLEAMPLITUDE_1023: Select max triangle amplitude of 1023
+  *            @arg DAC_TRIANGLEAMPLITUDE_2047: Select max triangle amplitude of 2047
+  *            @arg DAC_TRIANGLEAMPLITUDE_4095: Select max triangle amplitude of 4095
+  * @retval HAL status
+  */
+HAL_StatusTypeDef HAL_DACEx_TriangleWaveGenerate(DAC_HandleTypeDef *hdac, uint32_t Channel, uint32_t Amplitude)
+{
+  /* Check the DAC peripheral handle */
+  if (hdac == NULL)
+  {
+    return HAL_ERROR;
+  }
+
+  /* Check the parameters */
+  assert_param(IS_DAC_CHANNEL(Channel));
+  assert_param(IS_DAC_LFSR_UNMASK_TRIANGLE_AMPLITUDE(Amplitude));
+
+  /* Process locked */
+  __HAL_LOCK(hdac);
+
+  /* Change DAC state */
+  hdac->State = HAL_DAC_STATE_BUSY;
+
+  /* Enable the triangle wave generation for the selected DAC channel */
+  MODIFY_REG(hdac->Instance->CR, ((DAC_CR_WAVE1) | (DAC_CR_MAMP1)) << (Channel & 0x10UL),
+             (DAC_CR_WAVE1_1 | Amplitude) << (Channel & 0x10UL));
+
+  /* Change DAC state */
+  hdac->State = HAL_DAC_STATE_READY;
+
+  /* Process unlocked */
+  __HAL_UNLOCK(hdac);
+
+  /* Return function status */
+  return HAL_OK;
+}
+
+/**
+  * @brief  Enable or disable the selected DAC channel wave generation.
+  * @param  hdac pointer to a DAC_HandleTypeDef structure that contains
+  *         the configuration information for the specified DAC.
+  * @param  Channel The selected DAC channel.
+  *          This parameter can be one of the following values:
+  *            @arg DAC_CHANNEL_1: DAC Channel1 selected
+  *            @arg DAC_CHANNEL_2: DAC Channel2 selected
+  * @param  Amplitude Unmask DAC channel LFSR for noise wave generation.
+  *          This parameter can be one of the following values:
+  *            @arg DAC_LFSRUNMASK_BIT0: Unmask DAC channel LFSR bit0 for noise wave generation
+  *            @arg DAC_LFSRUNMASK_BITS1_0: Unmask DAC channel LFSR bit[1:0] for noise wave generation
+  *            @arg DAC_LFSRUNMASK_BITS2_0: Unmask DAC channel LFSR bit[2:0] for noise wave generation
+  *            @arg DAC_LFSRUNMASK_BITS3_0: Unmask DAC channel LFSR bit[3:0] for noise wave generation
+  *            @arg DAC_LFSRUNMASK_BITS4_0: Unmask DAC channel LFSR bit[4:0] for noise wave generation
+  *            @arg DAC_LFSRUNMASK_BITS5_0: Unmask DAC channel LFSR bit[5:0] for noise wave generation
+  *            @arg DAC_LFSRUNMASK_BITS6_0: Unmask DAC channel LFSR bit[6:0] for noise wave generation
+  *            @arg DAC_LFSRUNMASK_BITS7_0: Unmask DAC channel LFSR bit[7:0] for noise wave generation
+  *            @arg DAC_LFSRUNMASK_BITS8_0: Unmask DAC channel LFSR bit[8:0] for noise wave generation
+  *            @arg DAC_LFSRUNMASK_BITS9_0: Unmask DAC channel LFSR bit[9:0] for noise wave generation
+  *            @arg DAC_LFSRUNMASK_BITS10_0: Unmask DAC channel LFSR bit[10:0] for noise wave generation
+  *            @arg DAC_LFSRUNMASK_BITS11_0: Unmask DAC channel LFSR bit[11:0] for noise wave generation
+  * @retval HAL status
+  */
+HAL_StatusTypeDef HAL_DACEx_NoiseWaveGenerate(DAC_HandleTypeDef *hdac, uint32_t Channel, uint32_t Amplitude)
+{
+  /* Check the DAC peripheral handle */
+  if (hdac == NULL)
+  {
+    return HAL_ERROR;
+  }
+
+  /* Check the parameters */
+  assert_param(IS_DAC_CHANNEL(Channel));
+  assert_param(IS_DAC_LFSR_UNMASK_TRIANGLE_AMPLITUDE(Amplitude));
+
+  /* Process locked */
+  __HAL_LOCK(hdac);
+
+  /* Change DAC state */
+  hdac->State = HAL_DAC_STATE_BUSY;
+
+  /* Enable the noise wave generation for the selected DAC channel */
+  MODIFY_REG(hdac->Instance->CR, ((DAC_CR_WAVE1) | (DAC_CR_MAMP1)) << (Channel & 0x10UL),
+             (DAC_CR_WAVE1_0 | Amplitude) << (Channel & 0x10UL));
+
+  /* Change DAC state */
+  hdac->State = HAL_DAC_STATE_READY;
+
+  /* Process unlocked */
+  __HAL_UNLOCK(hdac);
+
+  /* Return function status */
+  return HAL_OK;
+}
+
+
+/**
+  * @brief  Set the specified data holding register value for dual DAC channel.
+  * @param  hdac pointer to a DAC_HandleTypeDef structure that contains
+  *               the configuration information for the specified DAC.
+  * @param  Alignment Specifies the data alignment for dual channel DAC.
+  *          This parameter can be one of the following values:
+  *            DAC_ALIGN_8B_R: 8bit right data alignment selected
+  *            DAC_ALIGN_12B_L: 12bit left data alignment selected
+  *            DAC_ALIGN_12B_R: 12bit right data alignment selected
+  * @param  Data1 Data for DAC Channel1 to be loaded in the selected data holding register.
+  * @param  Data2 Data for DAC Channel2 to be loaded in the selected data  holding register.
+  * @note   In dual mode, a unique register access is required to write in both
+  *          DAC channels at the same time.
+  * @retval HAL status
+  */
+HAL_StatusTypeDef HAL_DACEx_DualSetValue(DAC_HandleTypeDef *hdac, uint32_t Alignment, uint32_t Data1, uint32_t Data2)
+{
+  uint32_t data;
+  uint32_t tmp;
+
+  /* Check the DAC peripheral handle */
+  if (hdac == NULL)
+  {
+    return HAL_ERROR;
+  }
+
+  /* Check the parameters */
+  assert_param(IS_DAC_ALIGN(Alignment));
+  assert_param(IS_DAC_DATA(Data1));
+  assert_param(IS_DAC_DATA(Data2));
+
+  /* Calculate and set dual DAC data holding register value */
+  if (Alignment == DAC_ALIGN_8B_R)
+  {
+    data = ((uint32_t)Data2 << 8U) | Data1;
+  }
+  else
+  {
+    data = ((uint32_t)Data2 << 16U) | Data1;
+  }
+
+  tmp = (uint32_t)hdac->Instance;
+  tmp += DAC_DHR12RD_ALIGNMENT(Alignment);
+
+  /* Set the dual DAC selected data holding register */
+  *(__IO uint32_t *)tmp = data;
+
+  /* Return function status */
+  return HAL_OK;
+}
+
+/**
+  * @brief  Conversion complete callback in non-blocking mode for Channel2.
+  * @param  hdac pointer to a DAC_HandleTypeDef structure that contains
+  *         the configuration information for the specified DAC.
+  * @retval None
+  */
+__weak void HAL_DACEx_ConvCpltCallbackCh2(DAC_HandleTypeDef *hdac)
+{
+  /* Prevent unused argument(s) compilation warning */
+  UNUSED(hdac);
+
+  /* NOTE : This function should not be modified, when the callback is needed,
+            the HAL_DACEx_ConvCpltCallbackCh2 could be implemented in the user file
+   */
+}
+
+/**
+  * @brief  Conversion half DMA transfer callback in non-blocking mode for Channel2.
+  * @param  hdac pointer to a DAC_HandleTypeDef structure that contains
+  *         the configuration information for the specified DAC.
+  * @retval None
+  */
+__weak void HAL_DACEx_ConvHalfCpltCallbackCh2(DAC_HandleTypeDef *hdac)
+{
+  /* Prevent unused argument(s) compilation warning */
+  UNUSED(hdac);
+
+  /* NOTE : This function should not be modified, when the callback is needed,
+            the HAL_DACEx_ConvHalfCpltCallbackCh2 could be implemented in the user file
+   */
+}
+
+/**
+  * @brief  Error DAC callback for Channel2.
+  * @param  hdac pointer to a DAC_HandleTypeDef structure that contains
+  *         the configuration information for the specified DAC.
+  * @retval None
+  */
+__weak void HAL_DACEx_ErrorCallbackCh2(DAC_HandleTypeDef *hdac)
+{
+  /* Prevent unused argument(s) compilation warning */
+  UNUSED(hdac);
+
+  /* NOTE : This function should not be modified, when the callback is needed,
+            the HAL_DACEx_ErrorCallbackCh2 could be implemented in the user file
+   */
+}
+
+/**
+  * @brief  DMA underrun DAC callback for Channel2.
+  * @param  hdac pointer to a DAC_HandleTypeDef structure that contains
+  *         the configuration information for the specified DAC.
+  * @retval None
+  */
+__weak void HAL_DACEx_DMAUnderrunCallbackCh2(DAC_HandleTypeDef *hdac)
+{
+  /* Prevent unused argument(s) compilation warning */
+  UNUSED(hdac);
+
+  /* NOTE : This function should not be modified, when the callback is needed,
+            the HAL_DACEx_DMAUnderrunCallbackCh2 could be implemented in the user file
+   */
+}
+
+
+/**
+  * @brief  Run the self calibration of one DAC channel.
+  * @param  hdac pointer to a DAC_HandleTypeDef structure that contains
+  *         the configuration information for the specified DAC.
+  * @param  sConfig DAC channel configuration structure.
+  * @param  Channel The selected DAC channel.
+  *          This parameter can be one of the following values:
+  *            @arg DAC_CHANNEL_1: DAC Channel1 selected
+  *            @arg DAC_CHANNEL_2: DAC Channel2 selected
+  * @retval Updates DAC_TrimmingValue. , DAC_UserTrimming set to DAC_UserTrimming
+  * @retval HAL status
+  * @note   Calibration runs about 7 ms.
+  */
+HAL_StatusTypeDef HAL_DACEx_SelfCalibrate(DAC_HandleTypeDef *hdac, DAC_ChannelConfTypeDef *sConfig, uint32_t Channel)
+{
+  HAL_StatusTypeDef status = HAL_OK;
+
+  uint32_t trimmingvalue;
+  uint32_t delta;
+  __IO uint32_t wait_loop_index;
+
+  /* store/restore channel configuration structure purpose */
+  uint32_t oldmodeconfiguration;
+
+  /* Check the parameters */
+  assert_param(IS_DAC_CHANNEL(Channel));
+
+  /* Check the DAC handle allocation */
+  /* Check if DAC running */
+  if ((hdac == NULL) || (sConfig == NULL))
+  {
+    status = HAL_ERROR;
+  }
+  else if (hdac->State == HAL_DAC_STATE_BUSY)
+  {
+    status = HAL_ERROR;
+  }
+  else
+  {
+    /* Process locked */
+    __HAL_LOCK(hdac);
+
+    /* Store configuration */
+    oldmodeconfiguration = (hdac->Instance->MCR & (DAC_MCR_MODE1 << (Channel & 0x10UL)));
+
+    /* Disable the selected DAC channel */
+    CLEAR_BIT((hdac->Instance->CR), (DAC_CR_EN1 << (Channel & 0x10UL)));
+
+    /* Set mode in MCR  for calibration */
+    MODIFY_REG(hdac->Instance->MCR, (DAC_MCR_MODE1 << (Channel & 0x10UL)), 0U);
+
+    /* Enable the selected DAC channel calibration */
+    /* i.e. set DAC_CR_CENx bit */
+    SET_BIT((hdac->Instance->CR), (DAC_CR_CEN1 << (Channel & 0x10UL)));
+
+    /* Init trimming counter */
+    /* Medium value */
+    trimmingvalue = 16UL;
+    delta = 8UL;
+    while (delta != 0UL)
+    {
+      /* Set candidate trimming */
+      MODIFY_REG(hdac->Instance->CCR, (DAC_CCR_OTRIM1 << (Channel & 0x10UL)), (trimmingvalue << (Channel & 0x10UL)));
+
+      /* Wait minimum time needed between two calibration steps (OTRIM) */
+      /* Wait loop initialization and execution */
+      /* Note: Variable divided by 2 to compensate partially CPU processing cycles, scaling in us split to not exceed */
+      /*       32 bits register capacity and handle low frequency. */
+      wait_loop_index = ((DAC_DELAY_TRIM_US / 10UL) * ((SystemCoreClock / (100000UL * 2UL)) + 1UL));
+      while (wait_loop_index != 0UL)
+      {
+        wait_loop_index--;
+      }
+
+      if ((hdac->Instance->SR & (DAC_SR_CAL_FLAG1 << (Channel & 0x10UL))) == (DAC_SR_CAL_FLAG1 << (Channel & 0x10UL)))
+      {
+        /* DAC_SR_CAL_FLAGx is HIGH try higher trimming */
+        trimmingvalue -= delta;
+      }
+      else
+      {
+        /* DAC_SR_CAL_FLAGx is LOW try lower trimming */
+        trimmingvalue += delta;
+      }
+      delta >>= 1UL;
+    }
+
+    /* Still need to check if right calibration is current value or one step below */
+    /* Indeed the first value that causes the DAC_SR_CAL_FLAGx bit to change from 0 to 1  */
+    /* Set candidate trimming */
+    MODIFY_REG(hdac->Instance->CCR, (DAC_CCR_OTRIM1 << (Channel & 0x10UL)), (trimmingvalue << (Channel & 0x10UL)));
+
+    /* Wait minimum time needed between two calibration steps (OTRIM) */
+    /* Wait loop initialization and execution */
+    /* Note: Variable divided by 2 to compensate partially CPU processing cycles, scaling in us split to not exceed */
+    /*       32 bits register capacity and handle low frequency. */
+    wait_loop_index = ((DAC_DELAY_TRIM_US / 10UL) * ((SystemCoreClock / (100000UL * 2UL)) + 1UL));
+    while (wait_loop_index != 0UL)
+    {
+      wait_loop_index--;
+    }
+
+    if ((hdac->Instance->SR & (DAC_SR_CAL_FLAG1 << (Channel & 0x10UL))) == 0UL)
+    {
+      /* Trimming is actually one value more */
+      trimmingvalue++;
+      /* Set right trimming */
+      MODIFY_REG(hdac->Instance->CCR, (DAC_CCR_OTRIM1 << (Channel & 0x10UL)), (trimmingvalue << (Channel & 0x10UL)));
+    }
+
+    /* Disable the selected DAC channel calibration */
+    /* i.e. clear DAC_CR_CENx bit */
+    CLEAR_BIT((hdac->Instance->CR), (DAC_CR_CEN1 << (Channel & 0x10UL)));
+
+    sConfig->DAC_TrimmingValue = trimmingvalue;
+    sConfig->DAC_UserTrimming = DAC_TRIMMING_USER;
+
+    /* Restore configuration */
+    MODIFY_REG(hdac->Instance->MCR, (DAC_MCR_MODE1 << (Channel & 0x10UL)), oldmodeconfiguration);
+
+    /* Process unlocked */
+    __HAL_UNLOCK(hdac);
+  }
+
+  return status;
+}
+
+/**
+  * @brief  Set the trimming mode and trimming value (user trimming mode applied).
+  * @param  hdac pointer to a DAC_HandleTypeDef structure that contains
+  *         the configuration information for the specified DAC.
+  * @param  sConfig DAC configuration structure updated with new DAC trimming value.
+  * @param  Channel The selected DAC channel.
+  *          This parameter can be one of the following values:
+  *            @arg DAC_CHANNEL_1: DAC Channel1 selected
+  *            @arg DAC_CHANNEL_2: DAC Channel2 selected
+  * @param  NewTrimmingValue DAC new trimming value
+  * @retval HAL status
+  */
+HAL_StatusTypeDef HAL_DACEx_SetUserTrimming(DAC_HandleTypeDef *hdac, DAC_ChannelConfTypeDef *sConfig, uint32_t Channel,
+                                            uint32_t NewTrimmingValue)
+{
+  HAL_StatusTypeDef status = HAL_OK;
+
+  /* Check the parameters */
+  assert_param(IS_DAC_CHANNEL(Channel));
+  assert_param(IS_DAC_NEWTRIMMINGVALUE(NewTrimmingValue));
+
+  /* Check the DAC handle and channel configuration struct allocation */
+  if ((hdac == NULL) || (sConfig == NULL))
+  {
+    status = HAL_ERROR;
+  }
+  else
+  {
+    /* Process locked */
+    __HAL_LOCK(hdac);
+
+    /* Set new trimming */
+    MODIFY_REG(hdac->Instance->CCR, (DAC_CCR_OTRIM1 << (Channel & 0x10UL)), (NewTrimmingValue << (Channel & 0x10UL)));
+
+    /* Update trimming mode */
+    sConfig->DAC_UserTrimming = DAC_TRIMMING_USER;
+    sConfig->DAC_TrimmingValue = NewTrimmingValue;
+
+    /* Process unlocked */
+    __HAL_UNLOCK(hdac);
+  }
+  return status;
+}
+
+/**
+  * @brief  Return the DAC trimming value.
+  * @param  hdac DAC handle
+  * @param  Channel The selected DAC channel.
+  *          This parameter can be one of the following values:
+  *            @arg DAC_CHANNEL_1: DAC Channel1 selected
+  *            @arg DAC_CHANNEL_2: DAC Channel2 selected
+  * @retval Trimming value : range: 0->31
+  *
+ */
+uint32_t HAL_DACEx_GetTrimOffset(const DAC_HandleTypeDef *hdac, uint32_t Channel)
+{
+  /* Check the parameter */
+  assert_param(IS_DAC_CHANNEL(Channel));
+
+  /* Retrieve trimming */
+  return ((hdac->Instance->CCR & (DAC_CCR_OTRIM1 << (Channel & 0x10UL))) >> (Channel & 0x10UL));
+}
+
+/**
+  * @}
+  */
+
+/** @defgroup DACEx_Exported_Functions_Group3 Peripheral Control functions
+  *  @brief    Extended Peripheral Control functions
+  *
+@verbatim
+  ==============================================================================
+             ##### Peripheral Control functions #####
+  ==============================================================================
+    [..]  This section provides functions allowing to:
+      (+) Set the specified data holding register value for DAC channel.
+
+@endverbatim
+  * @{
+  */
+
+
+/**
+  * @brief  Return the last data output value of the selected DAC channel.
+  * @param  hdac pointer to a DAC_HandleTypeDef structure that contains
+  *         the configuration information for the specified DAC.
+  * @retval The selected DAC channel data output value.
+  */
+uint32_t HAL_DACEx_DualGetValue(const DAC_HandleTypeDef *hdac)
+{
+  uint32_t tmp = 0UL;
+
+  tmp |= hdac->Instance->DOR1;
+
+  tmp |= hdac->Instance->DOR2 << 16UL;
+
+  /* Returns the DAC channel data output register value */
+  return tmp;
+}
+
+
+/**
+  * @}
+  */
+/**
+  * @}
+  */
+
+/* Private functions ---------------------------------------------------------*/
+/** @defgroup DACEx_Private_Functions DACEx private functions
+  *  @brief    Extended private functions
+  * @{
+  */
+
+
+/**
+  * @brief  DMA conversion complete callback.
+  * @param  hdma pointer to a DMA_HandleTypeDef structure that contains
+  *                the configuration information for the specified DMA module.
+  * @retval None
+  */
+void DAC_DMAConvCpltCh2(DMA_HandleTypeDef *hdma)
+{
+  DAC_HandleTypeDef *hdac = (DAC_HandleTypeDef *)((DMA_HandleTypeDef *)hdma)->Parent;
+
+#if (USE_HAL_DAC_REGISTER_CALLBACKS == 1)
+  hdac->ConvCpltCallbackCh2(hdac);
+#else
+  HAL_DACEx_ConvCpltCallbackCh2(hdac);
+#endif /* USE_HAL_DAC_REGISTER_CALLBACKS */
+
+  hdac->State = HAL_DAC_STATE_READY;
+}
+
+/**
+  * @brief  DMA half transfer complete callback.
+  * @param  hdma pointer to a DMA_HandleTypeDef structure that contains
+  *                the configuration information for the specified DMA module.
+  * @retval None
+  */
+void DAC_DMAHalfConvCpltCh2(DMA_HandleTypeDef *hdma)
+{
+  DAC_HandleTypeDef *hdac = (DAC_HandleTypeDef *)((DMA_HandleTypeDef *)hdma)->Parent;
+  /* Conversion complete callback */
+#if (USE_HAL_DAC_REGISTER_CALLBACKS == 1)
+  hdac->ConvHalfCpltCallbackCh2(hdac);
+#else
+  HAL_DACEx_ConvHalfCpltCallbackCh2(hdac);
+#endif /* USE_HAL_DAC_REGISTER_CALLBACKS */
+}
+
+/**
+  * @brief  DMA error callback.
+  * @param  hdma pointer to a DMA_HandleTypeDef structure that contains
+  *                the configuration information for the specified DMA module.
+  * @retval None
+  */
+void DAC_DMAErrorCh2(DMA_HandleTypeDef *hdma)
+{
+  DAC_HandleTypeDef *hdac = (DAC_HandleTypeDef *)((DMA_HandleTypeDef *)hdma)->Parent;
+
+  /* Set DAC error code to DMA error */
+  hdac->ErrorCode |= HAL_DAC_ERROR_DMA;
+
+#if (USE_HAL_DAC_REGISTER_CALLBACKS == 1)
+  hdac->ErrorCallbackCh2(hdac);
+#else
+  HAL_DACEx_ErrorCallbackCh2(hdac);
+#endif /* USE_HAL_DAC_REGISTER_CALLBACKS */
+
+  hdac->State = HAL_DAC_STATE_READY;
+}
+
+
+/**
+  * @}
+  */
+
+/**
+  * @}
+  */
+
+#endif /* DAC1 || DAC2 */
+
+#endif /* HAL_DAC_MODULE_ENABLED */
+
+/**
+  * @}
+  */

Файловите разлики са ограничени, защото са твърде много
+ 190 - 50
OZE_Sensor/OZE_Sensor.ioc