Subversion Repositories AFRtranscoder

Rev

Go to most recent revision | Details | Last modification | View Log | RSS feed

Rev Author Line No. Line
2 mjames 1
/* USER CODE BEGIN Header */
2
/**
3
 ******************************************************************************
4
 * @file           : main.c
5
 * @brief          : Main program body
6
 ******************************************************************************
7
 * @attention
8
 *
9
 * Copyright (c) 2023 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
 
22
/* Private includes ----------------------------------------------------------*/
23
/* USER CODE BEGIN Includes */
24
#include "libSerial/serial.h"
25
#include "libPLX/commsLib.h"
26
#include "libTinyWB/tinyWB.h"
27
/* USER CODE END Includes */
28
 
29
/* Private typedef -----------------------------------------------------------*/
30
/* USER CODE BEGIN PTD */
31
 
32
/* USER CODE END PTD */
33
 
34
/* Private define ------------------------------------------------------------*/
35
/* USER CODE BEGIN PD */
36
 
37
/* USER CODE END PD */
38
 
39
/* Private macro -------------------------------------------------------------*/
40
/* USER CODE BEGIN PM */
41
 
42
/* USER CODE END PM */
43
 
44
/* Private variables ---------------------------------------------------------*/
45
CAN_HandleTypeDef hcan;
46
 
47
SPI_HandleTypeDef hspi1;
48
 
49
UART_HandleTypeDef huart1;
50
UART_HandleTypeDef huart2;
51
 
52
/* USER CODE BEGIN PV */
53
#define MIN_RPM_FOR_HEAT 400
54
/// 20 seconds to warm up before enabling the heater
55
#define MIN_RPM_TIME_ACTIVE 20000
56
 
57
uint8_t volatile tx1Buffer[TX_USART_BUFF_SIZ];
58
uint8_t volatile tx2Buffer[TX_USART_BUFF_SIZ];
59
uint8_t volatile rx1Buffer[RX_USART_BUFF_SIZ];
60
uint8_t volatile rx2Buffer[RX_USART_BUFF_SIZ];
61
 
62
float AFRValue = 14.7;
63
float temperature = 0;
64
 
65
uint32_t timeValue = 0;
66
 
67
uint8_t heaterEnable = 0;
68
 
69
/* USER CODE END PV */
70
 
71
/* Private function prototypes -----------------------------------------------*/
72
void SystemClock_Config(void);
73
static void MX_GPIO_Init(void);
74
static void MX_CAN_Init(void);
75
static void MX_SPI1_Init(void);
76
static void MX_USART1_UART_Init(void);
77
static void MX_USART2_UART_Init(void);
78
/* USER CODE BEGIN PFP */
79
 
80
// user provided callback symbol
81
void libPLXcallbackSendUserData()
82
{
83
 
84
  if (heaterEnable)
85
    HAL_GPIO_TogglePin(LED_GPIO_Port, LED_Pin);
86
  else
87
    HAL_GPIO_WritePin(LED_GPIO_Port, LED_Pin,GPIO_PIN_RESET);
88
  // send AFR
89
 
90
  PLX_SensorInfo info;
91
  ConvToPLXInstance(libPLXgetNextInstance(PLX_AFR), &info);
92
  ConvToPLXAddr(PLX_AFR, &info);
93
  ConvToPLXReading(ConveriMFDData2Raw(PLX_AFR, AFR_Gasoline, AFRValue), &info);
94
  sendInfo(&uc2, &info);
95
}
96
 
97
// this setup actually turns the heater on if the RPM is not reported at all
98
// after timeout, or once the RPM is reported, it delays timeout after RPM exceeds the lower limit
99
 
100
// User provided callback symbol on receipt of data
101
void libPLXcallbackRecievedData(PLX_SensorInfo *info)
102
{
103
  uint16_t addr = ConvPLXAddr(info);
104
  if (addr == PLX_RPM)
105
  {
106
    uint16_t rpm = ConveriMFDRaw2Data(PLX_RPM, 0, ConvPLXReading(info));
107
    // reset time value if the engine isnt running at correct RPM
108
    if (rpm < MIN_RPM_FOR_HEAT)
109
      timeValue = HAL_GetTick();
110
  }
111
}
112
 
113
void checkHeaterEnable(void)
114
{
115
 
116
  heaterEnable = (HAL_GetTick() - timeValue) > MIN_RPM_TIME_ACTIVE;
117
  // Active low pin to enable AFR if RPM has exceeded minimum for at least the active time
118
  HAL_GPIO_WritePin(enableAFRN_GPIO_Port, enableAFRN_Pin, heaterEnable ? GPIO_PIN_RESET : GPIO_PIN_SET);
119
}
120
 
