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
25 /* USER CODE END Includes */
26
27 /* Private typedef -----------------------------------------------------------*/
28 /* USER CODE BEGIN PTD */
29
30 /* USER CODE END PTD */
31
32 /* Private define ------------------------------------------------------------*/
33 /* USER CODE BEGIN PD */
34
35 /* USER CODE END PD */
36
37 /* Private macro -------------------------------------------------------------*/
38 /* USER CODE BEGIN PM */
39
40 /* USER CODE END PM */
41
42 /* Private variables ---------------------------------------------------------*/
43
44 DCMI_HandleTypeDef hdcmi;
45
46 QSPI_HandleTypeDef hqspi;
47
48 RTC_HandleTypeDef hrtc;
49
50 SD_HandleTypeDef hsd1;
51
52 SPI_HandleTypeDef hspi4;
53
54 UART_HandleTypeDef huart1;
55
56 /* USER CODE BEGIN PV */
57
58 /* USER CODE END PV */
59
60 /* Private function prototypes -----------------------------------------------*/
61 void SystemClock_Config(void);
62 static void MX_GPIO_Init(void);
63 static void MX_QUADSPI_Init(void);
64 static void MX_DCMI_Init(void);
65 static void MX_RTC_Init(void);
66 static void MX_SDMMC1_SD_Init(void);
67 static void MX_USART1_UART_Init(void);
68 static void MX_SPI4_Init(void);
69 /* USER CODE BEGIN PFP */
70
71 /* USER CODE END PFP */
72
73 /* Private user code ---------------------------------------------------------*/
74 /* USER CODE BEGIN 0 */
75
76 /* USER CODE END 0 */
77
78 /**
79 * @brief The application entry point.
80 * @retval int
81 */
main(void)82 int main(void)
83 {
84 /* USER CODE BEGIN 1 */
85
86 /* USER CODE END 1 */
87
88 /* Enable I-Cache---------------------------------------------------------*/
89 SCB_EnableICache();
90
91 /* Enable D-Cache---------------------------------------------------------*/
92 SCB_EnableDCache();
93
94 /* MCU Configuration--------------------------------------------------------*/
95
96 /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
97 HAL_Init();
98
99 /* USER CODE BEGIN Init */
100
101 /* USER CODE END Init */
102
103 /* Configure the system clock */
104 SystemClock_Config();
105
106 /* USER CODE BEGIN SysInit */
107
108 /* USER CODE END SysInit */
109
110 /* Initialize all configured peripherals */
111 MX_GPIO_Init();
112 MX_QUADSPI_Init();
113 MX_DCMI_Init();
114 MX_RTC_Init();
115 MX_SDMMC1_SD_Init();
116 MX_USART1_UART_Init();
117 MX_SPI4_Init();
118 /* USER CODE BEGIN 2 */
119
120 /* USER CODE END 2 */
121
122 /* Infinite loop */
123 /* USER CODE BEGIN WHILE */
124 while (1)
125 {
126 /* USER CODE END WHILE */
127
128 /* USER CODE BEGIN 3 */
129 }
130 /* USER CODE END 3 */
131 }
132
133 /**
134 * @brief System Clock Configuration
135 * @retval None
136 */
SystemClock_Config(void)137 void SystemClock_Config(void)
138 {
139 RCC_OscInitTypeDef RCC_OscInitStruct = {0};
140 RCC_ClkInitTypeDef RCC_ClkInitStruct = {0};
141
142 /** Supply configuration update enable
143 */
144 HAL_PWREx_ConfigSupply(PWR_LDO_SUPPLY);
145
146 /** Configure the main internal regulator output voltage
147 */
148 __HAL_PWR_VOLTAGESCALING_CONFIG(PWR_REGULATOR_VOLTAGE_SCALE1);
149
150 while(!__HAL_PWR_GET_FLAG(PWR_FLAG_VOSRDY)) {}
151
152 __HAL_RCC_SYSCFG_CLK_ENABLE();
153 __HAL_PWR_VOLTAGESCALING_CONFIG(PWR_REGULATOR_VOLTAGE_SCALE0);
154
155 while(!__HAL_PWR_GET_FLAG(PWR_FLAG_VOSRDY)) {}
156
157 /** Configure LSE Drive Capability
158 */
159 HAL_PWR_EnableBkUpAccess();
160 __HAL_RCC_LSEDRIVE_CONFIG(RCC_LSEDRIVE_LOW);
161
162 /** Initializes the RCC Oscillators according to the specified parameters
163 * in the RCC_OscInitTypeDef structure.
164 */
165 RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE|RCC_OSCILLATORTYPE_LSE;
166 RCC_OscInitStruct.HSEState = RCC_HSE_ON;
167 RCC_OscInitStruct.LSEState = RCC_LSE_ON;
168 RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;
169 RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE;
170 RCC_OscInitStruct.PLL.PLLM = 5;
171 RCC_OscInitStruct.PLL.PLLN = 192;
172 RCC_OscInitStruct.PLL.PLLP = 2;
173 RCC_OscInitStruct.PLL.PLLQ = 4;
174 RCC_OscInitStruct.PLL.PLLR = 2;
175 RCC_OscInitStruct.PLL.PLLRGE = RCC_PLL1VCIRANGE_2;
176 RCC_OscInitStruct.PLL.PLLVCOSEL = RCC_PLL1VCOWIDE;
177 RCC_OscInitStruct.PLL.PLLFRACN = 0;
178 if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK)
179 {
180 Error_Handler();
181 }
182
183 /** Initializes the CPU, AHB and APB buses clocks
184 */
185 RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK
186 |RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2
187 |RCC_CLOCKTYPE_D3PCLK1|RCC_CLOCKTYPE_D1PCLK1;
188 RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;
189 RCC_ClkInitStruct.SYSCLKDivider = RCC_SYSCLK_DIV1;
190 RCC_ClkInitStruct.AHBCLKDivider = RCC_HCLK_DIV2;
191 RCC_ClkInitStruct.APB3CLKDivider = RCC_APB3_DIV2;
192 RCC_ClkInitStruct.APB1CLKDivider = RCC_APB1_DIV2;
193 RCC_ClkInitStruct.APB2CLKDivider = RCC_APB2_DIV2;
194 RCC_ClkInitStruct.APB4CLKDivider = RCC_APB4_DIV2;
195
196 if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_4) != HAL_OK)
197 {
198 Error_Handler();
199 }
200 }
201
202 /**
203 * @brief DCMI Initialization Function
204 * @param None
205 * @retval None
206 */
MX_DCMI_Init(void)207 static void MX_DCMI_Init(void)
208 {
209
210 /* USER CODE BEGIN DCMI_Init 0 */
211
212 /* USER CODE END DCMI_Init 0 */
213
214 /* USER CODE BEGIN DCMI_Init 1 */
215
216 /* USER CODE END DCMI_Init 1 */
217 hdcmi.Instance = DCMI;
218 hdcmi.Init.SynchroMode = DCMI_SYNCHRO_HARDWARE;
219 hdcmi.Init.PCKPolarity = DCMI_PCKPOLARITY_RISING;
220 hdcmi.Init.VSPolarity = DCMI_VSPOLARITY_LOW;
221 hdcmi.Init.HSPolarity = DCMI_HSPOLARITY_LOW;
222 hdcmi.Init.CaptureRate = DCMI_CR_ALL_FRAME;
223 hdcmi.Init.ExtendedDataMode = DCMI_EXTEND_DATA_8B;
224 hdcmi.Init.JPEGMode = DCMI_JPEG_DISABLE;
225 hdcmi.Init.ByteSelectMode = DCMI_BSM_ALL;
226 hdcmi.Init.ByteSelectStart = DCMI_OEBS_ODD;
227 hdcmi.Init.LineSelectMode = DCMI_LSM_ALL;
228 hdcmi.Init.LineSelectStart = DCMI_OELS_ODD;
229 if (HAL_DCMI_Init(&hdcmi) != HAL_OK)
230 {
231 Error_Handler();
232 }
233 /* USER CODE BEGIN DCMI_Init 2 */
234
235 /* USER CODE END DCMI_Init 2 */
236
237 }
238
239 /**
240 * @brief QUADSPI Initialization Function
241 * @param None
242 * @retval None
243 */
MX_QUADSPI_Init(void)244 static void MX_QUADSPI_Init(void)
245 {
246
247 /* USER CODE BEGIN QUADSPI_Init 0 */
248
249 /* USER CODE END QUADSPI_Init 0 */
250
251 /* USER CODE BEGIN QUADSPI_Init 1 */
252
253 /* USER CODE END QUADSPI_Init 1 */
254 /* QUADSPI parameter configuration*/
255 hqspi.Instance = QUADSPI;
256 hqspi.Init.ClockPrescaler = 1;
257 hqspi.Init.FifoThreshold = 32;
258 hqspi.Init.SampleShifting = QSPI_SAMPLE_SHIFTING_HALFCYCLE;
259 hqspi.Init.FlashSize = 22;
260 hqspi.Init.ChipSelectHighTime = QSPI_CS_HIGH_TIME_1_CYCLE;
261 hqspi.Init.ClockMode = QSPI_CLOCK_MODE_3;
262 hqspi.Init.FlashID = QSPI_FLASH_ID_1;
263 hqspi.Init.DualFlash = QSPI_DUALFLASH_DISABLE;
264 if (HAL_QSPI_Init(&hqspi) != HAL_OK)
265 {
266 Error_Handler();
267 }
268 /* USER CODE BEGIN QUADSPI_Init 2 */
269
270 /* USER CODE END QUADSPI_Init 2 */
271
272 }
273
274 /**
275 * @brief RTC Initialization Function
276 * @param None
277 * @retval None
278 */
MX_RTC_Init(void)279 static void MX_RTC_Init(void)
280 {
281
282 /* USER CODE BEGIN RTC_Init 0 */
283
284 /* USER CODE END RTC_Init 0 */
285
286 /* USER CODE BEGIN RTC_Init 1 */
287
288 /* USER CODE END RTC_Init 1 */
289
290 /** Initialize RTC Only
291 */
292 hrtc.Instance = RTC;
293 hrtc.Init.HourFormat = RTC_HOURFORMAT_24;
294 hrtc.Init.AsynchPrediv = 127;
295 hrtc.Init.SynchPrediv = 255;
296 hrtc.Init.OutPut = RTC_OUTPUT_DISABLE;
297 hrtc.Init.OutPutPolarity = RTC_OUTPUT_POLARITY_HIGH;
298 hrtc.Init.OutPutType = RTC_OUTPUT_TYPE_OPENDRAIN;
299 hrtc.Init.OutPutRemap = RTC_OUTPUT_REMAP_NONE;
300 if (HAL_RTC_Init(&hrtc) != HAL_OK)
301 {
302 Error_Handler();
303 }
304 /* USER CODE BEGIN RTC_Init 2 */
305
306 /* USER CODE END RTC_Init 2 */
307
308 }
309
310 /**
311 * @brief SDMMC1 Initialization Function
312 * @param None
313 * @retval None
314 */
MX_SDMMC1_SD_Init(void)315 static void MX_SDMMC1_SD_Init(void)
316 {
317
318 /* USER CODE BEGIN SDMMC1_Init 0 */
319
320 /* USER CODE END SDMMC1_Init 0 */
321
322 /* USER CODE BEGIN SDMMC1_Init 1 */
323
324 /* USER CODE END SDMMC1_Init 1 */
325 hsd1.Instance = SDMMC1;
326 hsd1.Init.ClockEdge = SDMMC_CLOCK_EDGE_RISING;
327 hsd1.Init.ClockPowerSave = SDMMC_CLOCK_POWER_SAVE_DISABLE;
328 hsd1.Init.BusWide = SDMMC_BUS_WIDE_4B;
329 hsd1.Init.HardwareFlowControl = SDMMC_HARDWARE_FLOW_CONTROL_DISABLE;
330 hsd1.Init.ClockDiv = 6;
331 if (HAL_SD_Init(&hsd1) != HAL_OK)
332 {
333 Error_Handler();
334 }
335 /* USER CODE BEGIN SDMMC1_Init 2 */
336
337 /* USER CODE END SDMMC1_Init 2 */
338
339 }
340
341 /**
342 * @brief SPI4 Initialization Function
343 * @param None
344 * @retval None
345 */
MX_SPI4_Init(void)346 static void MX_SPI4_Init(void)
347 {
348
349 /* USER CODE BEGIN SPI4_Init 0 */
350
351 /* USER CODE END SPI4_Init 0 */
352
353 /* USER CODE BEGIN SPI4_Init 1 */
354
355 /* USER CODE END SPI4_Init 1 */
356 /* SPI4 parameter configuration*/
357 hspi4.Instance = SPI4;
358 hspi4.Init.Mode = SPI_MODE_MASTER;
359 hspi4.Init.Direction = SPI_DIRECTION_2LINES_TXONLY;
360 hspi4.Init.DataSize = SPI_DATASIZE_8BIT;
361 hspi4.Init.CLKPolarity = SPI_POLARITY_LOW;
362 hspi4.Init.CLKPhase = SPI_PHASE_1EDGE;
363 hspi4.Init.NSS = SPI_NSS_HARD_OUTPUT;
364 hspi4.Init.BaudRatePrescaler = SPI_BAUDRATEPRESCALER_2;
365 hspi4.Init.FirstBit = SPI_FIRSTBIT_MSB;
366 hspi4.Init.TIMode = SPI_TIMODE_DISABLE;
367 hspi4.Init.CRCCalculation = SPI_CRCCALCULATION_DISABLE;
368 hspi4.Init.CRCPolynomial = 0x0;
369 hspi4.Init.NSSPMode = SPI_NSS_PULSE_ENABLE;
370 hspi4.Init.NSSPolarity = SPI_NSS_POLARITY_LOW;
371 hspi4.Init.FifoThreshold = SPI_FIFO_THRESHOLD_02DATA;
372 hspi4.Init.TxCRCInitializationPattern = SPI_CRC_INITIALIZATION_ALL_ZERO_PATTERN;
373 hspi4.Init.RxCRCInitializationPattern = SPI_CRC_INITIALIZATION_ALL_ZERO_PATTERN;
374 hspi4.Init.MasterSSIdleness = SPI_MASTER_SS_IDLENESS_00CYCLE;
375 hspi4.Init.MasterInterDataIdleness = SPI_MASTER_INTERDATA_IDLENESS_00CYCLE;
376 hspi4.Init.MasterReceiverAutoSusp = SPI_MASTER_RX_AUTOSUSP_DISABLE;
377 hspi4.Init.MasterKeepIOState = SPI_MASTER_KEEP_IO_STATE_DISABLE;
378 hspi4.Init.IOSwap = SPI_IO_SWAP_DISABLE;
379 if (HAL_SPI_Init(&hspi4) != HAL_OK)
380 {
381 Error_Handler();
382 }
383 /* USER CODE BEGIN SPI4_Init 2 */
384
385 /* USER CODE END SPI4_Init 2 */
386
387 }
388
389 /**
390 * @brief USART1 Initialization Function
391 * @param None
392 * @retval None
393 */
MX_USART1_UART_Init(void)394 static void MX_USART1_UART_Init(void)
395 {
396
397 /* USER CODE BEGIN USART1_Init 0 */
398
399 /* USER CODE END USART1_Init 0 */
400
401 /* USER CODE BEGIN USART1_Init 1 */
402
403 /* USER CODE END USART1_Init 1 */
404 huart1.Instance = USART1;
405 huart1.Init.BaudRate = 115200;
406 huart1.Init.WordLength = UART_WORDLENGTH_8B;
407 huart1.Init.StopBits = UART_STOPBITS_1;
408 huart1.Init.Parity = UART_PARITY_NONE;
409 huart1.Init.Mode = UART_MODE_TX_RX;
410 huart1.Init.HwFlowCtl = UART_HWCONTROL_NONE;
411 huart1.Init.OverSampling = UART_OVERSAMPLING_16;
412 huart1.Init.OneBitSampling = UART_ONE_BIT_SAMPLE_DISABLE;
413 huart1.Init.ClockPrescaler = UART_PRESCALER_DIV1;
414 huart1.AdvancedInit.AdvFeatureInit = UART_ADVFEATURE_NO_INIT;
415 if (HAL_UART_Init(&huart1) != HAL_OK)
416 {
417 Error_Handler();
418 }
419 if (HAL_UARTEx_SetTxFifoThreshold(&huart1, UART_TXFIFO_THRESHOLD_1_8) != HAL_OK)
420 {
421 Error_Handler();
422 }
423 if (HAL_UARTEx_SetRxFifoThreshold(&huart1, UART_RXFIFO_THRESHOLD_1_8) != HAL_OK)
424 {
425 Error_Handler();
426 }
427 if (HAL_UARTEx_DisableFifoMode(&huart1) != HAL_OK)
428 {
429 Error_Handler();
430 }
431 /* USER CODE BEGIN USART1_Init 2 */
432
433 /* USER CODE END USART1_Init 2 */
434
435 }
436
437 /**
438 * @brief GPIO Initialization Function
439 * @param None
440 * @retval None
441 */
MX_GPIO_Init(void)442 static void MX_GPIO_Init(void)
443 {
444 /* USER CODE BEGIN MX_GPIO_Init_1 */
445 /* USER CODE END MX_GPIO_Init_1 */
446
447 /* GPIO Ports Clock Enable */
448 __HAL_RCC_GPIOE_CLK_ENABLE();
449 __HAL_RCC_GPIOC_CLK_ENABLE();
450 __HAL_RCC_GPIOH_CLK_ENABLE();
451 __HAL_RCC_GPIOA_CLK_ENABLE();
452 __HAL_RCC_GPIOB_CLK_ENABLE();
453 __HAL_RCC_GPIOD_CLK_ENABLE();
454
455 /* USER CODE BEGIN MX_GPIO_Init_2 */
456 /* USER CODE END MX_GPIO_Init_2 */
457 }
458
459 /* USER CODE BEGIN 4 */
460
461 /* USER CODE END 4 */
462
463 /**
464 * @brief This function is executed in case of error occurrence.
465 * @retval None
466 */
Error_Handler(void)467 void Error_Handler(void)
468 {
469 /* USER CODE BEGIN Error_Handler_Debug */
470 /* User can add his own implementation to report the HAL error return state */
471 __disable_irq();
472 while (1)
473 {
474 }
475 /* USER CODE END Error_Handler_Debug */
476 }
477
478 #ifdef USE_FULL_ASSERT
479 /**
480 * @brief Reports the name of the source file and the source line number
481 * where the assert_param error has occurred.
482 * @param file: pointer to the source file name
483 * @param line: assert_param error line source number
484 * @retval None
485 */
assert_failed(uint8_t * file,uint32_t line)486 void assert_failed(uint8_t *file, uint32_t line)
487 {
488 /* USER CODE BEGIN 6 */
489 /* User can add his own implementation to report the file name and line number,
490 ex: printf("Wrong parameters value: file %s on line %d\r\n", file, line) */
491 /* USER CODE END 6 */
492 }
493 #endif /* USE_FULL_ASSERT */
494