xref: /aosp_15_r20/external/ms-tpm-20-ref/Samples/Nucleo-TPM/L476RG/Src/main.c (revision 5c591343844d1f9da7da26467c4bf7efc8a7a413)
1*5c591343SA. Cody Schuffelen 
2*5c591343SA. Cody Schuffelen /**
3*5c591343SA. Cody Schuffelen   ******************************************************************************
4*5c591343SA. Cody Schuffelen   * @file           : main.c
5*5c591343SA. Cody Schuffelen   * @brief          : Main program body
6*5c591343SA. Cody Schuffelen   ******************************************************************************
7*5c591343SA. Cody Schuffelen   * This notice applies to any and all portions of this file
8*5c591343SA. Cody Schuffelen   * that are not between comment pairs USER CODE BEGIN and
9*5c591343SA. Cody Schuffelen   * USER CODE END. Other portions of this file, whether
10*5c591343SA. Cody Schuffelen   * inserted by the user or by software development tools
11*5c591343SA. Cody Schuffelen   * are owned by their respective copyright owners.
12*5c591343SA. Cody Schuffelen   *
13*5c591343SA. Cody Schuffelen   * Copyright (c) 2018 STMicroelectronics International N.V.
14*5c591343SA. Cody Schuffelen   * All rights reserved.
15*5c591343SA. Cody Schuffelen   *
16*5c591343SA. Cody Schuffelen   * Redistribution and use in source and binary forms, with or without
17*5c591343SA. Cody Schuffelen   * modification, are permitted, provided that the following conditions are met:
18*5c591343SA. Cody Schuffelen   *
19*5c591343SA. Cody Schuffelen   * 1. Redistribution of source code must retain the above copyright notice,
20*5c591343SA. Cody Schuffelen   *    this list of conditions and the following disclaimer.
21*5c591343SA. Cody Schuffelen   * 2. Redistributions in binary form must reproduce the above copyright notice,
22*5c591343SA. Cody Schuffelen   *    this list of conditions and the following disclaimer in the documentation
23*5c591343SA. Cody Schuffelen   *    and/or other materials provided with the distribution.
24*5c591343SA. Cody Schuffelen   * 3. Neither the name of STMicroelectronics nor the names of other
25*5c591343SA. Cody Schuffelen   *    contributors to this software may be used to endorse or promote products
26*5c591343SA. Cody Schuffelen   *    derived from this software without specific written permission.
27*5c591343SA. Cody Schuffelen   * 4. This software, including modifications and/or derivative works of this
28*5c591343SA. Cody Schuffelen   *    software, must execute solely and exclusively on microcontroller or
29*5c591343SA. Cody Schuffelen   *    microprocessor devices manufactured by or for STMicroelectronics.
30*5c591343SA. Cody Schuffelen   * 5. Redistribution and use of this software other than as permitted under
31*5c591343SA. Cody Schuffelen   *    this license is void and will automatically terminate your rights under
32*5c591343SA. Cody Schuffelen   *    this license.
33*5c591343SA. Cody Schuffelen   *
34*5c591343SA. Cody Schuffelen   * THIS SOFTWARE IS PROVIDED BY STMICROELECTRONICS AND CONTRIBUTORS "AS IS"
35*5c591343SA. Cody Schuffelen   * AND ANY EXPRESS, IMPLIED OR STATUTORY WARRANTIES, INCLUDING, BUT NOT
36*5c591343SA. Cody Schuffelen   * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A
37*5c591343SA. Cody Schuffelen   * PARTICULAR PURPOSE AND NON-INFRINGEMENT OF THIRD PARTY INTELLECTUAL PROPERTY
38*5c591343SA. Cody Schuffelen   * RIGHTS ARE DISCLAIMED TO THE FULLEST EXTENT PERMITTED BY LAW. IN NO EVENT
39*5c591343SA. Cody Schuffelen   * SHALL STMICROELECTRONICS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
40*5c591343SA. Cody Schuffelen   * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
41*5c591343SA. Cody Schuffelen   * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA,
42*5c591343SA. Cody Schuffelen   * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
43*5c591343SA. Cody Schuffelen   * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
44*5c591343SA. Cody Schuffelen   * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
45*5c591343SA. Cody Schuffelen   * EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
46*5c591343SA. Cody Schuffelen   *
47*5c591343SA. Cody Schuffelen   ******************************************************************************
48*5c591343SA. Cody Schuffelen   */
49*5c591343SA. Cody Schuffelen /* Includes ------------------------------------------------------------------*/
50*5c591343SA. Cody Schuffelen #include "main.h"
51*5c591343SA. Cody Schuffelen #include "stm32l4xx_hal.h"
52*5c591343SA. Cody Schuffelen #include "usb_device.h"
53*5c591343SA. Cody Schuffelen 
54*5c591343SA. Cody Schuffelen /* USER CODE BEGIN Includes */
55*5c591343SA. Cody Schuffelen #include <stdint.h>
56*5c591343SA. Cody Schuffelen #include <stdbool.h>
57*5c591343SA. Cody Schuffelen #include <time.h>
58*5c591343SA. Cody Schuffelen #include "TpmDevice.h"
59*5c591343SA. Cody Schuffelen #include "StmUtil.h"
60*5c591343SA. Cody Schuffelen 
61*5c591343SA. Cody Schuffelen /* USER CODE END Includes */
62*5c591343SA. Cody Schuffelen 
63*5c591343SA. Cody Schuffelen /* Private variables ---------------------------------------------------------*/
64*5c591343SA. Cody Schuffelen RNG_HandleTypeDef hrng;
65*5c591343SA. Cody Schuffelen 
66*5c591343SA. Cody Schuffelen RTC_HandleTypeDef hrtc;
67*5c591343SA. Cody Schuffelen 
68*5c591343SA. Cody Schuffelen UART_HandleTypeDef huart2;
69*5c591343SA. Cody Schuffelen 
70*5c591343SA. Cody Schuffelen /* USER CODE BEGIN PV */
71*5c591343SA. Cody Schuffelen /* Private variables ---------------------------------------------------------*/
72*5c591343SA. Cody Schuffelen 
73*5c591343SA. Cody Schuffelen /* USER CODE END PV */
74*5c591343SA. Cody Schuffelen 
75*5c591343SA. Cody Schuffelen /* Private function prototypes -----------------------------------------------*/
76*5c591343SA. Cody Schuffelen void SystemClock_Config(void);
77*5c591343SA. Cody Schuffelen static void MX_GPIO_Init(void);
78*5c591343SA. Cody Schuffelen static void MX_RNG_Init(void);
79*5c591343SA. Cody Schuffelen static void MX_RTC_Init(void);
80*5c591343SA. Cody Schuffelen static void MX_USART2_UART_Init(void);
81*5c591343SA. Cody Schuffelen 
82*5c591343SA. Cody Schuffelen /* USER CODE BEGIN PFP */
83*5c591343SA. Cody Schuffelen /* Private function prototypes -----------------------------------------------*/
84*5c591343SA. Cody Schuffelen #define CPU_CORE_FREQUENCY_HZ 800000000 /* CPU core frequency in Hz */
85*5c591343SA. Cody Schuffelen void SWO_Init(uint32_t portBits, uint32_t cpuCoreFreqHz);
86*5c591343SA. Cody Schuffelen /* USER CODE END PFP */
87*5c591343SA. Cody Schuffelen 
88*5c591343SA. Cody Schuffelen /* USER CODE BEGIN 0 */
89*5c591343SA. Cody Schuffelen 
90*5c591343SA. Cody Schuffelen /* USER CODE END 0 */
91*5c591343SA. Cody Schuffelen 
92*5c591343SA. Cody Schuffelen /**
93*5c591343SA. Cody Schuffelen   * @brief  The application entry point.
94*5c591343SA. Cody Schuffelen   *
95*5c591343SA. Cody Schuffelen   * @retval None
96*5c591343SA. Cody Schuffelen   */
main(void)97*5c591343SA. Cody Schuffelen int main(void)
98*5c591343SA. Cody Schuffelen {
99*5c591343SA. Cody Schuffelen   /* USER CODE BEGIN 1 */
100*5c591343SA. Cody Schuffelen 
101*5c591343SA. Cody Schuffelen   /* USER CODE END 1 */
102*5c591343SA. Cody Schuffelen 
103*5c591343SA. Cody Schuffelen   /* MCU Configuration----------------------------------------------------------*/
104*5c591343SA. Cody Schuffelen 
105*5c591343SA. Cody Schuffelen   /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
106*5c591343SA. Cody Schuffelen   HAL_Init();
107*5c591343SA. Cody Schuffelen 
108*5c591343SA. Cody Schuffelen   /* USER CODE BEGIN Init */
109*5c591343SA. Cody Schuffelen 
110*5c591343SA. Cody Schuffelen   /* USER CODE END Init */
111*5c591343SA. Cody Schuffelen 
112*5c591343SA. Cody Schuffelen   /* Configure the system clock */
113*5c591343SA. Cody Schuffelen   SystemClock_Config();
114*5c591343SA. Cody Schuffelen 
115*5c591343SA. Cody Schuffelen   /* USER CODE BEGIN SysInit */
116*5c591343SA. Cody Schuffelen 
117*5c591343SA. Cody Schuffelen   /* USER CODE END SysInit */
118*5c591343SA. Cody Schuffelen 
119*5c591343SA. Cody Schuffelen   /* Initialize all configured peripherals */
120*5c591343SA. Cody Schuffelen   MX_GPIO_Init();
121*5c591343SA. Cody Schuffelen   MX_RNG_Init();
122*5c591343SA. Cody Schuffelen   MX_RTC_Init();
123*5c591343SA. Cody Schuffelen   MX_USART2_UART_Init();
124*5c591343SA. Cody Schuffelen   MX_USB_DEVICE_Init();
125*5c591343SA. Cody Schuffelen   /* USER CODE BEGIN 2 */
126*5c591343SA. Cody Schuffelen   InitializeITM();
127*5c591343SA. Cody Schuffelen   fprintf(stderr, "\r\n\r\n=========================\r\n"
128*5c591343SA. Cody Schuffelen                           "= Nucleo-L476RG TPM 2.0 =\r\n"
129*5c591343SA. Cody Schuffelen                           "=========================\r\n");
130*5c591343SA. Cody Schuffelen   printf("Nucleo-L476RG TPM 2.0\r\n");
131*5c591343SA. Cody Schuffelen 
132*5c591343SA. Cody Schuffelen   if(!TpmInitializeDevice())
133*5c591343SA. Cody Schuffelen   {
134*5c591343SA. Cody Schuffelen       _Error_Handler(__FILE__, __LINE__);
135*5c591343SA. Cody Schuffelen   }
136*5c591343SA. Cody Schuffelen 
137*5c591343SA. Cody Schuffelen   /* USER CODE END 2 */
138*5c591343SA. Cody Schuffelen 
139*5c591343SA. Cody Schuffelen   /* Infinite loop */
140*5c591343SA. Cody Schuffelen   /* USER CODE BEGIN WHILE */
141*5c591343SA. Cody Schuffelen   while (1)
142*5c591343SA. Cody Schuffelen   {
143*5c591343SA. Cody Schuffelen 
144*5c591343SA. Cody Schuffelen   /* USER CODE END WHILE */
145*5c591343SA. Cody Schuffelen 
146*5c591343SA. Cody Schuffelen   /* USER CODE BEGIN 3 */
147*5c591343SA. Cody Schuffelen       if(!TpmOperationsLoop())
148*5c591343SA. Cody Schuffelen       {
149*5c591343SA. Cody Schuffelen           _Error_Handler(__FILE__, __LINE__);
150*5c591343SA. Cody Schuffelen       }
151*5c591343SA. Cody Schuffelen 
152*5c591343SA. Cody Schuffelen   }
153*5c591343SA. Cody Schuffelen   /* USER CODE END 3 */
154*5c591343SA. Cody Schuffelen 
155*5c591343SA. Cody Schuffelen }
156*5c591343SA. Cody Schuffelen 
157*5c591343SA. Cody Schuffelen /**
158*5c591343SA. Cody Schuffelen   * @brief System Clock Configuration
159*5c591343SA. Cody Schuffelen   * @retval None
160*5c591343SA. Cody Schuffelen   */
SystemClock_Config(void)161*5c591343SA. Cody Schuffelen void SystemClock_Config(void)
162*5c591343SA. Cody Schuffelen {
163*5c591343SA. Cody Schuffelen 
164*5c591343SA. Cody Schuffelen   RCC_OscInitTypeDef RCC_OscInitStruct;
165*5c591343SA. Cody Schuffelen   RCC_ClkInitTypeDef RCC_ClkInitStruct;
166*5c591343SA. Cody Schuffelen   RCC_PeriphCLKInitTypeDef PeriphClkInit;
167*5c591343SA. Cody Schuffelen 
168*5c591343SA. Cody Schuffelen     /**Configure LSE Drive Capability
169*5c591343SA. Cody Schuffelen     */
170*5c591343SA. Cody Schuffelen   HAL_PWR_EnableBkUpAccess();
171*5c591343SA. Cody Schuffelen 
172*5c591343SA. Cody Schuffelen   __HAL_RCC_LSEDRIVE_CONFIG(RCC_LSEDRIVE_LOW);
173*5c591343SA. Cody Schuffelen 
174*5c591343SA. Cody Schuffelen     /**Initializes the CPU, AHB and APB busses clocks
175*5c591343SA. Cody Schuffelen     */
176*5c591343SA. Cody Schuffelen   RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSI|RCC_OSCILLATORTYPE_LSE
177*5c591343SA. Cody Schuffelen                               |RCC_OSCILLATORTYPE_MSI;
178*5c591343SA. Cody Schuffelen   RCC_OscInitStruct.LSEState = RCC_LSE_ON;
179*5c591343SA. Cody Schuffelen   RCC_OscInitStruct.HSIState = RCC_HSI_ON;
180*5c591343SA. Cody Schuffelen   RCC_OscInitStruct.HSICalibrationValue = 16;
181*5c591343SA. Cody Schuffelen   RCC_OscInitStruct.MSIState = RCC_MSI_ON;
182*5c591343SA. Cody Schuffelen   RCC_OscInitStruct.MSICalibrationValue = 0;
183*5c591343SA. Cody Schuffelen   RCC_OscInitStruct.MSIClockRange = RCC_MSIRANGE_11;
184*5c591343SA. Cody Schuffelen   RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;
185*5c591343SA. Cody Schuffelen   RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSI;
186*5c591343SA. Cody Schuffelen   RCC_OscInitStruct.PLL.PLLM = 1;  // <-- This one gets dropped by V1.11.0 add me manually back in when CubeMX ran
187*5c591343SA. Cody Schuffelen   RCC_OscInitStruct.PLL.PLLN = 10;
188*5c591343SA. Cody Schuffelen   RCC_OscInitStruct.PLL.PLLP = RCC_PLLP_DIV7;
189*5c591343SA. Cody Schuffelen   RCC_OscInitStruct.PLL.PLLQ = RCC_PLLQ_DIV2;
190*5c591343SA. Cody Schuffelen   RCC_OscInitStruct.PLL.PLLR = RCC_PLLR_DIV2;
191*5c591343SA. Cody Schuffelen   if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK)
192*5c591343SA. Cody Schuffelen   {
193*5c591343SA. Cody Schuffelen     _Error_Handler(__FILE__, __LINE__);
194*5c591343SA. Cody Schuffelen   }
195*5c591343SA. Cody Schuffelen 
196*5c591343SA. Cody Schuffelen     /**Initializes the CPU, AHB and APB busses clocks
197*5c591343SA. Cody Schuffelen     */
198*5c591343SA. Cody Schuffelen   RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK
199*5c591343SA. Cody Schuffelen                               |RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2;
200*5c591343SA. Cody Schuffelen   RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;
201*5c591343SA. Cody Schuffelen   RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;
202*5c591343SA. Cody Schuffelen   RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV1;
203*5c591343SA. Cody Schuffelen   RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1;
204*5c591343SA. Cody Schuffelen 
205*5c591343SA. Cody Schuffelen   if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_4) != HAL_OK)
206*5c591343SA. Cody Schuffelen   {
207*5c591343SA. Cody Schuffelen     _Error_Handler(__FILE__, __LINE__);
208*5c591343SA. Cody Schuffelen   }
209*5c591343SA. Cody Schuffelen 
210*5c591343SA. Cody Schuffelen   PeriphClkInit.PeriphClockSelection = RCC_PERIPHCLK_RTC|RCC_PERIPHCLK_USART2
211*5c591343SA. Cody Schuffelen                               |RCC_PERIPHCLK_USB|RCC_PERIPHCLK_RNG;
212*5c591343SA. Cody Schuffelen   PeriphClkInit.Usart2ClockSelection = RCC_USART2CLKSOURCE_PCLK1;
213*5c591343SA. Cody Schuffelen   PeriphClkInit.RTCClockSelection = RCC_RTCCLKSOURCE_LSE;
214*5c591343SA. Cody Schuffelen   PeriphClkInit.UsbClockSelection = RCC_USBCLKSOURCE_MSI;
215*5c591343SA. Cody Schuffelen   PeriphClkInit.RngClockSelection = RCC_RNGCLKSOURCE_MSI;
216*5c591343SA. Cody Schuffelen   if (HAL_RCCEx_PeriphCLKConfig(&PeriphClkInit) != HAL_OK)
217*5c591343SA. Cody Schuffelen   {
218*5c591343SA. Cody Schuffelen     _Error_Handler(__FILE__, __LINE__);
219*5c591343SA. Cody Schuffelen   }
220*5c591343SA. Cody Schuffelen 
221*5c591343SA. Cody Schuffelen     /**Configure the main internal regulator output voltage
222*5c591343SA. Cody Schuffelen     */
223*5c591343SA. Cody Schuffelen   if (HAL_PWREx_ControlVoltageScaling(PWR_REGULATOR_VOLTAGE_SCALE1) != HAL_OK)
224*5c591343SA. Cody Schuffelen   {
225*5c591343SA. Cody Schuffelen     _Error_Handler(__FILE__, __LINE__);
226*5c591343SA. Cody Schuffelen   }
227*5c591343SA. Cody Schuffelen 
228*5c591343SA. Cody Schuffelen     /**Configure the Systick interrupt time
229*5c591343SA. Cody Schuffelen     */
230*5c591343SA. Cody Schuffelen   HAL_SYSTICK_Config(HAL_RCC_GetHCLKFreq()/1000);
231*5c591343SA. Cody Schuffelen 
232*5c591343SA. Cody Schuffelen     /**Configure the Systick
233*5c591343SA. Cody Schuffelen     */
234*5c591343SA. Cody Schuffelen   HAL_SYSTICK_CLKSourceConfig(SYSTICK_CLKSOURCE_HCLK);
235*5c591343SA. Cody Schuffelen 
236*5c591343SA. Cody Schuffelen     /**Enable MSI Auto calibration
237*5c591343SA. Cody Schuffelen     */
238*5c591343SA. Cody Schuffelen   HAL_RCCEx_EnableMSIPLLMode();
239*5c591343SA. Cody Schuffelen 
240*5c591343SA. Cody Schuffelen   /* SysTick_IRQn interrupt configuration */
241*5c591343SA. Cody Schuffelen   HAL_NVIC_SetPriority(SysTick_IRQn, 0, 0);
242*5c591343SA. Cody Schuffelen }
243*5c591343SA. Cody Schuffelen 
244*5c591343SA. Cody Schuffelen /* RNG init function */
MX_RNG_Init(void)245*5c591343SA. Cody Schuffelen static void MX_RNG_Init(void)
246*5c591343SA. Cody Schuffelen {
247*5c591343SA. Cody Schuffelen 
248*5c591343SA. Cody Schuffelen   hrng.Instance = RNG;
249*5c591343SA. Cody Schuffelen   if (HAL_RNG_Init(&hrng) != HAL_OK)
250*5c591343SA. Cody Schuffelen   {
251*5c591343SA. Cody Schuffelen     _Error_Handler(__FILE__, __LINE__);
252*5c591343SA. Cody Schuffelen   }
253*5c591343SA. Cody Schuffelen 
254*5c591343SA. Cody Schuffelen }
255*5c591343SA. Cody Schuffelen 
256*5c591343SA. Cody Schuffelen /* RTC init function */
MX_RTC_Init(void)257*5c591343SA. Cody Schuffelen static void MX_RTC_Init(void)
258*5c591343SA. Cody Schuffelen {
259*5c591343SA. Cody Schuffelen 
260*5c591343SA. Cody Schuffelen   RTC_TimeTypeDef sTime;
261*5c591343SA. Cody Schuffelen   RTC_DateTypeDef sDate;
262*5c591343SA. Cody Schuffelen 
263*5c591343SA. Cody Schuffelen     /**Initialize RTC Only
264*5c591343SA. Cody Schuffelen     */
265*5c591343SA. Cody Schuffelen   hrtc.Instance = RTC;
266*5c591343SA. Cody Schuffelen if(HAL_RTCEx_BKUPRead(&hrtc, RTC_BKP_DR0) != 0x32F2){
267*5c591343SA. Cody Schuffelen   hrtc.Init.HourFormat = RTC_HOURFORMAT_24;
268*5c591343SA. Cody Schuffelen   hrtc.Init.AsynchPrediv = 127;
269*5c591343SA. Cody Schuffelen   hrtc.Init.SynchPrediv = 255;
270*5c591343SA. Cody Schuffelen   hrtc.Init.OutPut = RTC_OUTPUT_DISABLE;
271*5c591343SA. Cody Schuffelen   hrtc.Init.OutPutRemap = RTC_OUTPUT_REMAP_NONE;
272*5c591343SA. Cody Schuffelen   hrtc.Init.OutPutPolarity = RTC_OUTPUT_POLARITY_HIGH;
273*5c591343SA. Cody Schuffelen   hrtc.Init.OutPutType = RTC_OUTPUT_TYPE_OPENDRAIN;
274*5c591343SA. Cody Schuffelen   if (HAL_RTC_Init(&hrtc) != HAL_OK)
275*5c591343SA. Cody Schuffelen   {
276*5c591343SA. Cody Schuffelen     _Error_Handler(__FILE__, __LINE__);
277*5c591343SA. Cody Schuffelen   }
278*5c591343SA. Cody Schuffelen 
279*5c591343SA. Cody Schuffelen     /**Initialize RTC and set the Time and Date
280*5c591343SA. Cody Schuffelen     */
281*5c591343SA. Cody Schuffelen   sTime.Hours = 0;
282*5c591343SA. Cody Schuffelen   sTime.Minutes = 0;
283*5c591343SA. Cody Schuffelen   sTime.Seconds = 0;
284*5c591343SA. Cody Schuffelen   sTime.DayLightSaving = RTC_DAYLIGHTSAVING_NONE;
285*5c591343SA. Cody Schuffelen   sTime.StoreOperation = RTC_STOREOPERATION_RESET;
286*5c591343SA. Cody Schuffelen   if (HAL_RTC_SetTime(&hrtc, &sTime, RTC_FORMAT_BIN) != HAL_OK)
287*5c591343SA. Cody Schuffelen   {
288*5c591343SA. Cody Schuffelen     _Error_Handler(__FILE__, __LINE__);
289*5c591343SA. Cody Schuffelen   }
290*5c591343SA. Cody Schuffelen 
291*5c591343SA. Cody Schuffelen   sDate.WeekDay = RTC_WEEKDAY_MONDAY;
292*5c591343SA. Cody Schuffelen   sDate.Month = RTC_MONTH_JANUARY;
293*5c591343SA. Cody Schuffelen   sDate.Date = 1;
294*5c591343SA. Cody Schuffelen   sDate.Year = 0;
295*5c591343SA. Cody Schuffelen 
296*5c591343SA. Cody Schuffelen   if (HAL_RTC_SetDate(&hrtc, &sDate, RTC_FORMAT_BIN) != HAL_OK)
297*5c591343SA. Cody Schuffelen   {
298*5c591343SA. Cody Schuffelen     _Error_Handler(__FILE__, __LINE__);
299*5c591343SA. Cody Schuffelen   }
300*5c591343SA. Cody Schuffelen 
301*5c591343SA. Cody Schuffelen     HAL_RTCEx_BKUPWrite(&hrtc,RTC_BKP_DR0,0x32F2);
302*5c591343SA. Cody Schuffelen   }
303*5c591343SA. Cody Schuffelen 
304*5c591343SA. Cody Schuffelen }
305*5c591343SA. Cody Schuffelen 
306*5c591343SA. Cody Schuffelen /* USART2 init function */
MX_USART2_UART_Init(void)307*5c591343SA. Cody Schuffelen static void MX_USART2_UART_Init(void)
308*5c591343SA. Cody Schuffelen {
309*5c591343SA. Cody Schuffelen 
310*5c591343SA. Cody Schuffelen   huart2.Instance = USART2;
311*5c591343SA. Cody Schuffelen   huart2.Init.BaudRate = 115200;
312*5c591343SA. Cody Schuffelen   huart2.Init.WordLength = UART_WORDLENGTH_8B;
313*5c591343SA. Cody Schuffelen   huart2.Init.StopBits = UART_STOPBITS_1;
314*5c591343SA. Cody Schuffelen   huart2.Init.Parity = UART_PARITY_NONE;
315*5c591343SA. Cody Schuffelen   huart2.Init.Mode = UART_MODE_TX;
316*5c591343SA. Cody Schuffelen   huart2.Init.HwFlowCtl = UART_HWCONTROL_NONE;
317*5c591343SA. Cody Schuffelen   huart2.Init.OverSampling = UART_OVERSAMPLING_16;
318*5c591343SA. Cody Schuffelen   huart2.Init.OneBitSampling = UART_ONE_BIT_SAMPLE_DISABLE;
319*5c591343SA. Cody Schuffelen   huart2.AdvancedInit.AdvFeatureInit = UART_ADVFEATURE_NO_INIT;
320*5c591343SA. Cody Schuffelen   if (HAL_UART_Init(&huart2) != HAL_OK)
321*5c591343SA. Cody Schuffelen   {
322*5c591343SA. Cody Schuffelen     _Error_Handler(__FILE__, __LINE__);
323*5c591343SA. Cody Schuffelen   }
324*5c591343SA. Cody Schuffelen 
325*5c591343SA. Cody Schuffelen }
326*5c591343SA. Cody Schuffelen 
327*5c591343SA. Cody Schuffelen /** Configure pins as
328*5c591343SA. Cody Schuffelen         * Analog
329*5c591343SA. Cody Schuffelen         * Input
330*5c591343SA. Cody Schuffelen         * Output
331*5c591343SA. Cody Schuffelen         * EVENT_OUT
332*5c591343SA. Cody Schuffelen         * EXTI
333*5c591343SA. Cody Schuffelen */
MX_GPIO_Init(void)334*5c591343SA. Cody Schuffelen static void MX_GPIO_Init(void)
335*5c591343SA. Cody Schuffelen {
336*5c591343SA. Cody Schuffelen 
337*5c591343SA. Cody Schuffelen   GPIO_InitTypeDef GPIO_InitStruct;
338*5c591343SA. Cody Schuffelen 
339*5c591343SA. Cody Schuffelen   /* GPIO Ports Clock Enable */
340*5c591343SA. Cody Schuffelen   __HAL_RCC_GPIOC_CLK_ENABLE();
341*5c591343SA. Cody Schuffelen   __HAL_RCC_GPIOH_CLK_ENABLE();
342*5c591343SA. Cody Schuffelen   __HAL_RCC_GPIOA_CLK_ENABLE();
343*5c591343SA. Cody Schuffelen   __HAL_RCC_GPIOB_CLK_ENABLE();
344*5c591343SA. Cody Schuffelen 
345*5c591343SA. Cody Schuffelen   /*Configure GPIO pin Output Level */
346*5c591343SA. Cody Schuffelen   HAL_GPIO_WritePin(LD2_GPIO_Port, LD2_Pin, GPIO_PIN_RESET);
347*5c591343SA. Cody Schuffelen 
348*5c591343SA. Cody Schuffelen   /*Configure GPIO pin : B1_Pin */
349*5c591343SA. Cody Schuffelen   GPIO_InitStruct.Pin = B1_Pin;
350*5c591343SA. Cody Schuffelen   GPIO_InitStruct.Mode = GPIO_MODE_IT_FALLING;
351*5c591343SA. Cody Schuffelen   GPIO_InitStruct.Pull = GPIO_NOPULL;
352*5c591343SA. Cody Schuffelen   HAL_GPIO_Init(B1_GPIO_Port, &GPIO_InitStruct);
353*5c591343SA. Cody Schuffelen 
354*5c591343SA. Cody Schuffelen   /*Configure GPIO pin : LD2_Pin */
355*5c591343SA. Cody Schuffelen   GPIO_InitStruct.Pin = LD2_Pin;
356*5c591343SA. Cody Schuffelen   GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
357*5c591343SA. Cody Schuffelen   GPIO_InitStruct.Pull = GPIO_NOPULL;
358*5c591343SA. Cody Schuffelen   GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
359*5c591343SA. Cody Schuffelen   HAL_GPIO_Init(LD2_GPIO_Port, &GPIO_InitStruct);
360*5c591343SA. Cody Schuffelen 
361*5c591343SA. Cody Schuffelen }
362*5c591343SA. Cody Schuffelen 
363*5c591343SA. Cody Schuffelen /* USER CODE BEGIN 4 */
364*5c591343SA. Cody Schuffelen 
365*5c591343SA. Cody Schuffelen /* USER CODE END 4 */
366*5c591343SA. Cody Schuffelen 
367*5c591343SA. Cody Schuffelen /**
368*5c591343SA. Cody Schuffelen   * @brief  This function is executed in case of error occurrence.
369*5c591343SA. Cody Schuffelen   * @param  file: The file name as string.
370*5c591343SA. Cody Schuffelen   * @param  line: The line in file as a number.
371*5c591343SA. Cody Schuffelen   * @retval None
372*5c591343SA. Cody Schuffelen   */
_Error_Handler(char * file,int line)373*5c591343SA. Cody Schuffelen void _Error_Handler(char *file, int line)
374*5c591343SA. Cody Schuffelen {
375*5c591343SA. Cody Schuffelen   /* USER CODE BEGIN Error_Handler_Debug */
376*5c591343SA. Cody Schuffelen   dbgPrint("PANIC: EXECUTION HALTED %s@%d\r\n", file, line);
377*5c591343SA. Cody Schuffelen   /* User can add his own implementation to report the HAL error return state */
378*5c591343SA. Cody Schuffelen   while(1)
379*5c591343SA. Cody Schuffelen   {
380*5c591343SA. Cody Schuffelen   }
381*5c591343SA. Cody Schuffelen   /* USER CODE END Error_Handler_Debug */
382*5c591343SA. Cody Schuffelen }
383*5c591343SA. Cody Schuffelen 
384*5c591343SA. Cody Schuffelen #ifdef  USE_FULL_ASSERT
385*5c591343SA. Cody Schuffelen /**
386*5c591343SA. Cody Schuffelen   * @brief  Reports the name of the source file and the source line number
387*5c591343SA. Cody Schuffelen   *         where the assert_param error has occurred.
388*5c591343SA. Cody Schuffelen   * @param  file: pointer to the source file name
389*5c591343SA. Cody Schuffelen   * @param  line: assert_param error line source number
390*5c591343SA. Cody Schuffelen   * @retval None
391*5c591343SA. Cody Schuffelen   */
assert_failed(uint8_t * file,uint32_t line)392*5c591343SA. Cody Schuffelen void assert_failed(uint8_t* file, uint32_t line)
393*5c591343SA. Cody Schuffelen {
394*5c591343SA. Cody Schuffelen   /* USER CODE BEGIN 6 */
395*5c591343SA. Cody Schuffelen   /* User can add his own implementation to report the file name and line number,
396*5c591343SA. Cody Schuffelen      tex: printf("Wrong parameters value: file %s on line %d\r\n", file, line) */
397*5c591343SA. Cody Schuffelen   /* USER CODE END 6 */
398*5c591343SA. Cody Schuffelen }
399*5c591343SA. Cody Schuffelen #endif /* USE_FULL_ASSERT */
400*5c591343SA. Cody Schuffelen 
401*5c591343SA. Cody Schuffelen /**
402*5c591343SA. Cody Schuffelen   * @}
403*5c591343SA. Cody Schuffelen   */
404*5c591343SA. Cody Schuffelen 
405*5c591343SA. Cody Schuffelen /**
406*5c591343SA. Cody Schuffelen   * @}
407*5c591343SA. Cody Schuffelen   */
408*5c591343SA. Cody Schuffelen 
409*5c591343SA. Cody Schuffelen /************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
410