121
/* USER CODE END PFP */
122
 
123
/* Private user code ---------------------------------------------------------*/
124
/* USER CODE BEGIN 0 */
125
 
126
/* USER CODE END 0 */
127
 
128
/**
129
 * @brief  The application entry point.
130
 * @retval int
131
 */
132
int main(void)
133
{
134
  /* USER CODE BEGIN 1 */
135
 
136
  /* USER CODE END 1 */
137
 
138
  /* MCU Configuration--------------------------------------------------------*/
139
 
140
  /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
141
  HAL_Init();
142
 
143
  /* USER CODE BEGIN Init */
144
 
145
  /* USER CODE END Init */
146
 
147
  /* Configure the system clock */
148
  SystemClock_Config();
149
 
150
  /* USER CODE BEGIN SysInit */
151
 
152
  /* USER CODE END SysInit */
153
 
154
  /* Initialize all configured peripherals */
155
  MX_GPIO_Init();
156
  MX_CAN_Init();
157
  MX_SPI1_Init();
158
  MX_USART1_UART_Init();
159
  MX_USART2_UART_Init();
160
  /* USER CODE BEGIN 2 */
161
  init_usart_ctl(&uc1, &huart1, tx1Buffer, rx1Buffer, TX_USART_BUFF_SIZ, RX_USART_BUFF_SIZ);
162
  init_usart_ctl(&uc2, &huart2, tx2Buffer, rx2Buffer, TX_USART_BUFF_SIZ, RX_USART_BUFF_SIZ);
163
 
164
  ResetRxBuffer(&uc1);
165
  ResetRxBuffer(&uc2);
166
 
167
  resetPLX();
168
 
169
  /* USER CODE END 2 */
170
 
171
  /* Infinite loop */
172
  /* USER CODE BEGIN WHILE */
173
  while (1)
174
  {
175
 
176
    pollTinyWB(&uc1, &AFRValue, &temperature);
177
    // Handle PLX
178
    libPLXpollData(&uc2);
179
 
180
    checkHeaterEnable();
181
    /* USER CODE END WHILE */
182
 
183
    /* USER CODE BEGIN 3 */
184
  }
185
  /* USER CODE END 3 */
186
}
187
 
188
/**
189
 * @brief System Clock Configuration
190
 * @retval None
191
 */
192
void SystemClock_Config(void)
193
{
194
  RCC_OscInitTypeDef RCC_OscInitStruct = {0};
195
  RCC_ClkInitTypeDef RCC_ClkInitStruct = {0};
196
 
197
  /** Initializes the RCC Oscillators according to the specified parameters
198
   * in the RCC_OscInitTypeDef structure.
199
   */
200
  RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE;
201
  RCC_OscInitStruct.HSEState = RCC_HSE_ON;
202
  RCC_OscInitStruct.HSEPredivValue = RCC_HSE_PREDIV_DIV1;
203
  RCC_OscInitStruct.HSIState = RCC_HSI_ON;
204
  RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;
205
  RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE;
206
  RCC_OscInitStruct.PLL.PLLMUL = RCC_PLL_MUL8;
207
  if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK)
208
  {
209
    Error_Handler();
210
  }
211
 
212
  /** Initializes the CPU, AHB and APB buses clocks
213
   */
214
  RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK | RCC_CLOCKTYPE_SYSCLK | RCC_CLOCKTYPE_PCLK1 | RCC_CLOCKTYPE_PCLK2;
215
  RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;
216
  RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;
217
  RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV2;
218
  RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV2;
219
 
220
  if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_2) != HAL_OK)
221
  {
222
    Error_Handler();
223
  }
224
}
225
 
226
/**
227
 * @brief CAN Initialization Function
228
 * @param None
229
 * @retval None
230
 */
231
static void MX_CAN_Init(void)
232
{
233
 
234
  /* USER CODE BEGIN CAN_Init 0 */
235
 
236
  /* USER CODE END CAN_Init 0 */
237
 
238
  /* USER CODE BEGIN CAN_Init 1 */
239
 
240
  /* USER CODE END CAN_Init 1 */
241
  hcan.Instance = CAN1;
242
  hcan.Init.Prescaler = 16;
243
  hcan.Init.Mode = CAN_MODE_NORMAL;
244
  hcan.Init.SyncJumpWidth = CAN_SJW_1TQ;
245
  hcan.Init.TimeSeg1 = CAN_BS1_2TQ;
246
  hcan.Init.TimeSeg2 = CAN_BS2_1TQ;
247
  hcan.Init.TimeTriggeredMode = DISABLE;
248
  hcan.Init.AutoBusOff = DISABLE;
249
  hcan.Init.AutoWakeUp = DISABLE;
250
  hcan.Init.AutoRetransmission = DISABLE;
251
  hcan.Init.ReceiveFifoLocked = DISABLE;
252
  hcan.Init.TransmitFifoPriority = DISABLE;
253
  if (HAL_CAN_Init(&hcan) != HAL_OK)
254
  {
255
    Error_Handler();
256
  }
257
  /* USER CODE BEGIN CAN_Init 2 */
258
 
259
  /* USER CODE END CAN_Init 2 */
260
}
261
 
