| |
| /** |
| ****************************************************************************** |
| * @file : main.c |
| * @brief : Main program body |
| ****************************************************************************** |
| * This notice applies to any and all portions of this file |
| * that are not between comment pairs USER CODE BEGIN and |
| * USER CODE END. Other portions of this file, whether |
| * inserted by the user or by software development tools |
| * are owned by their respective copyright owners. |
| * |
| * Copyright (c) 2018 STMicroelectronics International N.V. |
| * All rights reserved. |
| * |
| * Redistribution and use in source and binary forms, with or without |
| * modification, are permitted, provided that the following conditions are met: |
| * |
| * 1. Redistribution of source code must retain the above copyright notice, |
| * this list of conditions and the following disclaimer. |
| * 2. Redistributions in binary form must reproduce the above copyright notice, |
| * this list of conditions and the following disclaimer in the documentation |
| * and/or other materials provided with the distribution. |
| * 3. Neither the name of STMicroelectronics nor the names of other |
| * contributors to this software may be used to endorse or promote products |
| * derived from this software without specific written permission. |
| * 4. This software, including modifications and/or derivative works of this |
| * software, must execute solely and exclusively on microcontroller or |
| * microprocessor devices manufactured by or for STMicroelectronics. |
| * 5. Redistribution and use of this software other than as permitted under |
| * this license is void and will automatically terminate your rights under |
| * this license. |
| * |
| * THIS SOFTWARE IS PROVIDED BY STMICROELECTRONICS AND CONTRIBUTORS "AS IS" |
| * AND ANY EXPRESS, IMPLIED OR STATUTORY WARRANTIES, INCLUDING, BUT NOT |
| * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A |
| * PARTICULAR PURPOSE AND NON-INFRINGEMENT OF THIRD PARTY INTELLECTUAL PROPERTY |
| * RIGHTS ARE DISCLAIMED TO THE FULLEST EXTENT PERMITTED BY LAW. IN NO EVENT |
| * SHALL STMICROELECTRONICS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, |
| * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT |
| * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, |
| * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF |
| * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING |
| * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, |
| * EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
| * |
| ****************************************************************************** |
| */ |
| /* Includes ------------------------------------------------------------------*/ |
| #include "main.h" |
| #include "stm32l4xx_hal.h" |
| #include "usb_device.h" |
| |
| /* USER CODE BEGIN Includes */ |
| #include <stdint.h> |
| #include <stdbool.h> |
| #include <time.h> |
| #include "TpmDevice.h" |
| #include "StmUtil.h" |
| |
| /* USER CODE END Includes */ |
| |
| /* Private variables ---------------------------------------------------------*/ |
| RNG_HandleTypeDef hrng; |
| |
| RTC_HandleTypeDef hrtc; |
| |
| UART_HandleTypeDef huart2; |
| |
| /* USER CODE BEGIN PV */ |
| /* Private variables ---------------------------------------------------------*/ |
| |
| /* USER CODE END PV */ |
| |
| /* Private function prototypes -----------------------------------------------*/ |
| void SystemClock_Config(void); |
| static void MX_GPIO_Init(void); |
| static void MX_USART2_UART_Init(void); |
| static void MX_RTC_Init(void); |
| static void MX_RNG_Init(void); |
| |
| /* USER CODE BEGIN PFP */ |
| /* Private function prototypes -----------------------------------------------*/ |
| |
| /* USER CODE END PFP */ |
| |
| /* USER CODE BEGIN 0 */ |
| |
| /* USER CODE END 0 */ |
| |
| /** |
| * @brief The application entry point. |
| * |
| * @retval None |
| */ |
| int main(void) |
| { |
| /* USER CODE BEGIN 1 */ |
| |
| /* USER CODE END 1 */ |
| |
| /* MCU Configuration----------------------------------------------------------*/ |
| |
| /* Reset of all peripherals, Initializes the Flash interface and the Systick. */ |
| HAL_Init(); |
| |
| /* USER CODE BEGIN Init */ |
| |
| /* USER CODE END Init */ |
| |
| /* Configure the system clock */ |
| SystemClock_Config(); |
| |
| /* USER CODE BEGIN SysInit */ |
| |
| /* USER CODE END SysInit */ |
| |
| /* Initialize all configured peripherals */ |
| MX_GPIO_Init(); |
| MX_USART2_UART_Init(); |
| MX_RTC_Init(); |
| MX_USB_DEVICE_Init(); |
| MX_RNG_Init(); |
| /* USER CODE BEGIN 2 */ |
| InitializeITM(); |
| fprintf(stderr, "\r\n\r\n=========================\r\n" |
| "= Nucleo-L476RG TPM 2.0 =\r\n" |
| "=========================\r\n"); |
| printf("Nucleo-L476RG TPM 2.0\r\n"); |
| |
| if(!TpmInitializeDevice()) |
| { |
| _Error_Handler(__FILE__, __LINE__); |
| } |
| |
| /* USER CODE END 2 */ |
| |
| /* Infinite loop */ |
| /* USER CODE BEGIN WHILE */ |
| while (1) |
| { |
| |
| /* USER CODE END WHILE */ |
| |
| /* USER CODE BEGIN 3 */ |
| if(!TpmOperationsLoop()) |
| { |
| _Error_Handler(__FILE__, __LINE__); |
| } |
| |
| } |
| /* USER CODE END 3 */ |
| |
| } |
| |
| /** |
| * @brief System Clock Configuration |
| * @retval None |
| */ |
| void SystemClock_Config(void) |
| { |
| |
| RCC_OscInitTypeDef RCC_OscInitStruct; |
| RCC_ClkInitTypeDef RCC_ClkInitStruct; |
| RCC_PeriphCLKInitTypeDef PeriphClkInit; |
| |
| /**Configure LSE Drive Capability |
| */ |
| HAL_PWR_EnableBkUpAccess(); |
| |
| __HAL_RCC_LSEDRIVE_CONFIG(RCC_LSEDRIVE_LOW); |
| |
| /**Initializes the CPU, AHB and APB busses clocks |
| */ |
| RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSI48|RCC_OSCILLATORTYPE_HSI |
| |RCC_OSCILLATORTYPE_LSE; |
| RCC_OscInitStruct.LSEState = RCC_LSE_ON; |
| RCC_OscInitStruct.HSIState = RCC_HSI_ON; |
| RCC_OscInitStruct.HSI48State = RCC_HSI48_ON; |
| RCC_OscInitStruct.HSICalibrationValue = 64; |
| RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON; |
| RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSI; |
| RCC_OscInitStruct.PLL.PLLM = 1; // <-- This one gets dropped by V1.11.0 add me manually back in when CubeMX ran |
| RCC_OscInitStruct.PLL.PLLN = 10; |
| RCC_OscInitStruct.PLL.PLLP = RCC_PLLP_DIV2; |
| RCC_OscInitStruct.PLL.PLLQ = RCC_PLLQ_DIV2; |
| RCC_OscInitStruct.PLL.PLLR = RCC_PLLR_DIV2; |
| if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK) |
| { |
| _Error_Handler(__FILE__, __LINE__); |
| } |
| |
| /**Initializes the CPU, AHB and APB busses clocks |
| */ |
| RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK |
| |RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2; |
| RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK; |
| RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1; |
| RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV1; |
| RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1; |
| |
| if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_4) != HAL_OK) |
| { |
| _Error_Handler(__FILE__, __LINE__); |
| } |
| |
| PeriphClkInit.PeriphClockSelection = RCC_PERIPHCLK_RTC|RCC_PERIPHCLK_USART2 |
| |RCC_PERIPHCLK_USB|RCC_PERIPHCLK_RNG; |
| PeriphClkInit.Usart2ClockSelection = RCC_USART2CLKSOURCE_PCLK1; |
| PeriphClkInit.RTCClockSelection = RCC_RTCCLKSOURCE_LSE; |
| PeriphClkInit.UsbClockSelection = RCC_USBCLKSOURCE_HSI48; |
| PeriphClkInit.RngClockSelection = RCC_RNGCLKSOURCE_HSI48; |
| if (HAL_RCCEx_PeriphCLKConfig(&PeriphClkInit) != HAL_OK) |
| { |
| _Error_Handler(__FILE__, __LINE__); |
| } |
| |
| /**Configure the main internal regulator output voltage |
| */ |
| if (HAL_PWREx_ControlVoltageScaling(PWR_REGULATOR_VOLTAGE_SCALE1) != HAL_OK) |
| { |
| _Error_Handler(__FILE__, __LINE__); |
| } |
| |
| /**Configure the Systick interrupt time |
| */ |
| HAL_SYSTICK_Config(HAL_RCC_GetHCLKFreq()/1000); |
| |
| /**Configure the Systick |
| */ |
| HAL_SYSTICK_CLKSourceConfig(SYSTICK_CLKSOURCE_HCLK); |
| |
| /* SysTick_IRQn interrupt configuration */ |
| HAL_NVIC_SetPriority(SysTick_IRQn, 0, 0); |
| } |
| |
| /* RNG init function */ |
| static void MX_RNG_Init(void) |
| { |
| |
| hrng.Instance = RNG; |
| if (HAL_RNG_Init(&hrng) != HAL_OK) |
| { |
| _Error_Handler(__FILE__, __LINE__); |
| } |
| |
| } |
| |
| /* RTC init function */ |
| static void MX_RTC_Init(void) |
| { |
| |
| RTC_TimeTypeDef sTime; |
| RTC_DateTypeDef sDate; |
| |
| /**Initialize RTC Only |
| */ |
| hrtc.Instance = RTC; |
| if(HAL_RTCEx_BKUPRead(&hrtc, RTC_BKP_DR0) != 0x32F2){ |
| hrtc.Init.HourFormat = RTC_HOURFORMAT_24; |
| hrtc.Init.AsynchPrediv = 127; |
| hrtc.Init.SynchPrediv = 255; |
| hrtc.Init.OutPut = RTC_OUTPUT_DISABLE; |
| hrtc.Init.OutPutRemap = RTC_OUTPUT_REMAP_NONE; |
| hrtc.Init.OutPutPolarity = RTC_OUTPUT_POLARITY_HIGH; |
| hrtc.Init.OutPutType = RTC_OUTPUT_TYPE_OPENDRAIN; |
| if (HAL_RTC_Init(&hrtc) != HAL_OK) |
| { |
| _Error_Handler(__FILE__, __LINE__); |
| } |
| |
| /**Initialize RTC and set the Time and Date |
| */ |
| sTime.Hours = 0; |
| sTime.Minutes = 0; |
| sTime.Seconds = 0; |
| sTime.DayLightSaving = RTC_DAYLIGHTSAVING_NONE; |
| sTime.StoreOperation = RTC_STOREOPERATION_RESET; |
| if (HAL_RTC_SetTime(&hrtc, &sTime, RTC_FORMAT_BIN) != HAL_OK) |
| { |
| _Error_Handler(__FILE__, __LINE__); |
| } |
| |
| sDate.WeekDay = RTC_WEEKDAY_MONDAY; |
| sDate.Month = RTC_MONTH_JANUARY; |
| sDate.Date = 1; |
| sDate.Year = 0; |
| |
| if (HAL_RTC_SetDate(&hrtc, &sDate, RTC_FORMAT_BIN) != HAL_OK) |
| { |
| _Error_Handler(__FILE__, __LINE__); |
| } |
| |
| HAL_RTCEx_BKUPWrite(&hrtc,RTC_BKP_DR0,0x32F2); |
| } |
| |
| } |
| |
| /* USART2 init function */ |
| static void MX_USART2_UART_Init(void) |
| { |
| |
| huart2.Instance = USART2; |
| huart2.Init.BaudRate = 115200; |
| huart2.Init.WordLength = UART_WORDLENGTH_8B; |
| huart2.Init.StopBits = UART_STOPBITS_1; |
| huart2.Init.Parity = UART_PARITY_NONE; |
| huart2.Init.Mode = UART_MODE_TX; |
| huart2.Init.HwFlowCtl = UART_HWCONTROL_NONE; |
| huart2.Init.OverSampling = UART_OVERSAMPLING_16; |
| huart2.Init.OneBitSampling = UART_ONE_BIT_SAMPLE_DISABLE; |
| huart2.AdvancedInit.AdvFeatureInit = UART_ADVFEATURE_NO_INIT; |
| if (HAL_UART_Init(&huart2) != HAL_OK) |
| { |
| _Error_Handler(__FILE__, __LINE__); |
| } |
| |
| } |
| |
| /** Configure pins as |
| * Analog |
| * Input |
| * Output |
| * EVENT_OUT |
| * EXTI |
| */ |
| static void MX_GPIO_Init(void) |
| { |
| |
| GPIO_InitTypeDef GPIO_InitStruct; |
| |
| /* GPIO Ports Clock Enable */ |
| __HAL_RCC_GPIOC_CLK_ENABLE(); |
| __HAL_RCC_GPIOA_CLK_ENABLE(); |
| __HAL_RCC_GPIOB_CLK_ENABLE(); |
| |
| /*Configure GPIO pin Output Level */ |
| HAL_GPIO_WritePin(LD2_GPIO_Port, LD2_Pin, GPIO_PIN_RESET); |
| |
| /*Configure GPIO pin : B1_Pin */ |
| GPIO_InitStruct.Pin = B1_Pin; |
| GPIO_InitStruct.Mode = GPIO_MODE_IT_RISING; |
| GPIO_InitStruct.Pull = GPIO_NOPULL; |
| HAL_GPIO_Init(B1_GPIO_Port, &GPIO_InitStruct); |
| |
| /*Configure GPIO pin : LD2_Pin */ |
| GPIO_InitStruct.Pin = LD2_Pin; |
| GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP; |
| GPIO_InitStruct.Pull = GPIO_NOPULL; |
| GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW; |
| HAL_GPIO_Init(LD2_GPIO_Port, &GPIO_InitStruct); |
| |
| } |
| |
| /* USER CODE BEGIN 4 */ |
| |
| /* USER CODE END 4 */ |
| |
| /** |
| * @brief This function is executed in case of error occurrence. |
| * @param file: The file name as string. |
| * @param line: The line in file as a number. |
| * @retval None |
| */ |
| void _Error_Handler(char *file, int line) |
| { |
| /* USER CODE BEGIN Error_Handler_Debug */ |
| dbgPrint("PANIC: EXECUTION HALTED %s@%d\r\n", file, line); |
| /* User can add his own implementation to report the HAL error return state */ |
| while(1) |
| { |
| } |
| /* USER CODE END Error_Handler_Debug */ |
| } |
| |
| #ifdef USE_FULL_ASSERT |
| /** |
| * @brief Reports the name of the source file and the source line number |
| * where the assert_param error has occurred. |
| * @param file: pointer to the source file name |
| * @param line: assert_param error line source number |
| * @retval None |
| */ |
| void assert_failed(uint8_t* file, uint32_t line) |
| { |
| /* USER CODE BEGIN 6 */ |
| /* User can add his own implementation to report the file name and line number, |
| tex: printf("Wrong parameters value: file %s on line %d\r\n", file, line) */ |
| /* USER CODE END 6 */ |
| } |
| #endif /* USE_FULL_ASSERT */ |
| |
| /** |
| * @} |
| */ |
| |
| /** |
| * @} |
| */ |
| |
| /************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ |