Subversion Repositories dashGPS

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
 * <h2><center>&copy; Copyright (c) 2020 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
 
23
/* Private includes ----------------------------------------------------------*/
24
/* USER CODE BEGIN Includes */
25
#include "libSerial/serial.h"
26
#include "nmea.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
/* USER CODE END PD */
37
 
38
/* Private macro -------------------------------------------------------------*/
39
/* USER CODE BEGIN PM */
40
 
41
/* USER CODE END PM */
42
 
43
/* Private variables ---------------------------------------------------------*/
44
CAN_HandleTypeDef hcan;
45
 
46
SPI_HandleTypeDef hspi1;
47
 
48
TIM_HandleTypeDef htim4;
49
 
50
UART_HandleTypeDef huart1;
51
 
52
/* USER CODE BEGIN PV */
53
 
54
/* USER CODE END PV */
55
 
56
/* Private function prototypes -----------------------------------------------*/
57
void SystemClock_Config(void);
58
static void MX_GPIO_Init(void);
59
static void MX_CAN_Init(void);
60
static void MX_SPI1_Init(void);
61
static void MX_TIM4_Init(void);
62
static void MX_USART1_UART_Init(void);
63
/* USER CODE BEGIN PFP */
64
 
65
/* USER CODE END PFP */
66
 
67
/* Private user code ---------------------------------------------------------*/
68
/* USER CODE BEGIN 0 */
69
 
70
/* USER CODE END 0 */
71
 
72
/**
73
  * @brief  The application entry point.
74
  * @retval int
75
  */
76
int main(void)
77
{
78
  /* USER CODE BEGIN 1 */
79
 
80
  /* USER CODE END 1 */
81
 
82
  /* MCU Configuration--------------------------------------------------------*/
83
 
84
  /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
85
  HAL_Init();
86
 
87
  /* USER CODE BEGIN Init */
88
 
89
  /* USER CODE END Init */
90
 
91
  /* Configure the system clock */
92
  SystemClock_Config();
93
 
94
  /* USER CODE BEGIN SysInit */
95
 
96
  /* USER CODE END SysInit */
97
 
98
  /* Initialize all configured peripherals */
99
  MX_GPIO_Init();
100
  MX_CAN_Init();
101
  MX_SPI1_Init();
102
  MX_TIM4_Init();
103
  MX_USART1_UART_Init();
104
  /* USER CODE BEGIN 2 */
105
  __HAL_RCC_USART1_CLK_ENABLE();
106
  /* setup the USART control blocks */
107
  init_usart_ctl(&uc1, huart1.Instance);
108
 
109
  EnableSerialRxInterrupt (&uc1);
110
 
111
  /* USER CODE END 2 */
112
 
113
  /* Infinite loop */
114
  /* USER CODE BEGIN WHILE */
115
  while (1)
116
    {
117
 
118
         Location loc;
119
         uint8_t stat = updateLocation(&loc);
120
 
121
 
122
    /* USER CODE END WHILE */
123
 
124
    /* USER CODE BEGIN 3 */
125
    }
126
  /* USER CODE END 3 */
127
}
128
 
129
/**
130
  * @brief System Clock Configuration
131
  * @retval None
132
  */
133
void SystemClock_Config(void)
134
{
135
  RCC_OscInitTypeDef RCC_OscInitStruct = {0};
136
  RCC_ClkInitTypeDef RCC_ClkInitStruct = {0};
137
 
138
  /** Initializes the RCC Oscillators according to the specified parameters
139
  * in the RCC_OscInitTypeDef structure.
140
  */
141
  RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE;
142
  RCC_OscInitStruct.HSEState = RCC_HSE_ON;
143
  RCC_OscInitStruct.HSEPredivValue = RCC_HSE_PREDIV_DIV1;
144
  RCC_OscInitStruct.HSIState = RCC_HSI_ON;
145
  RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;
146
  RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE;
147
  RCC_OscInitStruct.PLL.PLLMUL = RCC_PLL_MUL8;
148
  if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK)
149
  {
150
    Error_Handler();
151
  }
152
  /** Initializes the CPU, AHB and APB buses clocks
153
  */
154
  RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK
155
                              |RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2;
156
  RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;
157
  RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;
158
  RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV2;
159
  RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1;
160
 
161
  if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_2) != HAL_OK)
162
  {
163
    Error_Handler();
164
  }
165
}
166
 
167
/**
168
  * @brief CAN Initialization Function
169
  * @param None
170
  * @retval None
171
  */