262
/**
263
 * @brief SPI1 Initialization Function
264
 * @param None
265
 * @retval None
266
 */
267
static void MX_SPI1_Init(void)
268
{
269
 
270
  /* USER CODE BEGIN SPI1_Init 0 */
271
 
272
  /* USER CODE END SPI1_Init 0 */
273
 
274
  /* USER CODE BEGIN SPI1_Init 1 */
275
 
276
  /* USER CODE END SPI1_Init 1 */
277
  /* SPI1 parameter configuration*/
278
  hspi1.Instance = SPI1;
279
  hspi1.Init.Mode = SPI_MODE_MASTER;
280
  hspi1.Init.Direction = SPI_DIRECTION_2LINES;
281
  hspi1.Init.DataSize = SPI_DATASIZE_8BIT;
282
  hspi1.Init.CLKPolarity = SPI_POLARITY_LOW;
283
  hspi1.Init.CLKPhase = SPI_PHASE_1EDGE;
284
  hspi1.Init.NSS = SPI_NSS_SOFT;
285
  hspi1.Init.BaudRatePrescaler = SPI_BAUDRATEPRESCALER_2;
286
  hspi1.Init.FirstBit = SPI_FIRSTBIT_MSB;
287
  hspi1.Init.TIMode = SPI_TIMODE_DISABLE;
288
  hspi1.Init.CRCCalculation = SPI_CRCCALCULATION_DISABLE;
289
  hspi1.Init.CRCPolynomial = 10;
290
  if (HAL_SPI_Init(&hspi1) != HAL_OK)
291
  {
292
    Error_Handler();
293
  }
294
  /* USER CODE BEGIN SPI1_Init 2 */
295
 
296
  /* USER CODE END SPI1_Init 2 */
297
}
298
 
299
/**
300
 * @brief USART1 Initialization Function
301
 * @param None
302
 * @retval None
303
 */
304
static void MX_USART1_UART_Init(void)
305
{
306
 
307
  /* USER CODE BEGIN USART1_Init 0 */
308
 
309
  /* USER CODE END USART1_Init 0 */
310
 
311
  /* USER CODE BEGIN USART1_Init 1 */
312
 
313
  /* USER CODE END USART1_Init 1 */
314
  huart1.Instance = USART1;
315
  huart1.Init.BaudRate = 115200;
316
  huart1.Init.WordLength = UART_WORDLENGTH_8B;
317
  huart1.Init.StopBits = UART_STOPBITS_1;
318
  huart1.Init.Parity = UART_PARITY_NONE;
319
  huart1.Init.Mode = UART_MODE_TX_RX;
320
  huart1.Init.HwFlowCtl = UART_HWCONTROL_NONE;
321
  huart1.Init.OverSampling = UART_OVERSAMPLING_16;
322
  if (HAL_UART_Init(&huart1) != HAL_OK)
323
  {
324
    Error_Handler();
325
  }
326
  /* USER CODE BEGIN USART1_Init 2 */
327
 
328
  /* USER CODE END USART1_Init 2 */
329
}
330
 
331
/**
332
 * @brief USART2 Initialization Function
333
 * @param None
334
 * @retval None
335
 */
336
static void MX_USART2_UART_Init(void)
337
{
338
 
339
  /* USER CODE BEGIN USART2_Init 0 */
340
 
341
  /* USER CODE END USART2_Init 0 */
342
 
343
  /* USER CODE BEGIN USART2_Init 1 */
344
 
345
  /* USER CODE END USART2_Init 1 */
346
  huart2.Instance = USART2;
347
  huart2.Init.BaudRate = 19200;
348
  huart2.Init.WordLength = UART_WORDLENGTH_8B;
349
  huart2.Init.StopBits = UART_STOPBITS_1;
350
  huart2.Init.Parity = UART_PARITY_NONE;
351
  huart2.Init.Mode = UART_MODE_TX_RX;
352
  huart2.Init.HwFlowCtl = UART_HWCONTROL_NONE;
353
  huart2.Init.OverSampling = UART_OVERSAMPLING_16;
354
  if (HAL_UART_Init(&huart2) != HAL_OK)
355
  {
356
    Error_Handler();
357
  }
358
  /* USER CODE BEGIN USART2_Init 2 */
359
 
360
  /* USER CODE END USART2_Init 2 */
361
}
362
 
