source: ecs_cellMon/firmware/Core/Src/main.c

Last change on this file was 14, checked in by f.jahn, 2 months ago

Fuse death after reset command was fixed.

File size: 13.0 KB
Line 
1/* USER CODE BEGIN Header */
2/**
3 ******************************************************************************
4 * @file : main.c
5 * @brief : Main program body
6 ******************************************************************************
7 * @attention
8 *
9 * <h2><center>&copy; Copyright (c) 2021 STMicroelectronics.
10 * All rights reserved.</center></h2>
11 *
12 * This software component is licensed by ST under BSD 3-Clause license,
13 * the "License"; You may not use this file except in compliance with the
14 * License. You may obtain a copy of the License at:
15 * opensource.org/licenses/BSD-3-Clause
16 *
17 ******************************************************************************
18 */
19/* USER CODE END Header */
20/* Includes ------------------------------------------------------------------*/
21#include "main.h"
22#include "adc.h"
23#include "comp.h"
24#include "dac.h"
25#include "dma.h"
26#include "tim.h"
27#include "usart.h"
28#include "gpio.h"
29
30/* Private includes ----------------------------------------------------------*/
31/* USER CODE BEGIN Includes */
32#include "led.h"
33#include "output.h"
34#include "meas.h"
35#include "sysdata.h"
36#include "balancer.h"
37#include "modbus.h"
38#include "eeprom.h"
39#include "bms.h"
40#include <stdio.h>
41/* USER CODE END Includes */
42
43/* Private typedef -----------------------------------------------------------*/
44/* USER CODE BEGIN PTD */
45#define LED_INTERVALL 1
46#define BALANCER_EXEC_INTERVALL 1
47#define COMMUNICATION_TIMEOUT (300000) //in ms --> 5 Minuten
48/* USER CODE END PTD */
49
50/* Private define ------------------------------------------------------------*/
51/* USER CODE BEGIN PD */
52/* USER CODE END PD */
53
54/* Private macro -------------------------------------------------------------*/
55/* USER CODE BEGIN PM */
56
57/* USER CODE END PM */
58
59/* Private variables ---------------------------------------------------------*/
60IWDG_HandleTypeDef hiwdg;
61
62/* USER CODE BEGIN PV */
63modbus_t modbusData;
64uint32_t communicationTimeoutCounter = 0;
65uint16_t keyAccepted=0;
66uint16_t savedLockKey;
67
68/* USER CODE END PV */
69
70/* Private function prototypes -----------------------------------------------*/
71void SystemClock_Config(void);
72/* USER CODE BEGIN PFP */
73bool SetFlashReadProtection(bool state);
74bool SetBootFromFlashAndReadOutProtection(void);
75void applyMBParameter(void);
76void resetCounters(void);
77void resetMinMaxValues(void);
78void mb_save_lock_key(void);
79static void MX_IWDG_Init(void);
80/* USER CODE END PFP */
81
82/* Private user code ---------------------------------------------------------*/
83/* USER CODE BEGIN 0 */
84
85/* USER CODE END 0 */
86
87/**
88 * @brief The application entry point.
89 * @retval int
90 */
91int main(void)
92{
93 /* USER CODE BEGIN 1 */
94 uint32_t ledExecTime = 0;
95 // uint32_t balancerCheckTime = 0;
96 uint32_t balancerExecTime = 0;
97 uint32_t oldTime=0;
98
99
100 /* USER CODE END 1 */
101
102 /* MCU Configuration--------------------------------------------------------*/
103
104 /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
105 HAL_Init();
106
107 /* USER CODE BEGIN Init */
108
109
110 /* USER CODE END Init */
111
112 /* Configure the system clock */
113 SystemClock_Config();
114
115 /* USER CODE BEGIN SysInit */
116
117 /* USER CODE END SysInit */
118
119 /* Initialize all configured peripherals */
120 MX_GPIO_Init();
121 MX_DMA_Init();
122 MX_ADC1_Init();
123 MX_COMP1_Init();
124 MX_COMP2_Init();
125 MX_DAC1_Init();
126 MX_TIM1_Init();
127 MX_USART1_UART_Init();
128 /* USER CODE BEGIN 2 */
129 HAL_Delay(100);
130 SYSDATA_Init();
131 if(EEPROM_isFirstStart())
132 {
133 // zurücksetzen aller Werte
134 printf("full restore...\n");
135 EEPROM_fullRestore(&sysData,false);
136 EEPROM_ResetLogData();
137 }
138
139 if(HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_3) == GPIO_PIN_RESET)
140 {
141 // zurücksetzen auf Werkseinsellung
142 printf("factore restore (Pin)...\n");
143 EEPROM_fullRestore(&sysData,true);
144 }
145
146 // Lade gespeicherte Einstellungen
147 printf("read config...\n");
148 EEPROM_readConfig(&sysData);
149 EEPROM_readLogData();
150
151
152 //Display Address with Error LED blinks
153 int n;
154 for (n=0; n<sysData.s.slaveAddress; n++)
155 {
156 LED_ErrorOn();
157 HAL_Delay(350);
158 LED_ErrorOff();
159 HAL_Delay(350);
160 }
161
162
163
164 LED_FunctionStartBlink(100,900);
165 OUTPUT_LVP_Disable();
166 OUTPUT_OVP_Disable();
167 BALANCER_Init();
168 MEAS_Init();
169
170 // Modbus Initialisierung
171 mbInit(&modbusData, sysData.s.baudrate, sysData.s.parityMode, &huart1, accessModeTable, &keyAccepted);
172
173
174 MX_IWDG_Init();
175 /* USER CODE END 2 */
176
177 /* Infinite loop */
178 /* USER CODE BEGIN WHILE */
179 while (1)
180 {
181 HAL_IWDG_Refresh(&hiwdg);
182
183 if (HAL_GetTick() >= (ledExecTime + LED_INTERVALL))
184 {
185 LED_Exec();
186 ledExecTime = HAL_GetTick();
187 }
188
189
190 if (HAL_GetTick() >= (balancerExecTime + BALANCER_EXEC_INTERVALL))
191 {
192
193 balancerExecTime = HAL_GetTick();
194 MEAS_Exec();
195 BMS_Exec();
196 BALANCER_Exec();
197 }
198
199
200
201 if (HAL_GetTick() > oldTime)
202 {
203 //1ms Intervall
204 oldTime = HAL_GetTick();
205
206 if (communicationTimeoutCounter)
207 {
208 communicationTimeoutCounter--;
209 if (communicationTimeoutCounter==0)
210 {
211 sysData.s.masterMode=0;
212 }
213
214 }
215 }
216
217 if (sysData.s.command != 0)
218 {
219 if (modbusData.current_query == MB_QUERY_NOTHING)
220 {
221 //printf("CMD = %d\n", sys_data.s.parameter.command);
222 switch (sysData.s.command)
223 {
224 case CMD_SAVE_PARAMETER_TO_EEPROM:
225 printf("EXE: Store parameter\n");
226 EEPROM_storeConfig(&sysData,0,false);
227 break;
228 case CMD_RESET_FACTORY:
229 printf("EXEC: Factory Restore\n");
230 EEPROM_fullRestore(&sysData,1);
231 break;
232 case CMD_SAVE_SN:
233 printf("EXEC: Store with sn\n");
234 EEPROM_storeConfig(&sysData,1,false);
235 break;
236 case CMD_RESET:
237 printf("EXEC: RESTART\n");
238 HAL_DAC_SetValue(&hdac1, DAC_CHANNEL_1, DAC_ALIGN_12B_R, 0);
239 HAL_Delay(10);
240 NVIC_SystemReset();
241 break;
242 case CMD_APPLY_MB_PARAMETER:
243 printf("EXEC: Apply MB Parameter\n");
244 applyMBParameter();
245 break;
246 case CMD_RESET_COUNTERS:
247 printf("EXEC: Reset Counters\n");
248 resetCounters();
249 break;
250 case CMD_RESET_MIN_MAX_VALUES:
251 printf("EXEC: Reset Min and Max Values\n");
252 resetMinMaxValues();
253 break;
254 case CMD_SAVE_LOCK_KEY:
255 printf("EXEC: Save lock key\n");
256 mb_save_lock_key();
257 break;
258 case CMD_DELAY:
259 printf("EXEC: Delay of 1 second! Device must reset.\n");
260 HAL_Delay(1500);
261 break;
262 default:
263 printf("UNKNOWN COMMAND\n");
264 }
265 sysData.s.command = 0;
266 }
267 else
268 {
269 //printf("wait with execution till modbus communnikation finished\n");
270 }
271 }
272
273
274
275 // Modbus Kommunikation
276 if (mbGetFrameComplete(&modbusData) == true)
277 {
278 //printf("RX frame complete\n");
279 if (mbSlaveCheckModbusRtuQuery(&modbusData) == RESPOND_TO_QUERY)
280 {
281 //printf("->send response...\n");
282 mbSlaveProcessRtuQuery(&modbusData);
283
284 //Prüfe KEY
285 if (sysData.s.lockKey == savedLockKey)
286 {
287 sysData.s.keyAccepted = 1;
288 keyAccepted = 1;
289 }
290 else
291 {
292 sysData.s.keyAccepted = 0;
293 keyAccepted = 0;
294 }
295
296 //Wenn Ausgleichsspannungsregister von einem Mastergerät geändert wird. In den Master Modus gehen
297 if (sysData.s.balancerVoltageRemote != 0)
298 {
299 communicationTimeoutCounter = COMMUNICATION_TIMEOUT;
300 sysData.s.masterMode = 1;
301 sysData.s.balancerVoltage = sysData.s.balancerVoltageRemote;
302 }
303
304 }
305 else
306 {
307 //printf("->don't respond...\n");
308 modbusData.uart->RxState = HAL_UART_STATE_BUSY_RX;
309 }
310 }
311 else
312 {
313 if (sysData.s.balancerPower == 0)
314 {
315 // HAL_PWR_EnterSLEEPMode(PWR_MAINREGULATOR_ON,PWR_SLEEPENTRY_WFI);
316 }
317 }
318
319
320 /* USER CODE END WHILE */
321
322 /* USER CODE BEGIN 3 */
323 }
324 /* USER CODE END 3 */
325}
326
327/**
328 * @brief System Clock Configuration
329 * @retval None
330 */
331void SystemClock_Config(void)
332{
333 RCC_OscInitTypeDef RCC_OscInitStruct = {0};
334 RCC_ClkInitTypeDef RCC_ClkInitStruct = {0};
335 RCC_PeriphCLKInitTypeDef PeriphClkInit = {0};
336
337 /** Configure the main internal regulator output voltage
338 */
339 HAL_PWREx_ControlVoltageScaling(PWR_REGULATOR_VOLTAGE_SCALE1);
340 /** Initializes the RCC Oscillators according to the specified parameters
341 * in the RCC_OscInitTypeDef structure.
342 */
343 RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE;
344 RCC_OscInitStruct.HSEState = RCC_HSE_ON;
345 RCC_OscInitStruct.PLL.PLLState = RCC_PLL_NONE;
346 if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK)
347 {
348 Error_Handler();
349 }
350 /** Initializes the CPU, AHB and APB buses clocks
351 */
352 RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK
353 |RCC_CLOCKTYPE_PCLK1;
354 RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_HSE;
355 RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;
356 RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV1;
357
358 if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_0) != HAL_OK)
359 {
360 Error_Handler();
361 }
362 /** Initializes the peripherals clocks
363 */
364 PeriphClkInit.PeriphClockSelection = RCC_PERIPHCLK_USART1|RCC_PERIPHCLK_ADC
365 |RCC_PERIPHCLK_TIM1;
366 PeriphClkInit.Usart1ClockSelection = RCC_USART1CLKSOURCE_PCLK1;
367 PeriphClkInit.AdcClockSelection = RCC_ADCCLKSOURCE_SYSCLK;
368 PeriphClkInit.Tim1ClockSelection = RCC_TIM1CLKSOURCE_PCLK1;
369 if (HAL_RCCEx_PeriphCLKConfig(&PeriphClkInit) != HAL_OK)
370 {
371 Error_Handler();
372 }
373}
374
375/* USER CODE BEGIN 4 */
376
377/**
378 * @brief IWDG Initialization Function
379 * @param None
380 * @retval None
381 */
382static void MX_IWDG_Init(void)
383{
384
385 /* USER CODE BEGIN IWDG_Init 0 */
386
387 /* USER CODE END IWDG_Init 0 */
388
389 /* USER CODE BEGIN IWDG_Init 1 */
390
391 /* USER CODE END IWDG_Init 1 */
392 hiwdg.Instance = IWDG;
393 hiwdg.Init.Prescaler = IWDG_PRESCALER_8;
394 hiwdg.Init.Window = 4095;
395 hiwdg.Init.Reload = 4095;
396 if (HAL_IWDG_Init(&hiwdg) != HAL_OK)
397 {
398 Error_Handler();
399 }
400 /* USER CODE BEGIN IWDG_Init 2 */
401
402 /* USER CODE END IWDG_Init 2 */
403
404}
405
406
407void mb_save_lock_key()
408{
409 if (sysData.s.lockKey == savedLockKey)
410 {
411 EEPROM_storeConfig(&sysData,false,true);
412 savedLockKey = sysData.s.newLockKey;
413 sysData.s.lockKey = savedLockKey;
414 }
415
416 if (savedLockKey != 0)
417 {
418 sysData.s.writeLocked = 1;
419 }
420 else
421 {
422 sysData.s.writeLocked = 0;
423 }
424}
425
426void applyMBParameter()
427{
428 HAL_UART_DeInit(&huart1);
429 mbInit(&modbusData, sysData.s.baudrate, sysData.s.parityMode, &huart1, accessModeTable, &keyAccepted);
430}
431
432void resetCounters()
433{
434 if (sysData.s.lockKey == savedLockKey)
435 {
436 sysData.s.criticalOverTempTime = 0;
437 sysData.s.criticalUnderTempTime = 0;
438 sysData.s.criticalOverVoltageTime = 0;
439 sysData.s.criticalUnderVoltageTime = 0;
440 sysData.s.cycleCounter = 0;
441 EEPROM_storeLogData();
442 }
443 else
444 {
445 printf("not allowed, paramter locked!\n");
446 }
447}
448
449void resetMinMaxValues()
450{
451 if (sysData.s.lockKey == savedLockKey)
452 {
453 sysData.s.minTemperature = sysData.s.cellTemperature;
454 sysData.s.maxTemperature = sysData.s.cellTemperature;
455 sysData.s.minVoltage = sysData.s.cellVoltage;
456 sysData.s.maxVoltage = sysData.s.cellVoltage;
457 EEPROM_storeLogData();
458 }
459 else
460 {
461 printf("not allowed, paramter locked!\n");
462 }
463}
464
465/* USER CODE END 4 */
466
467/**
468 * @brief This function is executed in case of error occurrence.
469 * @retval None
470 */
471void Error_Handler(void)
472{
473 /* USER CODE BEGIN Error_Handler_Debug */
474 /* User can add his own implementation to report the HAL error return state */
475 __disable_irq();
476 while (1)
477 {
478 }
479 /* USER CODE END Error_Handler_Debug */
480}
481
482#ifdef USE_FULL_ASSERT
483/**
484 * @brief Reports the name of the source file and the source line number
485 * where the assert_param error has occurred.
486 * @param file: pointer to the source file name
487 * @param line: assert_param error line source number
488 * @retval None
489 */
490void assert_failed(uint8_t *file, uint32_t line)
491{
492 /* USER CODE BEGIN 6 */
493 /* User can add his own implementation to report the file name and line number,
494 ex: printf("Wrong parameters value: file %s on line %d\r\n", file, line) */
495 printf("Wrong parameters value: file %s on line %d\r\n", file, line);
496 /* USER CODE END 6 */
497}
498#endif /* USE_FULL_ASSERT */
499
500/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
Note: See TracBrowser for help on using the repository browser.