source: trunk/firmware_v4/SES/src/main.c

Last change on this file was 42, checked in by f.jahn, 5 days ago
File size: 13.5 KB
Line 
1/* USER CODE BEGIN Header */
2/**
3 ******************************************************************************
4 * @file : main.c
5 * @brief : Main program body
6 ******************************************************************************
7 * @attention
8 *
9 * Copyright (c) 2025 STMicroelectronics.
10 * All rights reserved.
11 *
12 * This software is licensed under terms that can be found in the LICENSE file
13 * in the root directory of this software component.
14 * If no LICENSE file comes with this software, it is provided AS-IS.
15 *
16 ******************************************************************************
17 */
18/* USER CODE END Header */
19/* Includes ------------------------------------------------------------------*/
20#include "main.h"
21#include "adc.h"
22#include "dma.h"
23#include "tim.h"
24#include "usart.h"
25#include "gpio.h"
26#include "iwdg.h"
27
28/* Private includes ----------------------------------------------------------*/
29/* USER CODE BEGIN Includes */
30#include <stdio.h>
31#include "button.h"
32#include "buzzer.h"
33#include "relais.h"
34#include "leds.h"
35#include "fan.h"
36#include "chip_temperature.h"
37#include "modeswitch.h"
38#include "mode_mainswitch.h"
39#include "mode_secondaryprotection.h"
40#include "mode_secondaryprotection_plus.h"
41#include "mode_lvp.h"
42#include "mode_ovp.h"
43#include "mode_lvp_ovp.h"
44#include "voltage_meas.h"
45#include "modbus.h"
46#include "sysdata.h"
47#include "eeprom.h"
48/* USER CODE END Includes */
49
50/* Private typedef -----------------------------------------------------------*/
51/* USER CODE BEGIN PTD */
52
53/* USER CODE END PTD */
54
55/* Private define ------------------------------------------------------------*/
56/* USER CODE BEGIN PD */
57int oldTimeMSTick;
58int oldTimeSeconds;
59int msCounter;
60int silentmode = 0;
61/* USER CODE END PD */
62
63/* Private macro -------------------------------------------------------------*/
64/* USER CODE BEGIN PM */
65
66/* USER CODE END PM */
67
68/* Private variables ---------------------------------------------------------*/
69
70/* USER CODE BEGIN PV */
71uint32_t bootLoaderMark __attribute__((section(".no_init")));
72static volatile uint32_t adcData[5];
73modbus_t modbusData __attribute__((section(".RAM1")));
74/* USER CODE END PV */
75
76/* Private function prototypes -----------------------------------------------*/
77void SystemClock_Config(void);
78
79/* USER CODE BEGIN PFP */
80void JumpToBootloader(void);
81/* USER CODE END PFP */
82
83/* Private user code ---------------------------------------------------------*/
84/* USER CODE BEGIN 0 */
85
86/* USER CODE END 0 */
87
88/**
89 * @brief The application entry point.
90 * @retval int
91 */
92int main(void)
93{
94 /* USER CODE BEGIN 1 */
95 if (bootLoaderMark == GOTO_SYSTEM_BOOTLOADER_MARK)
96 {
97 bootLoaderMark = 0;
98 JumpToBootloader();
99 }
100
101 if (FLASH->OPTR & FLASH_OPTR_nBOOT_SEL)
102 {
103 printf("setze option byte\r\n");
104
105 HAL_FLASH_Unlock();
106 FLASH_WaitForLastOperation(1000);
107 HAL_FLASH_OB_Unlock();
108 FLASH_WaitForLastOperation(1000);
109
110 FLASH->OPTR &= ~FLASH_OPTR_nBOOT_SEL;
111
112 FLASH_WaitForLastOperation(1000);
113
114 FLASH->CR |= FLASH_CR_OPTSTRT;
115
116 FLASH_WaitForLastOperation(1000);
117
118 HAL_FLASH_OB_Launch();
119 }
120
121 unsigned pwm = 0U;
122
123
124
125
126 /* USER CODE END 1 */
127
128 /* MCU Configuration--------------------------------------------------------*/
129
130 /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
131 HAL_Init();
132
133 /* USER CODE BEGIN Init */
134
135 /* USER CODE END Init */
136
137 /* Configure the system clock */
138 SystemClock_Config();
139
140 /* USER CODE BEGIN SysInit */
141
142
143 /* USER CODE END SysInit */
144
145 /* Initialize all configured peripherals */
146 MX_GPIO_Init();
147 MX_DMA_Init();
148 MX_ADC1_Init();
149 MX_TIM16_Init();
150 MX_TIM17_Init();
151 MX_IWDG_Init();
152 MX_USART1_UART_Init();
153 /* USER CODE BEGIN 2 */
154
155
156 //Eprom test
157 if (EEPROM_ReadFirstStart() == 0xff)
158 {
159#ifdef DEBUG
160 printf("Erststart erkannt, schreibe Werkseinstellung\r\n");
161#endif
162 EEPROM_WriteDefaults();
163 }
164 else if(EEPROM_ReadFirstStart() != FIRST_START_ID)
165 {
166#ifdef DEBUG
167 printf("Neue Version Parameter erkannt, schreibe Werkseinstellung\r\n");
168#endif
169 EEPROM_WriteDefaults();
170 }
171 else
172 {
173#ifdef DEBUG
174 printf("Konfig vorhanden\r\n");
175#endif
176 }
177
178 EEPROM_ReadDeviceParameter();
179 //
180
181 SYS_DATA_Init();
182#ifdef DEBUG
183 printf("debug io test...ok\r\n");
184#endif
185 mbInit(&modbusData, sys_data.s.parameter.baudrate, sys_data.s.parameter.parityMode, sys_data.s.parameter.stopBit, &huart1);
186
187 HAL_GPIO_WritePin(GPIO_OUTPUT_BUZZER_GPIO_Port, GPIO_OUTPUT_BUZZER_Pin, GPIO_PIN_SET);
188 HAL_GPIO_WritePin(GPIO_OUTPUT_LED_ERROR_GPIO_Port, GPIO_OUTPUT_LED_ERROR_Pin, GPIO_PIN_SET);
189 HAL_GPIO_WritePin(GPIO_OUTPUT_LED_ON_GPIO_Port, GPIO_OUTPUT_LED_ON_Pin, GPIO_PIN_SET);
190 HAL_Delay(500);
191 HAL_GPIO_WritePin(GPIO_OUTPUT_BUZZER_GPIO_Port, GPIO_OUTPUT_BUZZER_Pin, GPIO_PIN_RESET);
192 HAL_GPIO_WritePin(GPIO_OUTPUT_LED_ERROR_GPIO_Port, GPIO_OUTPUT_LED_ERROR_Pin, GPIO_PIN_RESET);
193 HAL_GPIO_WritePin(GPIO_OUTPUT_LED_ON_GPIO_Port, GPIO_OUTPUT_LED_ON_Pin, GPIO_PIN_RESET);
194
195 //Spannungsregler für Mosfet ein (Relais Schaltstufe)
196 HAL_GPIO_WritePin(GPIO_OUTPUT_10V_EN_GPIO_Port, GPIO_OUTPUT_10V_EN_Pin, GPIO_PIN_SET);
197
198 //--- RELAIS ZURÜCKSETZEN, damit es definitiv aus ist ---
199 //Sicherstellen das nicht noch die Set Spule aktiv geschaltet ist
200 HAL_GPIO_WritePin(GPIO_OUTPUT_RELAIS_SET_GPIO_Port, GPIO_OUTPUT_RELAIS_SET_Pin, GPIO_PIN_RESET);
201
202 //Puls starten
203 HAL_GPIO_WritePin(GPIO_OUTPUT_RELAIS_RESET_GPIO_Port, GPIO_OUTPUT_RELAIS_RESET_Pin, GPIO_PIN_SET);
204 HAL_Delay(50);
205 HAL_GPIO_WritePin(GPIO_OUTPUT_RELAIS_RESET_GPIO_Port, GPIO_OUTPUT_RELAIS_RESET_Pin, GPIO_PIN_RESET);
206 //--- RELAIS ZURÜCKSETZEN ENDE ----
207
208 MODESWITCH_ReadMode();
209 sys_data.s.parameter.operatingMode = MODESWITCH_GetMode();
210
211 CHIP_TEMPERATURE_Calibration(/*&sys_data*/);
212 HAL_ADCEx_Calibration_Start(&hadc1);
213 HAL_ADC_Start_DMA(&hadc1, (uint32_t*)adcData, 5);
214
215
216
217 extern uint32_t frequency, ic_overflows;
218 ic_overflows = 0U;
219 __HAL_TIM_SetCounter(&htim16, 0U);
220
221 HAL_TIM_Base_Start_IT(&htim16);
222 HAL_TIM_IC_Start_IT(&htim16, TIM_CHANNEL_1);
223 int oldcaptureValue=0;
224
225
226
227
228
229 /* USER CODE END 2 */
230
231 /* Infinite loop */
232 /* USER CODE BEGIN WHILE */
233 while (1)
234 {
235 /* USER CODE END WHILE */
236
237 /* USER CODE BEGIN 3 */
238 HAL_IWDG_Refresh(&hiwdg);
239
240
241 if (mbGetFrameComplete(&modbusData) == true)
242 {
243 if (mbSlaveCheckModbusRtuQuery(&modbusData) == RESPOND_TO_QUERY)
244 {
245 if (silentmode == 0)
246 {
247 mbSlaveProcessRtuQuery(&modbusData);
248 }
249 }
250 else
251 {
252 huart1.RxState = HAL_UART_STATE_BUSY_RX;
253 }
254 }
255
256
257
258
259 if (oldTimeMSTick != HAL_GetTick())
260 {
261 BUTTON_Exec();
262 BUZZER_Exec();
263 RELAIS_Exec(adcData[0]);
264 LEDS_Exec();
265 VOLTAGE_MEAS_Exec(adcData[1],adcData[2]);
266
267 oldTimeMSTick = HAL_GetTick();
268 msCounter++;
269 }
270
271
272 //Sekunden tick
273 if (msCounter >= 999)
274 {
275 msCounter = 0;
276 CHIP_TEMPERATURE_Exec(adcData[4]);
277 sys_data.s.values.chipTemp = CHIP_TEMPERATURE_GetTemp();
278
279 if ( sys_data.s.values.chipTemp > 50)
280 {
281 pwm++;
282 if (pwm > 100U) pwm = 100U;
283
284 }
285 if (sys_data.s.values.chipTemp < 50)
286 {
287 if (pwm > 0) pwm--;
288 }
289
290 FAN_SetSpeed(pwm);
291
292 sys_data.s.values.voltage_input = VOLTAGE_MEAS_GetUin();
293 sys_data.s.values.voltage_output = VOLTAGE_MEAS_GetUout();
294 sys_data.s.values.voltage_relais = (int32_t) sys_data.s.values.voltage_input - (int32_t) sys_data.s.values.voltage_output ;
295 uint32_t rpm;
296 rpm = frequency / 2;
297 rpm = rpm * 60;
298 sys_data.s.values.fan_rpm = rpm;
299 sys_data.s.values.fan_pwm = pwm;
300 sys_data.s.values.lvp_state = HAL_GPIO_ReadPin(GPIO_INPUT_LVP_GPIO_Port, GPIO_INPUT_LVP_Pin);
301 sys_data.s.values.ovp_state = HAL_GPIO_ReadPin(GPIO_INPUT_OVP_GPIO_Port, GPIO_INPUT_OVP_Pin);
302 if (HAL_GPIO_ReadPin(GPIO_INPUT_FAULT_GPIO_Port, GPIO_INPUT_FAULT_Pin) == GPIO_PIN_RESET)
303 {
304 sys_data.s.values.fault_state = 1;
305 }else
306 {
307 sys_data.s.values.fault_state = 0;
308 }
309
310 sys_data.s.values.relais_state = RELAIS_GetState();
311 sys_data.s.values.relaisTemp = RELAIS_GetTemp();
312
313
314
315
316
317
318 } //endsecond tick
319
320
321
322 switch (MODESWITCH_GetMode())
323 {
324 case MODE_MAINSWITCH: //0
325 MODE_MAINSWITCH_Exec();
326 break;
327
328 case MODE_MAINSWITCH_SECONDARYPROTECTION://1
329 MODE_SECONDARYPROTECTION_Exec(0);
330 break;
331
332 case MODE_MAINSWITCH_SECONDARYPROTECTION_PLUS://2
333 MODE_SECONDARYPROTECTION_PLUS_Exec(0);
334 break;
335
336 case MODE_MAINSWITCH_SECONDARYPROTECTION_AUTO_RETRY://3
337 MODE_SECONDARYPROTECTION_Exec(1);
338 break;
339
340 case MODE_MAINSWITCH_SECONDARYPROTECTION_PLUS_AUTO_RETRY://4
341 MODE_SECONDARYPROTECTION_PLUS_Exec(1);
342 break;
343
344 case MODE_MAINSWITCH_LVP_OVP://5
345 MODE_LVP_OVP_Exec();
346 break;
347
348 case MODE_MAINSWITCH_LVP://6
349 MODE_LVP_Exec();
350 break;
351
352 case MODE_MAINSWITCH_OVP://7
353 MODE_OVP_Exec();
354 break;
355
356 default:
357#ifdef DEBUG
358 printf("mode not yet implemented\n");
359#else
360 ;
361#endif
362 }
363
364
365 if(sys_data.s.parameter.command != 0)
366 {
367 if (modbusData.current_query == MB_QUERY_NOTHING)
368 {
369 //printf("CMD = %d\n", sys_data.s.parameter.command);
370 switch (sys_data.s.parameter.command )
371 {
372 case COMMAND_STORE_CONFIG: EEPROM_StoreConfig(false); break;
373 case COMMAND_FULL_RESTORE: EEPROM_WriteDefaults(); break;
374 case COMMAND_FACTORY_RESTORE: EEPROM_WriteDefaults(); break;
375 case COMMAND_RESTORE_LAST_SAVED_VALUES: EEPROM_ReadDeviceParameter(); break;
376 case COMMAND_STORE_WITH_SERIAL_NUMBER: EEPROM_StoreConfig(true); break; // Seriennummer schreiben
377 case COMMAND_RESTART: while(1); break;
378 case COMMAND_GOTO_SYS_BOOTLOADER: bootLoaderMark = GOTO_SYSTEM_BOOTLOADER_MARK;
379 HAL_NVIC_SystemReset();
380 break;
381 default:
382#ifdef DEBUG
383 printf("UNKNOWN COMMAND\n");
384#else
385 ;
386#endif
387 }
388 sys_data.s.parameter.command = 0;
389 }
390 else
391 {
392 //printf("wait with execution till modbus communnikation finished\n");
393 }
394 }
395
396 }
397
398 /* USER CODE END 3 */
399}
400
401/**
402 * @brief System Clock Configuration
403 * @retval None
404 */
405void SystemClock_Config(void)
406{
407 RCC_OscInitTypeDef RCC_OscInitStruct = {0};
408 RCC_ClkInitTypeDef RCC_ClkInitStruct = {0};
409
410 __HAL_FLASH_SET_LATENCY(FLASH_LATENCY_0);
411
412 /** Initializes the RCC Oscillators according to the specified parameters
413 * in the RCC_OscInitTypeDef structure.
414 */
415 RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSI;
416 RCC_OscInitStruct.HSIState = RCC_HSI_ON;
417 RCC_OscInitStruct.HSIDiv = RCC_HSI_DIV4;
418 RCC_OscInitStruct.HSICalibrationValue = RCC_HSICALIBRATION_DEFAULT;
419 if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK)
420 {
421 Error_Handler();
422 }
423
424 /** Initializes the CPU, AHB and APB buses clocks
425 */
426 RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK
427 |RCC_CLOCKTYPE_PCLK1;
428 RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_HSI;
429 RCC_ClkInitStruct.SYSCLKDivider = RCC_SYSCLK_DIV1;
430 RCC_ClkInitStruct.AHBCLKDivider = RCC_HCLK_DIV1;
431 RCC_ClkInitStruct.APB1CLKDivider = RCC_APB1_DIV1;
432
433 if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_0) != HAL_OK)
434 {
435 Error_Handler();
436 }
437}
438
439/* USER CODE BEGIN 4 */
440void JumpToBootloader (void)
441{
442 typedef void (SystemBootloader)(void);
443#ifdef DEBUG
444 printf("Cannot jump in DEBUG mode!\n");
445 return;
446#endif
447 // Disable all interrupts
448 __disable_irq();
449
450#ifdef DEINIT_RCC
451 // Set the clock to the default state
452 HAL_RCC_DeInit();
453#endif
454#ifdef DEINIT_SYSTICK
455 // Disable Systick timer
456 SysTick->CTRL = SysTick->LOAD = SysTick->VAL = 0;
457#endif
458 // Clear Interrupt Enable Register & Interrupt Pending Register
459 for (int i = 0; i < sizeof(NVIC->ICER) / sizeof(NVIC->ICER[0]); i++)
460 {
461 NVIC->ICER[i] = 0xFFFFFFFF;
462 NVIC->ICPR[i] = 0xFFFFFFFF;
463 }
464
465 // Set up the jump to boot loader address + 4
466 SystemBootloader* sb = (SystemBootloader*) (*((uint32_t *) ((SYSTEM_BOOTLOADER_START_ADDR + 4))));
467
468 // Set the main stack pointer to the bootloader stack
469 __set_MSP(*(uint32_t *)SYSTEM_BOOTLOADER_START_ADDR);
470
471 __HAL_RCC_SYSCFG_CLK_ENABLE();
472 __HAL_SYSCFG_REMAPMEMORY_SYSTEMFLASH();
473 //__HAL_RCC_SYSCFG_CLK_DISABLE();
474
475 // Re-enable all interrupts
476 __enable_irq();
477
478 // Call the function to jump to boot loader location
479 sb();
480
481 // Jump is done successfully
482 while (1)
483 {
484 // Code should never reach this loop
485#ifdef DEBUG
486 printf("Jump has failed!\n");
487#endif
488 }
489}
490
491/* USER CODE END 4 */
492
493/**
494 * @brief This function is executed in case of error occurrence.
495 * @retval None
496 */
497void Error_Handler(void)
498{
499 /* USER CODE BEGIN Error_Handler_Debug */
500 /* User can add his own implementation to report the HAL error return state */
501 __disable_irq();
502 while (1)
503 {
504 }
505 /* USER CODE END Error_Handler_Debug */
506}
507#ifdef USE_FULL_ASSERT
508/**
509 * @brief Reports the name of the source file and the source line number
510 * where the assert_param error has occurred.
511 * @param file: pointer to the source file name
512 * @param line: assert_param error line source number
513 * @retval None
514 */
515void assert_failed(uint8_t *file, uint32_t line)
516{
517 /* USER CODE BEGIN 6 */
518 /* User can add his own implementation to report the file name and line number,
519 printf("Wrong parameters value: file %s on line %d\r\n", file, line) */
520#ifdef DEBUG
521 printf("Wrong parameters value: file %s on line %d\r\n", file, line) ;
522#endif
523 /* USER CODE END 6 */
524
525}
526#endif /* USE_FULL_ASSERT */
Note: See TracBrowser for help on using the repository browser.