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