172
static void MX_CAN_Init(void)
173
{
174
 
175
  /* USER CODE BEGIN CAN_Init 0 */
176
 
177
  /* USER CODE END CAN_Init 0 */
178
 
179
  /* USER CODE BEGIN CAN_Init 1 */
180
 
181
  /* USER CODE END CAN_Init 1 */
182
  hcan.Instance = CAN1;
183
  hcan.Init.Prescaler = 16;
184
  hcan.Init.Mode = CAN_MODE_NORMAL;
185
  hcan.Init.SyncJumpWidth = CAN_SJW_1TQ;
186
  hcan.Init.TimeSeg1 = CAN_BS1_1TQ;
187
  hcan.Init.TimeSeg2 = CAN_BS2_1TQ;
188
  hcan.Init.TimeTriggeredMode = DISABLE;
189
  hcan.Init.AutoBusOff = DISABLE;
190
  hcan.Init.AutoWakeUp = DISABLE;
191
  hcan.Init.AutoRetransmission = DISABLE;
192
  hcan.Init.ReceiveFifoLocked = DISABLE;
193
  hcan.Init.TransmitFifoPriority = DISABLE;
194
  if (HAL_CAN_Init(&hcan) != HAL_OK)
195
  {
196
    Error_Handler();
197
  }
198
  /* USER CODE BEGIN CAN_Init 2 */
199
 
200
  /* USER CODE END CAN_Init 2 */
201
 
202
}
203
 
204
/**
205
  * @brief SPI1 Initialization Function
206
  * @param None
207
  * @retval None
208
  */
209
static void MX_SPI1_Init(void)
210
{
211
 
212
  /* USER CODE BEGIN SPI1_Init 0 */
213
 
214
  /* USER CODE END SPI1_Init 0 */
215
 
216
  /* USER CODE BEGIN SPI1_Init 1 */
217
 
218
  /* USER CODE END SPI1_Init 1 */
219
  /* SPI1 parameter configuration*/
220
  hspi1.Instance = SPI1;
221
  hspi1.Init.Mode = SPI_MODE_MASTER;
222
  hspi1.Init.Direction = SPI_DIRECTION_1LINE;
223
  hspi1.Init.DataSize = SPI_DATASIZE_8BIT;
224
  hspi1.Init.CLKPolarity = SPI_POLARITY_LOW;
225
  hspi1.Init.CLKPhase = SPI_PHASE_1EDGE;
226
  hspi1.Init.NSS = SPI_NSS_SOFT;
227
  hspi1.Init.BaudRatePrescaler = SPI_BAUDRATEPRESCALER_8;
228
  hspi1.Init.FirstBit = SPI_FIRSTBIT_MSB;
229
  hspi1.Init.TIMode = SPI_TIMODE_DISABLE;
230
  hspi1.Init.CRCCalculation = SPI_CRCCALCULATION_DISABLE;
231
  hspi1.Init.CRCPolynomial = 10;
232
  if (HAL_SPI_Init(&hspi1) != HAL_OK)
233
  {
234
    Error_Handler();
235
  }
236
  /* USER CODE BEGIN SPI1_Init 2 */
237
 
238
  /* USER CODE END SPI1_Init 2 */
239
 
240
}
241
 
242
/**
243
  * @brief TIM4 Initialization Function
244
  * @param None
245
  * @retval None
246
  */
247
static void MX_TIM4_Init(void)
248
{
249
 
250
  /* USER CODE BEGIN TIM4_Init 0 */
251
 
252
  /* USER CODE END TIM4_Init 0 */
253
 
254
  TIM_Encoder_InitTypeDef sConfig = {0};
255
  TIM_MasterConfigTypeDef sMasterConfig = {0};
256
 
257
  /* USER CODE BEGIN TIM4_Init 1 */
258
 
259
  /* USER CODE END TIM4_Init 1 */
260
  htim4.Instance = TIM4;
261
  htim4.Init.Prescaler = 0;
262
  htim4.Init.CounterMode = TIM_COUNTERMODE_UP;
263
  htim4.Init.Period = 65535;
264
  htim4.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;
265
  htim4.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_DISABLE;
266
  sConfig.EncoderMode = TIM_ENCODERMODE_TI12;
267
  sConfig.IC1Polarity = TIM_ICPOLARITY_RISING;
268
  sConfig.IC1Selection = TIM_ICSELECTION_DIRECTTI;
269
  sConfig.IC1Prescaler = TIM_ICPSC_DIV1;
270
  sConfig.IC1Filter = 8;
271
  sConfig.IC2Polarity = TIM_ICPOLARITY_RISING;
272
  sConfig.IC2Selection = TIM_ICSELECTION_DIRECTTI;
273
  sConfig.IC2Prescaler = TIM_ICPSC_DIV1;
274
  sConfig.IC2Filter = 8;
275
  if (HAL_TIM_Encoder_Init(&htim4, &sConfig) != HAL_OK)
276
  {
277
    Error_Handler();
278
  }
279
  sMasterConfig.MasterOutputTrigger = TIM_TRGO_RESET;
280
  sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE;
281
  if (HAL_TIMEx_MasterConfigSynchronization(&htim4, &sMasterConfig) != HAL_OK)
282
  {
283
    Error_Handler();
284
  }
285
  /* USER CODE BEGIN TIM4_Init 2 */
286
 
287
  /* USER CODE END TIM4_Init 2 */
288
 
289
}
290
 
