/** * @brief Main program * @param None * @retval None */ int main(void) { uint32_t index = 0; RTC_TamperTypeDef stamperstructure; /* STM32F4xx HAL library initialization: - Configure the Flash prefetch - Systick timer is configured by default as source of time base, but user can eventually implement his proper time base source (a general purpose timer for example or other time source), keeping in mind that Time base duration should be kept 1ms since PPP_TIMEOUT_VALUEs are defined and handled in milliseconds basis. - Set NVIC Group Priority to 4 - Low Level Initialization */ HAL_Init(); /* Configure the system clock to 180 MHz */ SystemClock_Config(); /* Wait until MFX is ready after reset */ HAL_Delay(100); /* Since MFX is used, LED init is done after clock config */ /* Configure LED1, LED2, LED3 and LED4 */ BSP_LED_Init(LED1); BSP_LED_Init(LED2); BSP_LED_Init(LED3); BSP_LED_Init(LED4); /* Configure Tamper push-button button */ BSP_PB_Init(BUTTON_TAMPER, 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.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; RtcHandle.Instance = RTC; if (HAL_RTC_Init(&RtcHandle) != HAL_OK) { /* Initialization Error */ Error_Handler(); } /*##-2- Configure RTC Tamper ###############################################*/ stamperstructure.Tamper = RTC_TAMPER_1; stamperstructure.PinSelection = RTC_TAMPERPIN_PC13; 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(); } } /* Turn LED2 on */ BSP_LED_On(LED2); /*##-5- Wait for the tamper button is pressed ##############################*/ while (TamperStatus != SET); /*##-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 LED4 on */ BSP_LED_Toggle(LED4); /* Delay */ HAL_Delay(100); } }
/** * @brief This function handles TimeStamp interrupt request. * @param hrtc: RTC handle * @retval None */ void HAL_RTCEx_TamperTimeStampIRQHandler(RTC_HandleTypeDef *hrtc) { if(__HAL_RTC_TIMESTAMP_GET_IT(hrtc, RTC_IT_TS)) { /* Get the status of the Interrupt */ if((uint32_t)(hrtc->Instance->CR & RTC_IT_TS) != (uint32_t)RESET) { /* TIMESTAMP callback */ HAL_RTCEx_TimeStampEventCallback(hrtc); /* Clear the TIMESTAMP interrupt pending bit */ __HAL_RTC_TIMESTAMP_CLEAR_FLAG(hrtc,RTC_FLAG_TSF); } } /* Get the status of the Interrupt */ if(__HAL_RTC_TAMPER_GET_IT(hrtc,RTC_IT_TAMP1)) { /* Get the TAMPER Interrupt enable bit and pending bit */ if(((hrtc->Instance->TAFCR & (RTC_TAFCR_TAMPIE))) != (uint32_t)RESET) { /* Tamper callback */ HAL_RTCEx_Tamper1EventCallback(hrtc); /* Clear the Tamper interrupt pending bit */ __HAL_RTC_TAMPER_CLEAR_FLAG(hrtc,RTC_FLAG_TAMP1F); } } /* Get the status of the Interrupt */ if(__HAL_RTC_TAMPER_GET_IT(hrtc, RTC_IT_TAMP2)) { /* Get the TAMPER Interrupt enable bit and pending bit */ if(((hrtc->Instance->TAFCR & RTC_TAFCR_TAMPIE)) != (uint32_t)RESET) { /* Tamper callback */ HAL_RTCEx_Tamper2EventCallback(hrtc); /* Clear the Tamper interrupt pending bit */ __HAL_RTC_TAMPER_CLEAR_FLAG(hrtc, RTC_FLAG_TAMP2F); } } /* Clear the EXTI's Flag for RTC TimeStamp and Tamper */ __HAL_RTC_CLEAR_FLAG(RTC_EXTI_LINE_TAMPER_TIMESTAMP_EVENT); /* Change RTC state */ hrtc->State = HAL_RTC_STATE_READY; }
/** * @brief This function handles Tamper3 Polling. * @param hrtc: RTC handle * @param Timeout: Timeout duration * @retval HAL status */ HAL_StatusTypeDef HAL_RTCEx_PollForTamper3Event(RTC_HandleTypeDef *hrtc, uint32_t Timeout) { uint32_t tickstart = HAL_GetTick(); /* Get the status of the Interrupt */ while(__HAL_RTC_TAMPER_GET_FLAG(hrtc,RTC_FLAG_TAMP3F) == RESET) { if(Timeout != HAL_MAX_DELAY) { if((Timeout == 0) || ((HAL_GetTick()-tickstart) > Timeout)) { hrtc->State = HAL_RTC_STATE_TIMEOUT; return HAL_TIMEOUT; } } } /* Clear the Tamper Flag */ __HAL_RTC_TAMPER_CLEAR_FLAG(hrtc,RTC_FLAG_TAMP3F); /* Change RTC state */ hrtc->State = HAL_RTC_STATE_READY; return HAL_OK; }
/** * @brief Deactivates Tamper. * @param hrtc: pointer to a RTC_HandleTypeDef structure that contains * the configuration information for RTC. * @param Tamper: Selected tamper pin. * This parameter can be a value of @ref RTCEx_Tamper_Pins_Definitions * @retval HAL status */ HAL_StatusTypeDef HAL_RTCEx_DeactivateTamper(RTC_HandleTypeDef *hrtc, uint32_t Tamper) { /* Check input parameters */ if(hrtc == NULL) { return HAL_ERROR; } assert_param(IS_RTC_TAMPER(Tamper)); /* Process Locked */ __HAL_LOCK(hrtc); hrtc->State = HAL_RTC_STATE_BUSY; /* Disable the selected Tamper pin */ CLEAR_BIT(BKP->CR, BKP_CR_TPE); /* Disable the Tamper Interrupt in the BKP->CSR */ /* Configure the Tamper Interrupt in the BKP->CSR */ __HAL_RTC_TAMPER_DISABLE_IT(hrtc, RTC_IT_TAMP1); /* Clear the Tamper interrupt pending bit */ __HAL_RTC_TAMPER_CLEAR_FLAG(hrtc, RTC_FLAG_TAMP1F); SET_BIT(BKP->CSR, BKP_CSR_CTE); hrtc->State = HAL_RTC_STATE_READY; /* Process Unlocked */ __HAL_UNLOCK(hrtc); return HAL_OK; }
/** * @brief Tamper callback * @param hrtc : hrtc handle * @retval None */ void HAL_RTCEx_TimeStampEventCallback(RTC_HandleTypeDef *hrtc) { RTC_DateTypeDef sTimeStampDateget; RTC_TimeTypeDef sTimeStampget; /* Clear the Tamper Flag */ __HAL_RTC_TAMPER_CLEAR_FLAG(hrtc,RTC_FLAG_TAMP1F); /* Toggle LED4 */ BSP_LED_Toggle(LED4); #ifdef USE_LCD HAL_RTCEx_GetTimeStamp(&RtcHandle, &sTimeStampget, &sTimeStampDateget, RTC_FORMAT_BCD); BSP_LCD_SetFont(&Font12); /* Set the Back Color */ BSP_LCD_SetBackColor(LCD_COLOR_WHITE); /* Set the Text Color */ BSP_LCD_SetTextColor(LCD_COLOR_BLUE); BSP_LCD_DisplayStringAtLine(8, (uint8_t *)"TimeStamp Display"); /* Display Time Stamp */ RTC_Time_display(LINE(9), LCD_COLOR_BLACK , RTC_Get_Time(&sTimeStampget)); #else HAL_RTCEx_GetTimeStamp(&RtcHandle, &sTimeStampget, &sTimeStampDateget, RTC_FORMAT_BIN); /* Display time Format : hh:mm:ss */ sprintf((char*)aShowTimeStamp,"%0.2d:%0.2d:%0.2d", sTimeStampget.Hours, sTimeStampget.Minutes, sTimeStampget.Seconds); /* Display date Format : mm-dd */ sprintf((char*)aShowDateStamp,"%0.2d-%0.2d-%0.2d", sTimeStampDateget.Month, sTimeStampDateget.Date, 2013); #endif /* USE_LCD */ }
/** * @brief Configure the current time and date. * @param None * @retval None */ static void RTC_TamperConfig(void) { RTC_TamperTypeDef stamperstructure; /*##-1- Configure the Tamper ###############################################*/ HAL_RTCEx_DeactivateTamper(&RtcHandle, RTC_TAMPER_1); /* Use PC13 as Tamper 1 with interrupt mode */ stamperstructure.Filter = RTC_TAMPERFILTER_DISABLE; stamperstructure.PinSelection = RTC_TAMPERPIN_PC13; stamperstructure.Tamper = RTC_TAMPER_1; stamperstructure.Trigger = RTC_TAMPERTRIGGER_FALLINGEDGE; stamperstructure.SamplingFrequency = RTC_TAMPERSAMPLINGFREQ_RTCCLK_DIV256; stamperstructure.PrechargeDuration = RTC_TAMPERPRECHARGEDURATION_1RTCCLK; stamperstructure.TamperPullUp = RTC_TAMPER_PULLUP_DISABLE; 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); }
/** * @brief This function handles Tamper interrupt request. * @param hrtc: pointer to a RTC_HandleTypeDef structure that contains * the configuration information for RTC. * @retval None */ void HAL_RTCEx_TamperIRQHandler(RTC_HandleTypeDef *hrtc) { /* Get the status of the Interrupt */ if(__HAL_RTC_TAMPER_GET_IT_SOURCE(hrtc, RTC_IT_TAMP1)) { /* Get the TAMPER Interrupt enable bit and pending bit */ if(__HAL_RTC_TAMPER_GET_FLAG(hrtc, RTC_FLAG_TAMP1F) != (uint32_t)RESET) { /* Tamper callback */ HAL_RTCEx_Tamper1EventCallback(hrtc); /* Clear the Tamper interrupt pending bit */ __HAL_RTC_TAMPER_CLEAR_FLAG(hrtc,RTC_FLAG_TAMP1F); } } /* Change RTC state */ hrtc->State = HAL_RTC_STATE_READY; }
/** * @brief Sets Tamper with interrupt. * @note By calling this API we force the tamper interrupt for all tampers. * @param hrtc: pointer to a RTC_HandleTypeDef structure that contains * the configuration information for RTC. * @param sTamper: Pointer to RTC Tamper. * @retval HAL status */ HAL_StatusTypeDef HAL_RTCEx_SetTamper_IT(RTC_HandleTypeDef *hrtc, RTC_TamperTypeDef* sTamper) { uint32_t tmpreg = 0U; /* Check the parameters */ assert_param(IS_RTC_TAMPER(sTamper->Tamper)); assert_param(IS_RTC_TAMPER_PIN(sTamper->PinSelection)); assert_param(IS_RTC_TAMPER_TRIGGER(sTamper->Trigger)); /* Process Locked */ __HAL_LOCK(hrtc); hrtc->State = HAL_RTC_STATE_BUSY; tmpreg = ((uint32_t)sTamper->Tamper | (uint32_t)sTamper->PinSelection | (uint32_t)sTamper->Trigger); hrtc->Instance->TAFCR &= (uint32_t)~((uint32_t)RTC_TAFCR_TAMP1E | (uint32_t)RTC_TAFCR_TAMP1TRG | (uint32_t)RTC_TAFCR_TAMPINSEL | (uint32_t)RTC_TAFCR_TAMPIE); hrtc->Instance->TAFCR |= tmpreg; /* Configure the Tamper Interrupt in the RTC_TAFCR */ hrtc->Instance->TAFCR |= (uint32_t)RTC_TAFCR_TAMPIE; /* Clear RTC Tamper 1 flag */ __HAL_RTC_TAMPER_CLEAR_FLAG(hrtc, RTC_FLAG_TAMP1F); /* RTC Tamper Interrupt Configuration: EXTI configuration */ __HAL_RTC_TAMPER_TIMESTAMP_EXTI_ENABLE_IT(); EXTI->RTSR |= RTC_EXTI_LINE_TAMPER_TIMESTAMP_EVENT; hrtc->State = HAL_RTC_STATE_READY; /* Process Unlocked */ __HAL_UNLOCK(hrtc); return HAL_OK; }
/** * @brief Main program * @param None * @retval None */ int main(void) { uint32_t index = 0; RTC_TamperTypeDef stamperstructure; /* STM32F103xG HAL library initialization: - Configure the Flash prefetch - Systick timer is configured by default as source of time base, but user can eventually implement his proper time base source (a general purpose timer for example or other time source), keeping in mind that Time base duration should be kept 1ms since PPP_TIMEOUT_VALUEs are defined and handled in milliseconds basis. - Set NVIC Group Priority to 4 - Low Level Initialization */ HAL_Init(); /* Configure the system clock to 72 MHz */ SystemClock_Config(); /* Configure LED1, LED2, LED3 and LED4 */ BSP_LED_Init(LED1); BSP_LED_Init(LED2); BSP_LED_Init(LED3); BSP_LED_Init(LED4); /* Configure Key push-button button */ BSP_PB_Init(BUTTON_KEY, BUTTON_MODE_GPIO); /*##-1- Configure the RTC peripheral #######################################*/ /* Configure RTC prescaler and RTC data registers */ /* RTC configured as follow: - Asynch Prediv = Calculated automatically by HAL */ RtcHandle.Instance = RTC; RtcHandle.Init.AsynchPrediv = RTC_AUTO_1_SECOND; if (HAL_RTC_Init(&RtcHandle) != HAL_OK) { /* Initialization Error */ Error_Handler(); } /*##-2- Configure RTC Tamper ###############################################*/ stamperstructure.Tamper = RTC_TAMPER_1; stamperstructure.Trigger = RTC_TAMPERTRIGGER_LOWLEVEL; 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(); } } /* Turn LED2 on */ BSP_LED_On(LED2); /*##-5- Wait for the tamper button is pressed ##############################*/ while (TamperStatus != SET); /*##-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 LED4 on */ BSP_LED_Toggle(LED4); /* Delay */ HAL_Delay(100); } }
/** * @brief Main program * @param None * @retval None */ int main(void) { uint32_t index = 0; /* STM32F4xx HAL library initialization: - Configure the Flash prefetch, instruction and Data caches - Configure the Systick to generate an interrupt each 1 msec - Set NVIC Group Priority to 4 - Global MSP (MCU Support Package) initialization */ HAL_Init(); /* Configure LED1, LED2, LED3 and LED4 */ BSP_LED_Init(LED1); BSP_LED_Init(LED2); BSP_LED_Init(LED3); BSP_LED_Init(LED4); /* Configure the system clock to 168 MHz */ SystemClock_Config(); RtcHandle.Instance = RTC; /*##-1- Configure the RTC peripheral #######################################*/ /* Configure RTC prescaler and RTC data registers */ /* RTC configured as follow: - 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.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(); } /* Clear the Tamper Flag */ __HAL_RTC_TAMPER_CLEAR_FLAG(&RtcHandle,RTC_FLAG_TAMP1F); /*##-2- Configure RTC Tamper ###############################################*/ /* Configure RTC Tamper */ RTC_TamperConfig(); /*##-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(); } } /* Turn LED2 on */ BSP_LED_On(LED2); /*##-5- Wait for the tamper button is pressed ##############################*/ while(TamperStatus != SET); /*##-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) { /* Toggle LED4 */ BSP_LED_Toggle(LED4); /* Delay */ HAL_Delay(100); } }
/** * @brief Handle TimeStamp interrupt request. * @param hrtc: RTC handle * @retval None */ void HAL_RTCEx_TamperTimeStampIRQHandler(RTC_HandleTypeDef *hrtc) { /* Get the TimeStamp interrupt source enable status */ if(__HAL_RTC_TIMESTAMP_GET_IT_SOURCE(hrtc, RTC_IT_TS) != RESET) { /* Get the pending status of the TIMESTAMP Interrupt */ if(__HAL_RTC_TIMESTAMP_GET_FLAG(hrtc, RTC_FLAG_TSF) != RESET) { /* TIMESTAMP callback */ HAL_RTCEx_TimeStampEventCallback(hrtc); /* Clear the TIMESTAMP interrupt pending bit */ __HAL_RTC_TIMESTAMP_CLEAR_FLAG(hrtc, RTC_FLAG_TSF); } } /* Get the Tamper interrupts source enable status */ if(__HAL_RTC_TAMPER_GET_IT_SOURCE(hrtc, RTC_IT_TAMP)) { /* Get the pending status of the Tamper1 Interrupt */ if(__HAL_RTC_TAMPER_GET_FLAG(hrtc, RTC_FLAG_TAMP1F) != RESET) { /* Tamper1 callback */ HAL_RTCEx_Tamper1EventCallback(hrtc); /* Clear the Tamper1 interrupt pending bit */ __HAL_RTC_TAMPER_CLEAR_FLAG(hrtc, RTC_FLAG_TAMP1F); } } /* Get the Tamper interrupts source enable status */ if(__HAL_RTC_TAMPER_GET_IT_SOURCE(hrtc, RTC_IT_TAMP)) { /* Get the pending status of the Tamper2 Interrupt */ if(__HAL_RTC_TAMPER_GET_FLAG(hrtc, RTC_FLAG_TAMP2F) != RESET) { /* Tamper2 callback */ HAL_RTCEx_Tamper2EventCallback(hrtc); /* Clear the Tamper2 interrupt pending bit */ __HAL_RTC_TAMPER_CLEAR_FLAG(hrtc, RTC_FLAG_TAMP2F); } } #if defined(STM32F071xB) || defined(STM32F072xB) || defined(STM32F078xx) || defined(STM32F091xC) || defined(STM32F098xx) /* Get the Tamper interrupts source enable status */ if(__HAL_RTC_TAMPER_GET_IT_SOURCE(hrtc, RTC_IT_TAMP)) { /* Get the pending status of the Tamper3 Interrupt */ if(__HAL_RTC_TAMPER_GET_FLAG(hrtc, RTC_FLAG_TAMP3F) != RESET) { /* Tamper3 callback */ HAL_RTCEx_Tamper3EventCallback(hrtc); /* Clear the Tamper3 interrupt pending bit */ __HAL_RTC_TAMPER_CLEAR_FLAG(hrtc, RTC_FLAG_TAMP3F); } } #endif /* Clear the EXTI's Flag for RTC TimeStamp and Tamper */ __HAL_RTC_TAMPER_TIMESTAMP_EXTI_CLEAR_FLAG(); /* Change RTC state */ hrtc->State = HAL_RTC_STATE_READY; }