/** * @brief This function handles RTC Tamper and Time Stamp interrupts requests. * @param None * @retval None */ void TAMP_STAMP_IRQHandler(void) { if(RTC_GetFlagStatus(RTC_FLAG_TAMP1F) != RESET) { /* Tamper 1 detection event occurred */ /* Check if RTC Backup Data registers are cleared */ if(IsBackupRegReset() == 0) { /* OK, RTC Backup Data registers are reset as expected */ /* Toggle LED2 */ STM_EVAL_LEDToggle(LED2); } else { /* RTC Backup Data registers are not reset */ /* Toggle LED4 */ STM_EVAL_LEDToggle(LED4); } /* Clear Tamper 1 pin Event pending flag */ RTC_ClearFlag(RTC_FLAG_TAMP1F); /* Disable Tamper pin 1 */ RTC_TamperCmd(RTC_Tamper_1, DISABLE); /* Enable Tamper pin */ RTC_TamperCmd(RTC_Tamper_1, ENABLE); } }
/** * @brief RTC Tamper Configuration. * @param None * @retval None */ void Tamper_Init(void) { RTC_TamperFilterConfig((RTC_TamperFilter_TypeDef)RTC_TampFilter[TampFilterIndex]); RTC_TamperSamplingFreqConfig(RTC_TamperSamplingFreq_RTCCLK_Div32768); RTC_TamperPinsPrechargeDuration(RTC_TamperPrechargeDuration_None); RTC_TamperLevelConfig(RTC_Tamper_1, RTC_TamperLevel_Low ); RTC_TamperCmd(RTC_Tamper_1, ENABLE); RTC_ITConfig(RTC_IT_TAMP, ENABLE); }
/** * @brief This function handles Tamper interrupt request. * @param None * @retval None */ void TAMPER_STAMP_IRQHandler(void) { if (RTC_GetFlagStatus(RTC_FLAG_TAMP1F) != RESET) { /* Tamper 1 detection event occurred */ /* Check if RTC Backup Data registers are cleared */ if (IsBackupRegReset() == 0) { /* OK, RTC Backup Data registers are reset as expected */ /* Turn on GREEN and BLUE */ GPIO_SetBits(GPIOB, LD_GREEN_GPIO_PIN | LD_BLUE_GPIO_PIN); } else { /* RTC Backup Data registers are not reset */ /* Turn off GREEN and BLUE */ GPIO_ResetBits(GPIOB, LD_GREEN_GPIO_PIN | LD_BLUE_GPIO_PIN); } /* Clear Tamper 1 pin Event(TAMP1F) pending flag */ RTC_ClearFlag(RTC_FLAG_TAMP1F); /* Disable Tamper pin 1 */ RTC_TamperCmd(RTC_Tamper_1, DISABLE); /* Enable Tamper pin */ RTC_TamperCmd(RTC_Tamper_1, ENABLE); } }
/** * @brief RTC Tamper Configuration. * @param None * @retval None */ void Tamper_Init(void) { /* Tamper detection after time < 2 sample and time > 1 sample*/ RTC_TamperFilterConfig(RTC_TamperFilter_2Sample); /* configure 1 Sample = RTCCLK/32768 = 1s */ RTC_TamperSamplingFreqConfig(RTC_TamperSamplingFreq_RTCCLK_Div32768); /* Tamper sensitivity is to Low level */ RTC_TamperLevelConfig(RTC_Tamper_1, RTC_TamperLevel_Low ); /* Enable Tamper 1*/ RTC_TamperCmd(RTC_Tamper_1, ENABLE); /* Enable Tamper Interrupt */ RTC_ITConfig(RTC_IT_TAMP, ENABLE); }
/** * @brief RTC Tamper Configuration. * @param None * @retval None */ void RTC_TamperConfig(void) { EXTI_InitTypeDef EXTI_InitStructure; NVIC_InitTypeDef NVIC_InitStructure; /* EXTI configuration */ EXTI_ClearITPendingBit(EXTI_Line21); EXTI_InitStructure.EXTI_Line = EXTI_Line21; EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt; EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising; EXTI_InitStructure.EXTI_LineCmd = ENABLE; EXTI_Init(&EXTI_InitStructure); /* Enable RTC_TAMP_STAMP_IRQn */ NVIC_InitStructure.NVIC_IRQChannel = TAMP_STAMP_IRQn; NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; NVIC_Init(&NVIC_InitStructure); /* determines the number of active pulse for the specific level */ RTC_TamperFilterConfig(RTC_TamperFilter_2Sample); /* Determines the frequency at which each of the tamper inputs are sampled */ RTC_TamperSamplingFreqConfig(RTC_TamperSamplingFreq_RTCCLK_Div16384); /* Select the tamper 1 with High level */ RTC_TamperTriggerConfig(RTC_Tamper_1, RTC_TamperTrigger_LowLevel ); /* Enabale the tamper 1 */ RTC_TamperCmd(RTC_Tamper_1 , ENABLE); /* Enable Tamper interrupt */ RTC_ITConfig(RTC_IT_TAMP, ENABLE); /* Clear tamper 1 falg */ RTC_ClearFlag(RTC_FLAG_TAMP1F); }
/** * @brief Configure the RTC peripheral by selecting the clock source. * @param None * @retval None */ void RTC_Config(void) { NVIC_InitTypeDef NVIC_InitStructure; EXTI_InitTypeDef EXTI_InitStructure; /* Enable the PWR clock */ RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR, ENABLE); /* Allow access to RTC */ PWR_BackupAccessCmd(ENABLE); /* Reset BKP Domain */ RCC_BackupResetCmd(ENABLE); RCC_BackupResetCmd(DISABLE); #if defined (RTC_CLOCK_SOURCE_LSI) /* LSI used as RTC source clock*/ /* The RTC Clock may varies due to LSI frequency dispersion. */ /* Enable the LSI OSC */ RCC_LSICmd(ENABLE); /* Wait till LSI is ready */ while(RCC_GetFlagStatus(RCC_FLAG_LSIRDY) == RESET) { } /* Select the RTC Clock Source */ RCC_RTCCLKConfig(RCC_RTCCLKSource_LSI); #elif defined (RTC_CLOCK_SOURCE_LSE) /* LSE used as RTC source clock */ /* Enable the LSE OSC */ RCC_LSEConfig(RCC_LSE_ON); /* Wait till LSE is ready */ while(RCC_GetFlagStatus(RCC_FLAG_LSERDY) == RESET) { } /* Select the RTC Clock Source */ RCC_RTCCLKConfig(RCC_RTCCLKSource_LSE); #else #error Please select the RTC Clock source inside the main.c file #endif /* RTC_CLOCK_SOURCE_LSI */ /* Enable The external line21 interrupt */ EXTI_ClearITPendingBit(EXTI_Line21); EXTI_InitStructure.EXTI_Line = EXTI_Line21; EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt; EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising; EXTI_InitStructure.EXTI_LineCmd = ENABLE; EXTI_Init(&EXTI_InitStructure); /* Enable TAMPER IRQChannel */ NVIC_InitStructure.NVIC_IRQChannel = TAMP_STAMP_IRQn; NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; NVIC_Init(&NVIC_InitStructure); /* Disable the Tamper 1 detection */ RTC_TamperCmd(RTC_Tamper_1, DISABLE); /* Clear Tamper 1 pin Event(TAMP1F) pending flag */ RTC_ClearFlag(RTC_FLAG_TAMP1F); /* Configure the Tamper 1 Trigger */ RTC_TamperTriggerConfig(RTC_Tamper_1, RTC_TamperTrigger_FallingEdge); /* Enable the Tamper interrupt */ RTC_ITConfig(RTC_IT_TAMP, ENABLE); /* Clear Tamper 1 pin interrupt pending bit */ RTC_ClearITPendingBit(RTC_IT_TAMP1); /* Enable the Tamper 1 detection */ RTC_TamperCmd(RTC_Tamper_1, ENABLE); }
/** * @brief Main program. * @param None * @retval None */ int main(void) { /*!< At this stage the microcontroller clock setting is already configured, this is done through SystemInit() function which is called from startup file (startup_stm32f0xx.s) before to branch to application main. To reconfigure the default setting of SystemInit() function, refer to system_stm32f0xx.c file */ RTC_TimeTypeDef RTC_TimeStruct; RTC_TimeTypeDef RTC_TimeStructureInit; RTC_TimeTypeDef RTC_StampTimeStruct; /* Configure the external interrupt "RIGHT" and "LEFT" buttons */ STM_EVAL_PBInit(BUTTON_RIGHT,BUTTON_MODE_EXTI); STM_EVAL_PBInit(BUTTON_LEFT,BUTTON_MODE_EXTI); /* Configure the RTC peripheral by selecting the clock source.*/ RTC_Config(); /* LCD Display init */ Display_Init(); /* Configure the RTC tamper register : To Clear all the Backup data register */ RTC_TamperConfig(); /* Initialize time Stucture */ RTC_TimeStructInit(&RTC_TimeStruct); /* Infinite loop */ while (1) { /* Set the LCD Back Color and text size */ LCD_SetFont(&Font16x24); LCD_SetBackColor(White); /* Check on the event 'start' */ if(StartEvent != 0x0) { /* Get the RTC sub second fraction */ SecondFraction = (((256 - (uint32_t)RTC_GetSubSecond()) * 1000) / 256); /* Get the Curent time */ RTC_GetTime(RTC_Format_BIN, &RTC_TimeStruct); /* Refresh : Display the curent time and the sub second on the LCD */ RTC_Time_Display(37, Black , RTC_Get_Time(SecondFraction , &RTC_TimeStruct)); } else { /* Re-initialize the Display time on the LCD */ RTC_Time_InitDisplay(); } /* Left button is pressed */ if (Button_State == LEFT_ON) { /* Enable Tamper interrupt */ RTC_ITConfig(RTC_IT_TAMP, ENABLE); /* Enabale the tamper 1 */ RTC_TamperCmd(RTC_Tamper_1 , ENABLE); /* Set the LCD Back Color */ LCD_SetBackColor(White); /* Clear the LCD line 5 */ LCD_ClearLine(Line5); /* Get the current time */ RTC_GetTime(RTC_Format_BIN, &RTC_TimeStructureInit); CurrentTimeSec = (RTC_TimeStructureInit.RTC_Hours * 3600) + (RTC_TimeStructureInit.RTC_Minutes * 60) + RTC_TimeStructureInit.RTC_Seconds; /* start count */ StartEvent = 0x1; /* Reinitialize Button_State variable */ Button_State = 0; } /* Right button is pressed */ else if (Button_State == RIGHT_ON) { uint16_t Colorx; if (BackupIndex < 5) { if((uint8_t)(BackupIndex% 2) != 0x0) { /* Set LCD backcolor*/ LCD_SetBackColor(Blue2); Colorx = White; } else { /* Set LCD backcolor*/ LCD_SetBackColor(Cyan); Colorx = Black; } SubSecFrac = 0; /* Get the Current sub second and time */ SubSecFrac = (((256 - (uint32_t)RTC_GetSubSecond()) * 1000) / 256); RTC_GetTime(RTC_Format_BIN, &RTC_StampTimeStruct); LCD_SetFont(&Font16x24); /* Display result on the LCD */ RTC_Time_Display( LINE(3 + BackupIndex), Colorx, RTC_Get_Time(SubSecFrac , &RTC_StampTimeStruct) ); if (BackupIndex < 2) { /* Save time register to Backup register ( the first 5 register is reserved for time) */ RTC_WriteBackupRegister(BKPDataReg[BackupIndex],(uint32_t)RTC->TR); /* Save sub second time stamp register ( the latest 6 register is reserved for time) */ RTC_WriteBackupRegister(BKPDataReg[BackupIndex + 2], SubSecFrac); } } else { /* the backup register is full with 10trials */ /* Set the LCD Back Color */ LCD_SetBackColor(White); LCD_SetFont(&Font12x12); /* Set the LCD Text Color */ LCD_SetTextColor(Red); LCD_DisplayStringLine(LINE(16), (uint8_t *)MESSAGE4); LCD_DisplayStringLine(LINE(17), (uint8_t *)MESSAGE5); } BackupIndex++; /* Set the LCD Back Color */ LCD_SetBackColor(White); /* Reinitialize Button_State variable */ Button_State = 0; } /* TAMPER button is pressed */ else if (Button_RTC == RTC_TAMP) { /* Set the LCD Back Color */ LCD_SetBackColor(White); LCD_SetFont(&Font16x24); /* Clear LCD line 5 to 9 */ for (i=0; i < 5; i++) { /* Clear all the LCD lignes from 3 to 7 */ LCD_ClearLine(LINE(3+i)); } /* reset Counter */ BackupIndex = 0 ; /* Enetr to idle */ StartEvent =0x0; LCD_SetFont(&Font12x12); RTC_Time_InitDisplay(); LCD_SetFont(&Font12x12); LCD_ClearLine(LINE(16)); LCD_ClearLine(LINE(17)); /* Enable Tamper interrupt */ RTC_ITConfig(RTC_IT_TAMP, DISABLE); /* Enabale the tamper 1 */ RTC_TamperCmd(RTC_Tamper_1 , DISABLE); /* Reinitialize Button_RTC variable */ Button_RTC = 0; } } }