291
/**
292
  * @brief USART1 Initialization Function
293
  * @param None
294
  * @retval None
295
  */
296
static void MX_USART1_UART_Init(void)
297
{
298
 
299
  /* USER CODE BEGIN USART1_Init 0 */
300
 
301
  /* USER CODE END USART1_Init 0 */
302
 
303
  /* USER CODE BEGIN USART1_Init 1 */
304
 
305
  /* USER CODE END USART1_Init 1 */
306
  huart1.Instance = USART1;
307
  huart1.Init.BaudRate = 115200;
308
  huart1.Init.WordLength = UART_WORDLENGTH_8B;
309
  huart1.Init.StopBits = UART_STOPBITS_1;
310
  huart1.Init.Parity = UART_PARITY_NONE;
311
  huart1.Init.Mode = UART_MODE_TX_RX;
312
  huart1.Init.HwFlowCtl = UART_HWCONTROL_NONE;
313
  huart1.Init.OverSampling = UART_OVERSAMPLING_16;
314
  if (HAL_UART_Init(&huart1) != HAL_OK)
315
  {
316
    Error_Handler();
317
  }
318
  /* USER CODE BEGIN USART1_Init 2 */
319
 
320
  /* USER CODE END USART1_Init 2 */
321
 
322
}
323
 
324
/**
325
  * @brief GPIO Initialization Function
326
  * @param None
327
  * @retval None
328
  */
329
static void MX_GPIO_Init(void)
330
{
331
  GPIO_InitTypeDef GPIO_InitStruct = {0};
332
 
333
  /* GPIO Ports Clock Enable */
334
  __HAL_RCC_GPIOD_CLK_ENABLE();
335
  __HAL_RCC_GPIOA_CLK_ENABLE();
336
  __HAL_RCC_GPIOC_CLK_ENABLE();
337
  __HAL_RCC_GPIOB_CLK_ENABLE();
338
 
339
  /*Configure GPIO pin Output Level */
340
  HAL_GPIO_WritePin(GPIOA, SPI_NSS1_Pin|SPI_CD_Pin, GPIO_PIN_RESET);
341
 
342
  /*Configure GPIO pin Output Level */
343
  HAL_GPIO_WritePin(SPI_RESET_GPIO_Port, SPI_RESET_Pin, GPIO_PIN_RESET);
344
 
345
  /*Configure GPIO pins : SPI_NSS1_Pin SPI_CD_Pin */
346
  GPIO_InitStruct.Pin = SPI_NSS1_Pin|SPI_CD_Pin;
347
  GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
348
  GPIO_InitStruct.Pull = GPIO_NOPULL;
349
  GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
350
  HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
351
 
352
  /*Configure GPIO pin : SPI_RESET_Pin */
353
  GPIO_InitStruct.Pin = SPI_RESET_Pin;
354
  GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
355
  GPIO_InitStruct.Pull = GPIO_NOPULL;
356
  GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
357
  HAL_GPIO_Init(SPI_RESET_GPIO_Port, &GPIO_InitStruct);
358
 
359
}
360
 
361
/* USER CODE BEGIN 4 */
362
 
363
/* USER CODE END 4 */
364
 
365
/**
366
  * @brief  This function is executed in case of error occurrence.
367
  * @retval None
368
  */
369
void Error_Handler(void)
370
{
371
  /* USER CODE BEGIN Error_Handler_Debug */
372
  /* User can add his own implementation to report the HAL error return state */
373
 
374
  /* USER CODE END Error_Handler_Debug */
375
}
376
 
377
#ifdef  USE_FULL_ASSERT
378
/**
379
  * @brief  Reports the name of the source file and the source line number
380
  *         where the assert_param error has occurred.
381
  * @param  file: pointer to the source file name
382
  * @param  line: assert_param error line source number
383
  * @retval None
384
  */
385
void assert_failed(uint8_t *file, uint32_t line)
386
{
387
  /* USER CODE BEGIN 6 */
388
  /* User can add his own implementation to report the file name and line number,
389
     tex: printf("Wrong parameters value: file %s on line %d\r\n", file, line) */
390
  /* USER CODE END 6 */
391
}
392
#endif /* USE_FULL_ASSERT */
393
 
394
/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/