363
/**
364
 * @brief GPIO Initialization Function
365
 * @param None
366
 * @retval None
367
 */
368
static void MX_GPIO_Init(void)
369
{
370
  GPIO_InitTypeDef GPIO_InitStruct = {0};
371
  /* USER CODE BEGIN MX_GPIO_Init_1 */
372
  /* USER CODE END MX_GPIO_Init_1 */
373
 
374
  /* GPIO Ports Clock Enable */
375
  __HAL_RCC_GPIOC_CLK_ENABLE();
376
  __HAL_RCC_GPIOD_CLK_ENABLE();
377
  __HAL_RCC_GPIOA_CLK_ENABLE();
378
  __HAL_RCC_GPIOB_CLK_ENABLE();
379
 
380
  /*Configure GPIO pin Output Level */
381
  HAL_GPIO_WritePin(LED_GPIO_Port, LED_Pin, GPIO_PIN_SET);
382
 
383
  /*Configure GPIO pin Output Level */
384
  HAL_GPIO_WritePin(GPIOA, SPI_CD_Pin | SPI_NSS_Pin, GPIO_PIN_RESET);
385
 
386
  /*Configure GPIO pin Output Level */
387
  HAL_GPIO_WritePin(SPI_RESET_GPIO_Port, SPI_RESET_Pin, GPIO_PIN_RESET);
388
 
389
  /*Configure GPIO pin Output Level */
390
  HAL_GPIO_WritePin(enableAFRN_GPIO_Port, enableAFRN_Pin, GPIO_PIN_RESET);
391
 
392
  /*Configure GPIO pin : LED_Pin */
393
  GPIO_InitStruct.Pin = LED_Pin;
394
  GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
395
  GPIO_InitStruct.Pull = GPIO_NOPULL;
396
  GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
397
  HAL_GPIO_Init(LED_GPIO_Port, &GPIO_InitStruct);
398
 
399
  /*Configure GPIO pins : SPI_CD_Pin SPI_NSS_Pin */
400
  GPIO_InitStruct.Pin = SPI_CD_Pin | SPI_NSS_Pin;
401
  GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
402
  GPIO_InitStruct.Pull = GPIO_NOPULL;
403
  GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
404
  HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
405
 
406
  /*Configure GPIO pin : SPI_RESET_Pin */
407
  GPIO_InitStruct.Pin = SPI_RESET_Pin;
408
  GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
409
  GPIO_InitStruct.Pull = GPIO_NOPULL;
410
  GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
411
  HAL_GPIO_Init(SPI_RESET_GPIO_Port, &GPIO_InitStruct);
412
 
413
  /*Configure GPIO pin : enableAFRN_Pin */
414
  GPIO_InitStruct.Pin = enableAFRN_Pin;
415
  GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
416
  GPIO_InitStruct.Pull = GPIO_NOPULL;
417
  GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
418
  HAL_GPIO_Init(enableAFRN_GPIO_Port, &GPIO_InitStruct);
419
 
420
  /* USER CODE BEGIN MX_GPIO_Init_2 */
421
  /* USER CODE END MX_GPIO_Init_2 */
422
}
423
 
424
/* USER CODE BEGIN 4 */
425
 
426
/* USER CODE END 4 */
427
 
428
/**
429
 * @brief  This function is executed in case of error occurrence.
430
 * @retval None
431
 */
432
void Error_Handler(void)
433
{
434
  /* USER CODE BEGIN Error_Handler_Debug */
435
  /* User can add his own implementation to report the HAL error return state */
436
  __disable_irq();
437
  while (1)
438
  {
439
  }
440
  /* USER CODE END Error_Handler_Debug */
441
}
442
 
443
#ifdef USE_FULL_ASSERT
444
/**
445
 * @brief  Reports the name of the source file and the source line number
446
 *         where the assert_param error has occurred.
447
 * @param  file: pointer to the source file name
448
 * @param  line: assert_param error line source number
449
 * @retval None
450
 */
451
void assert_failed(uint8_t *file, uint32_t line)
452
{
453
  /* USER CODE BEGIN 6 */
454
  /* User can add his own implementation to report the file name and line number,
455
     ex: printf("Wrong parameters value: file %s on line %d\r\n", file, line) */
456
  /* USER CODE END 6 */
457
}
458
#endif /* USE_FULL_ASSERT */