/** ****************************************************************************** * @file RTC/RTC_Tamper/Src/main.c * @author MCD Application Team * @brief This sample code shows how to use STM32F3xx RTC HAL API to write/read * data to/from RTC Backup data registers and demonstrates the Tamper * detection feature. ****************************************************************************** * @attention * *

© Copyright (c) 2016 STMicroelectronics. * All rights reserved.

* * This software component is licensed by ST under BSD 3-Clause license, * the "License"; You may not use this file except in compliance with the * License. You may obtain a copy of the License at: * opensource.org/licenses/BSD-3-Clause * ****************************************************************************** */ /* Includes ------------------------------------------------------------------*/ #include "main.h" /** @addtogroup STM32F3xx_HAL_Examples * @{ */ /** @addtogroup RTC_Tamper * @{ */ /* Private typedef -----------------------------------------------------------*/ /* Private define ------------------------------------------------------------*/ /* Private macro -------------------------------------------------------------*/ /* Private variables ---------------------------------------------------------*/ /* RTC handler declaration */ RTC_HandleTypeDef RtcHandle; __IO FlagStatus TamperStatus; /* Backup registers table */ uint32_t aBKPDataReg[BACKUP_COUNT] = { RTC_BKP_DR0, RTC_BKP_DR1, RTC_BKP_DR2, RTC_BKP_DR3, RTC_BKP_DR4, RTC_BKP_DR5, RTC_BKP_DR6, RTC_BKP_DR7, RTC_BKP_DR8, RTC_BKP_DR9, RTC_BKP_DR10, RTC_BKP_DR11, RTC_BKP_DR12, RTC_BKP_DR13, RTC_BKP_DR14, RTC_BKP_DR15 }; /* Private function prototypes -----------------------------------------------*/ void SystemClock_Config(void); /* Private functions ---------------------------------------------------------*/ /** * @brief Main program * @param None * @retval None */ int main(void) { uint32_t index = 0; RTC_TamperTypeDef stamperstructure; /* STM32F3xx HAL library initialization: - Configure the Flash prefetch - Configure the Systick to generate an interrupt each 1 msec - Set NVIC Group Priority to 4 - Low Level Initialization */ HAL_Init(); /* Configure the system clock to 64 MHz */ SystemClock_Config(); /* Configure LED1 and LED2 */ BSP_LED_Init(LED1); BSP_LED_Init(LED2); /* Configure User push-button button */ BSP_PB_Init(BUTTON_USER,BUTTON_MODE_GPIO); /*##-1- Configure the RTC peripheral #######################################*/ /* Configure RTC prescaler and RTC data registers */ /* RTC configured as follows: - Hour Format = Format 24 - Asynch Prediv = Value according to source clock - Synch Prediv = Value according to source clock - OutPut = Output Disable - OutPutPolarity = High Polarity - OutPutType = Open Drain */ RtcHandle.Instance = RTC; RtcHandle.Init.HourFormat = RTC_HOURFORMAT_24; RtcHandle.Init.AsynchPrediv = RTC_ASYNCH_PREDIV; RtcHandle.Init.SynchPrediv = RTC_SYNCH_PREDIV; RtcHandle.Init.OutPut = RTC_OUTPUT_DISABLE; RtcHandle.Init.OutPutPolarity = RTC_OUTPUT_POLARITY_HIGH; RtcHandle.Init.OutPutType = RTC_OUTPUT_TYPE_OPENDRAIN; if (HAL_RTC_Init(&RtcHandle) != HAL_OK) { /* Initialization Error */ Error_Handler(); } /*##-2- Configure RTC Tamper ###############################################*/ stamperstructure.Tamper = RTC_TAMPER_1; stamperstructure.Trigger = RTC_TAMPERTRIGGER_FALLINGEDGE; stamperstructure.Filter = RTC_TAMPERFILTER_DISABLE; stamperstructure.SamplingFrequency = RTC_TAMPERSAMPLINGFREQ_RTCCLK_DIV32768; stamperstructure.PrechargeDuration = RTC_TAMPERPRECHARGEDURATION_1RTCCLK; stamperstructure.TamperPullUp = RTC_TAMPER_PULLUP_ENABLE; stamperstructure.TimeStampOnTamperDetection = RTC_TIMESTAMPONTAMPERDETECTION_DISABLE; if (HAL_RTCEx_SetTamper_IT(&RtcHandle, &stamperstructure) != HAL_OK) { /* Initialization Error */ Error_Handler(); } /* Clear the Tamper interrupt pending bit */ __HAL_RTC_TAMPER_CLEAR_FLAG(&RtcHandle,RTC_FLAG_TAMP1F); /*##-3- Write Data on the Back Up registers ################################*/ for (index = 0; index < BACKUP_COUNT; index++) { HAL_RTCEx_BKUPWrite(&RtcHandle, aBKPDataReg[index], 0xDF59 + (index * 0x5A)); } /*##-4- Check Data is stored on the Back Up registers ######################*/ for (index = 0; index < BACKUP_COUNT; index++) { if (HAL_RTCEx_BKUPRead(&RtcHandle, aBKPDataReg[index]) != (0xDF59 + (index * 0x5A))) { Error_Handler(); } } /* Reset flag after writing of backup register in order to wait for new button press */ TamperStatus = RESET; /*##-5- Wait for the tamper button is pressed ##############################*/ while (TamperStatus != SET) { /* Toggle LED1 with a period of 1s */ BSP_LED_Toggle(LED1); /* Delay */ HAL_Delay(1000); } /*##-6- Deactivate the tamper ##############################*/ HAL_RTCEx_DeactivateTamper(&RtcHandle, RTC_TAMPER_1); /*##-7- Check Data is cleared on the Back Up registers #####################*/ for (index = 0; index < BACKUP_COUNT; index++) { if (HAL_RTCEx_BKUPRead(&RtcHandle, aBKPDataReg[index]) != 0x00) { Error_Handler(); } } /* Infinite loop */ while (1) { /* Turn LED1 on */ BSP_LED_Toggle(LED1); /* Delay */ HAL_Delay(100); } } /** * @brief System Clock Configuration * The system Clock is configured as follow : * System Clock source = PLL (HSI) * SYSCLK(Hz) = 64000000 * HCLK(Hz) = 64000000 * AHB Prescaler = 1 * APB1 Prescaler = 2 * APB2 Prescaler = 1 * HSI Frequency(Hz) = 8000000 * PREDIV = RCC_PREDIV_DIV2 (2) * PLLMUL = RCC_PLL_MUL16 (16) * Flash Latency(WS) = 2 * @param None * @retval None */ void SystemClock_Config(void) { RCC_ClkInitTypeDef RCC_ClkInitStruct; RCC_OscInitTypeDef RCC_OscInitStruct; /* HSI Oscillator already ON after system reset, activate PLL with HSI as source */ RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_NONE; RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON; RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSI; RCC_OscInitStruct.PLL.PREDIV = RCC_PREDIV_DIV2; RCC_OscInitStruct.PLL.PLLMUL = RCC_PLL_MUL16; RCC_OscInitStruct.HSICalibrationValue = RCC_HSICALIBRATION_DEFAULT; if (HAL_RCC_OscConfig(&RCC_OscInitStruct)!= HAL_OK) { /* Initialization Error */ while(1); } /* Select PLL as system clock source and configure the HCLK, PCLK1 and PCLK2 clocks dividers */ RCC_ClkInitStruct.ClockType = (RCC_CLOCKTYPE_SYSCLK | RCC_CLOCKTYPE_HCLK | RCC_CLOCKTYPE_PCLK1 | RCC_CLOCKTYPE_PCLK2); RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK; RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1; RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV2; RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1; if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_2)!= HAL_OK) { /* Initialization Error */ while(1); } } /** * @brief This function is executed in case of error occurrence. * @param None * @retval None */ void Error_Handler(void) { /* Turn LED2 on */ BSP_LED_On(LED2); while (1) { } } /** * @brief Tamper event callback function * @param RTC handle * @retval None */ void HAL_RTCEx_Tamper1EventCallback(RTC_HandleTypeDef *hrtc) { } #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 can add his own implementation to report the file name and line number, ex: printf("Wrong parameters value: file %s on line %d\r\n", file, line) */ /* Infinite loop */ while (1) { } } #endif /** * @} */ /** * @} */ /************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/