/**
  * @brief  Configures RTC clock source and prescaler.
  * @param  None
  * @retval None
  */
void RTC_Configuration(void)
{
    /* RTC clock source configuration ----------------------------------------*/
	/* Allow access to BKP Domain */
  	PWR_BackupAccessCmd(ENABLE);
	
    /* Reset Backup Domain */
    BKP_DeInit();
  
    /* Enable LSE OSC */
	RCC_LSICmd(ENABLE);
    /* Wait till LSE is ready */
	while(RCC_GetFlagStatus(RCC_FLAG_LSIRDY) == RESET)
    {
    }

    /* Select the RTC Clock Source */
	RCC_RTCCLKConfig(RCC_RTCCLKSource_LSI);

    /* Enable the RTC Clock */
    RCC_RTCCLKCmd(ENABLE);

    /* RTC configuration -----------------------------------------------------*/
    /* Wait for RTC APB registers synchronisation */
    RTC_WaitForSynchro();

    /* Set the RTC time base to 1s */
    RTC_SetPrescaler(32767);  
    /* Wait until last write operation on RTC registers has finished */
    RTC_WaitForLastTask();
	RTC_ITConfig(RTC_IT_ALR, ENABLE);
	RTC_WaitForLastTask();
  
}
Beispiel #2
0
void RTC_Configuration(void)
{
 	/* Enable PWR and BKP clocks */
	RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR | RCC_APB1Periph_BKP, ENABLE);
 	/* Allow access to BKP Domain */
	PWR_BackupAccessCmd(ENABLE);
 	/* Reset Backup Domain */
	BKP_DeInit();
 	// Select HSE/128 as RTC Clock Source
	RCC_RTCCLKConfig(RCC_RTCCLKSource_HSE_Div128);  
	/* Enable RTC Clock */
	RCC_RTCCLKCmd(ENABLE);
	/* Wait for RTC registers synchronization */
	RTC_WaitForSynchro();
	/* Wait until last write operation on RTC registers has finished */
	RTC_WaitForLastTask();
	/* Enable the RTC Second */  
//	RTC_ITConfig(RTC_IT_SEC, ENABLE);
	/* Wait until last write operation on RTC registers has finished */
	RTC_WaitForLastTask();
	/* Set RTC prescaler: set RTC period to 1sec  1ms */
	RTC_SetPrescaler(62); /*62499 RTC period = RTCCLK/RTC_PR = 8M / 128 = 62.5kHz ) -> (62499+1) */
	/* Wait until last write operation on RTC registers has finished */
	RTC_WaitForLastTask();
}
Beispiel #3
0
 /**
  * @file   RTC_Configuration
  * @brief  Configures the RTC.
  * @param  无
  * @retval 无
  */
static void RTC_Configuration(void)
{
  //启用PWR和BKP的时钟(from APB1)
  RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR | RCC_APB1Periph_BKP, ENABLE);
  //后备域解锁
  PWR_BackupAccessCmd(ENABLE);
  //备份寄存器模块复位
  BKP_DeInit();
  //外部32.768K时钟使能
  RCC_LSEConfig(RCC_LSE_ON);
  //等待稳定
  while (RCC_GetFlagStatus(RCC_FLAG_LSERDY) == RESET)
  {}
  //RTC时钟源配置成LSE(外部32.768K)
  RCC_RTCCLKConfig(RCC_RTCCLKSource_LSE);
  //RTC开启
  RCC_RTCCLKCmd(ENABLE);
  //开启后需要等待APB1时钟与RTC时钟同步,才能读写寄存器
  RTC_WaitForSynchro();
  //读写寄存器前,要确定上一个操作已经结束
  RTC_WaitForLastTask();
  //使能秒中断
  RTC_ITConfig(RTC_IT_SEC, ENABLE);
  //等待寄存器写入完成
  RTC_WaitForLastTask();
  //设置RTC分频器,使RTC时钟为1Hz
  //RTC period = RTCCLK/RTC_PR = (32.768 KHz)/(32767+1)
  RTC_SetPrescaler(32767); 
  //等待写入完成
  RTC_WaitForLastTask();
}
void RTC_Configuration(void)
{
	/* Reset Backup Domain */
	BKP_DeInit();

  /* Enable LSE */
  RCC_LSEConfig(RCC_LSE_ON);
  /* Wait till LSE is ready */
  while (RCC_GetFlagStatus(RCC_FLAG_LSERDY) == RESET)
  {}

  /* Select LSE as RTC Clock Source */
  RCC_RTCCLKConfig(RCC_RTCCLKSource_LSE);

  /* Enable RTC Clock */
  RCC_RTCCLKCmd(ENABLE);

  /* Wait for RTC registers synchronization */
  RTC_WaitForSynchro();

  /* Wait until last write operation on RTC registers has finished */
  RTC_WaitForLastTask();

  /* Set RTC prescaler: set RTC period to 1sec */
  RTC_SetPrescaler(32767); /* RTC period = RTCCLK/RTC_PR = (32.768 KHz)/(32767+1) */

  /* Wait until last write operation on RTC registers has finished */
  RTC_WaitForLastTask();

}
Beispiel #5
0
void RTC_Configuration(void)
{
	/* Enable PWR and BKP clocks */
  	RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR | RCC_APB1Periph_BKP, ENABLE);

  	/* Allow access to BKP Domain */
  	PWR_BackupAccessCmd(ENABLE);

  	/* Reset Backup Domain */
  	BKP_DeInit();

#ifdef RTCClockSource_LSI
  /* Enable LSI */ 
  RCC_LSICmd(ENABLE);
  /* Wait till LSI is ready */
  while(RCC_GetFlagStatus(RCC_FLAG_LSIRDY) == RESET)
  {
  }

  /* Select LSI as RTC Clock Source */
  RCC_RTCCLKConfig(RCC_RTCCLKSource_LSI);  
#elif defined	RTCClockSource_LSE
  	/* Enable LSE */
  	RCC_LSEConfig(RCC_LSE_ON);
  	/* Wait till LSE is ready */
  	while (RCC_GetFlagStatus(RCC_FLAG_LSERDY) == RESET)
  	{}

  	/* Select LSE as RTC Clock Source */
  	RCC_RTCCLKConfig(RCC_RTCCLKSource_LSE);
#endif
  	/* Enable RTC Clock */
  	RCC_RTCCLKCmd(ENABLE);

  	/* Wait for RTC registers synchronization */
  	RTC_WaitForSynchro();

  	/* Wait until last write operation on RTC registers has finished */
  	RTC_WaitForLastTask();

  	/* Enable the RTC Second */
  	RTC_ITConfig(RTC_IT_SEC, ENABLE);

  	/* Wait until last write operation on RTC registers has finished */
  	RTC_WaitForLastTask();

  	/* Set RTC prescaler: set RTC period to 1sec */
      /* Set RTC prescaler: set RTC period to 1sec */
#ifdef RTCClockSource_LSI
  		RTC_SetPrescaler(31999); /* RTC period = RTCCLK/RTC_PR = (32.000 KHz)/(31999+1) */
#elif defined	RTCClockSource_LSE
  		RTC_SetPrescaler(32767); /* RTC period = RTCCLK/RTC_PR = (32.768 KHz)/(32767+1) */
#endif

  //	RTC_SetPrescaler(32767); /* RTC period = RTCCLK/RTC_PR = (32.768 KHz)/(32767+1) */

  	/* Wait until last write operation on RTC registers has finished */
  	RTC_WaitForLastTask();
}
Beispiel #6
0
// 配置RTC硬件。
void RTC_Configure(void)
{
  	/* Enable PWR and BKP clocks */
  	RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR | RCC_APB1Periph_BKP, ENABLE);
  
  	/* Allow access to BKP Domain */
  	PWR_BackupAccessCmd(ENABLE);
	
	RCC_RTCCLKCmd(ENABLE);

  	/* Reset Backup Domain */
  	BKP_DeInit();
  
  	/* Wait until last write operation on RTC registers has finished */
  	RTC_WaitForLastTask();	

#ifdef RTCClockSource_LSI

  	/* Enable LSI */ 
  	RCC_LSICmd(ENABLE);

  	/* Wait till LSI is ready */
  	while(RCC_GetFlagStatus(RCC_FLAG_LSIRDY) == RESET);
	
  	/* Select LSI as RTC Clock Source */
  	RCC_RTCCLKConfig(RCC_RTCCLKSource_LSI);  

#elif defined	RTCClockSource_LSE  

  	/* Enable LSE */
  	RCC_LSEConfig(RCC_LSE_ON);

	 /* Wait till LSE is ready */
  	while(RCC_GetFlagStatus(RCC_FLAG_LSERDY) == RESET);

  	/* Select LSE as RTC Clock Source */
  	RCC_RTCCLKConfig(RCC_RTCCLKSource_LSE);  
	
#endif

	// 上电后需要校准RTC时钟,也即准确计算出RTC的周期时长。
	RTC_Calibrate();

#ifdef RTCClockOutput_Enable  

  	/* Disable the Tamper Pin */
  	BKP_TamperPinCmd(DISABLE); /* To output RTCCLK/64 on Tamper pin, the tamper functionality must be disabled */
                               
  	/* Enable RTC Clock Output on Tamper Pin */
  	BKP_RTCCalibrationClockOutputCmd(ENABLE);
  
#endif 
  
  	/*允许RTC报警中断*/
	RTC_ITConfig(RTC_IT_ALR, ENABLE); 

  	/* Wait until last write operation on RTC registers has finished */
  	RTC_WaitForLastTask();
}
uint8_t RTC_AutoTest(void)
{

	uint8_t i = 0;
	/* Enable PWR and BKP clocks */
	RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR | RCC_APB1Periph_BKP, ENABLE);
	
	/* Allow access to BKP Domain */
	PWR_BackupAccessCmd(ENABLE);
	
	/* Reset Backup Domain */
	BKP_DeInit();
	
	/* Enable LSE */
	RCC_LSEConfig(RCC_LSE_ON);
	
	/* Wait till LSE is ready */
	while (RCC_GetFlagStatus(RCC_FLAG_LSERDY) == RESET)
	{	
		Delay_us(50000);
		i++;
		
		if(i>100) //5秒都还没起振,坏了
		{
			return 0;
		}
	}	

	/* Select LSE as RTC Clock Source */
	RCC_RTCCLKConfig(RCC_RTCCLKSource_LSE);
	
	/* Enable RTC Clock */
	RCC_RTCCLKCmd(ENABLE);
	
	/* Wait for RTC registers synchronization 
	 * 因为RTC时钟是低速的,内环时钟是高速的,所以要同步
	 */
	RTC_WaitForSynchro();
	
	/* Wait until last write operation on RTC registers has finished */
	RTC_WaitForLastTask();
	
	/* Enable the RTC Second */
	RTC_ITConfig(RTC_IT_SEC, ENABLE);
	
	/* Wait until last write operation on RTC registers has finished */
	RTC_WaitForLastTask();
	
	/* Set RTC prescaler: set RTC period to 1sec */
	RTC_SetPrescaler(32767); /* RTC period = RTCCLK/RTC_PR = (32.768 KHz)/(32767+1) = 1HZ */
	
	/* Wait until last write operation on RTC registers has finished */
	RTC_WaitForLastTask();
	
	return 1;


}
Beispiel #8
0
void SetRtcTime(void)
{
		/* Enable PWR and BKP clocks */
		RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR | RCC_APB1Periph_BKP, ENABLE);

		/* Allow access to BKP Domain */
		PWR_BackupAccessCmd(ENABLE);

		/* Reset Backup Domain */
		BKP_DeInit();

		#ifdef RTC_LSE
		/* Enable LSE */
		RCC_LSEConfig(RCC_LSE_ON);
		/* Wait till LSE is ready */
		while (RCC_GetFlagStatus(RCC_FLAG_LSERDY) == RESET)
		{}

		/* Select LSE as RTC Clock Source */
		RCC_RTCCLKConfig(RCC_RTCCLKSource_LSE);
		#else
		/* 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);
		#endif

		/* Enable RTC Clock */
		RCC_RTCCLKCmd(ENABLE);

		/* Wait for RTC registers synchronization */
		RTC_WaitForSynchro();

		/* Wait until last write operation on RTC registers has finished */
		RTC_WaitForLastTask();

		/* Enable the RTC Second */
		RTC_ITConfig(RTC_IT_SEC, ENABLE);

		/* Wait until last write operation on RTC registers has finished */
		RTC_WaitForLastTask();


		printf("\r\n RTC configured....");

		/* Adjust time by values entred by the user on the hyperterminal */
//		Time_Adjust();
		Time_SetCalendarTime(time_set);

		BKP_WriteBackupRegister(BKP_DR1, 0xA5A5);
		/* Wait until last write operation on RTC registers has finished */
		RTC_WaitForLastTask();
}
Beispiel #9
0
static void rtcConfig(void)
{
    /* Enable PWR and BKP clocks */
    RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR | RCC_APB1Periph_BKP, ENABLE);

    /* Allow access to BKP Domain */
    PWR_BackupAccessCmd(ENABLE);

    /* Reset Backup Domain */
    BKP_DeInit();

    /* 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);

    /* Enable RTC Clock */
    RCC_RTCCLKCmd(ENABLE);

    /* Wait for RTC registers synchronization */
    RTC_WaitForSynchro();

    /* Wait until last write operation on RTC registers has finished */
    RTC_WaitForLastTask();

    /* Enable the RTC Second */
    RTC_ITConfig(RTC_IT_SEC, ENABLE);

    /* Wait until last write operation on RTC registers has finished */
    RTC_WaitForLastTask();

#ifndef PRECISION_IN_MS
    /* Set RTC prescaler: set RTC period to 1 sec */
    RTC_SetPrescaler(40000); //LSI default is 40k HZ
#else
    /* Set RTC prescaler: set RTC period to 1ms */
    RTC_SetPrescaler(40); //LSI default is 40k HZ
#endif

    /* Wait until last write operation on RTC registers has finished */
    RTC_WaitForLastTask();

    /* To output second signal on Tamper pin, the tamper functionality
     * must be disabled (by default this functionality is disabled)
     */
    //BKP_TamperPinCmd(DISABLE);

    /* Enable the RTC Second Output on Tamper Pin */
    //BKP_RTCOutputConfig(BKP_RTCOutputSource_Second);
}
Beispiel #10
0
/*
************************************************************
*	函数名称:	RTC_Init
*
*	函数功能:	RTC初始化
*
*	入口参数:	无
*
*	返回参数:	无
*
*	说明:		
************************************************************
*/
_Bool RTC_Init(void)
{
	
#if(USE_EXT_RCC == 1)
	unsigned char errCount = 0;
#endif

	RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR | RCC_APB1Periph_BKP, ENABLE); //使能PWR和BKP外设时钟   
	PWR_BackupAccessCmd(ENABLE); //使能后备寄存器访问
	
	BKP_DeInit();	//复位备份区域
#if(USE_EXT_RCC == 1)
	RCC_LSEConfig(RCC_LSE_ON);	//设置外部低速晶振(LSE),使用外设低速晶振
	while(RCC_GetFlagStatus(RCC_FLAG_LSERDY) == RESET && errCount < 250)	//检查指定的RCC标志位设置与否,等待低速晶振就绪
	{
		errCount++;
		DelayMs(10);
	}
	if(errCount >= 250)
		return 1; //初始化时钟失败,晶振有问题
#endif
	
#if(USE_EXT_RCC == 1)
	RCC_RTCCLKConfig(RCC_RTCCLKSource_LSE); 		//设置RTC时钟(RTCCLK),选择LSE作为RTC时钟
#else
	RCC_RTCCLKConfig(RCC_RTCCLKSource_HSE_Div128);	//设置RTC时钟(HSE/128),选择HES作为RTC时钟
#endif
	RCC_RTCCLKCmd(ENABLE); //使能RTC时钟
	RTC_WaitForLastTask(); //等待最近一次对RTC寄存器的写操作完成
	RTC_WaitForSynchro(); //等待RTC寄存器同步
	
	RTC_ITConfig(RTC_IT_ALR, ENABLE); //使能RTC闹钟中断
	RTC_WaitForLastTask(); //等待最近一次对RTC寄存器的写操作完成
	
	RTC_EnterConfigMode(); //允许配置
#if(USE_EXT_RCC == 1)
	RTC_SetPrescaler(32767); //设置RTC预分频的值
#else
	RTC_SetPrescaler(HSE_VALUE / 128 - 1); //设置RTC预分频的值
#endif
	RTC_WaitForLastTask(); //等待最近一次对RTC寄存器的写操作完成
	
	RTC_SetCounter(0); //设置RTC计数器的值
	RTC_WaitForLastTask(); //等待最近一次对RTC寄存器的写操作完成
	
	RTC_ExitConfigMode(); //退出配置模式
	
	RTC_NVIC_Init();
	
	return 0;

}
Beispiel #11
0
/**
  * @brief  Configures the RTC.
  * @param  None
  * @retval None
  */
void RTC_Configuration(void) {
  NVIC_InitTypeDef NVIC_InitStructure;
  
  /* Configure one bit for preemption priority */
  NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);

  /* Enable the RTC Interrupt */
  NVIC_InitStructure.NVIC_IRQChannel = RTC_IRQn;
  NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;
  NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
  NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
  NVIC_Init(&NVIC_InitStructure);
  
  /* Enable PWR and BKP clocks */
  RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR | RCC_APB1Periph_BKP, ENABLE);

  /* Allow access to BKP Domain */
  PWR_BackupAccessCmd(ENABLE);

  /* Reset Backup Domain */
  BKP_DeInit();

  /* Enable LSE */
  RCC_LSEConfig(RCC_LSE_ON);
  /* Wait till LSE is ready */
  while (RCC_GetFlagStatus(RCC_FLAG_LSERDY) == RESET);

  /* Select LSE as RTC Clock Source */
  RCC_RTCCLKConfig(RCC_RTCCLKSource_LSE);

  /* Enable RTC Clock */
  RCC_RTCCLKCmd(ENABLE);

  /* Wait for RTC registers synchronization */
  RTC_WaitForSynchro();

  /* Wait until last write operation on RTC registers has finished */
  RTC_WaitForLastTask();

  /* Enable the RTC Second */
  RTC_ITConfig(RTC_IT_SEC, ENABLE);

  /* Wait until last write operation on RTC registers has finished */
  RTC_WaitForLastTask();

  /* Set RTC prescaler: set RTC period to 1sec */
  RTC_SetPrescaler(32767); /* RTC period = RTCCLK/RTC_PR = (32.768 KHz)/(32767+1) */

  /* Wait until last write operation on RTC registers has finished */
  RTC_WaitForLastTask();
}
Beispiel #12
0
/*
 * 函数名:RTC_Configuration
 * 描述  :配置RTC
 * 输入  :无
 * 输出  :无
 * 调用  :外部调用
 */
void RTC_Configuration(void)
{
	/* Enable PWR(电源控制) and BKP clocks */
	RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR | RCC_APB1Periph_BKP, ENABLE);
	
	/* Allow access to BKP Domain 
	 * 允许进入后备区域进行写操作,因为后备寄存器中放的是重要的数据,默认是不允许往里面写入值的 */
	PWR_BackupAccessCmd(ENABLE);
	
	/* Reset Backup Domain 
	 *将后背寄存器的寄存器值设为默认值 */
	BKP_DeInit();
	
	/* Enable LSE 
	 *打开外部低速晶振,RTC可以选择的时钟源是外部和内部低速晶振及外部高速晶振,这里我们选择外部低速晶振32768HZ */
	RCC_LSEConfig(RCC_LSE_ON);
	/* Wait till LSE is ready 
	 *等待外部低速晶振准备就序 */
	while (RCC_GetFlagStatus(RCC_FLAG_LSERDY) == RESET)
	{}
	
	/* Select LSE as RTC Clock Source 
	 * 选择外部低速晶振为RTC的时钟源 */
	RCC_RTCCLKConfig(RCC_RTCCLKSource_LSE);
	
	/* Enable RTC Clock */
	RCC_RTCCLKCmd(ENABLE);
	
	/* Wait for RTC registers synchronization
	 * 等待RTC寄存器与RTC的APB时钟同步 */
	RTC_WaitForSynchro();
	
	/* Wait until last write operation on RTC registers has finished
	 * 等待上次对RTC寄存器配置完成 */
	RTC_WaitForLastTask();
	
	/* Enable the RTC Second
	 * 使能RTC中断_秒中断 */
	RTC_ITConfig(RTC_IT_SEC, ENABLE);
	
	/* Wait until last write operation on RTC registers has finished */
	RTC_WaitForLastTask();
	
	/* Set RTC prescaler: set RTC period to 1sec
	 * 设置RTC的预分频值,因为外部低速晶振是32768,所以选择RTC计数器计数频率
	 * = RTCCLK/RTC_PR =(32.768 KHz)/(32767+1) */
	RTC_SetPrescaler(32767); /* RTC period = RTCCLK/RTC_PR = (32.768 KHz)/(32767+1) */
	
	/* Wait until last write operation on RTC registers has finished */
	RTC_WaitForLastTask();
}
/*******************************************************************************
* Function Name  : RTC_Configuration
* Description    : Configures the RTC.
* Input          : None
* Output         : None
* Return         : 0 reday,-1 error.
*******************************************************************************/
int RTC_Configuration(void)
{
    u32 count=0x200000;

    /* Enable PWR and BKP clocks */
    RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR | RCC_APB1Periph_BKP, ENABLE);

    /* Allow access to BKP Domain */
    PWR_BackupAccessCmd(ENABLE);

    /* Reset Backup Domain */
    BKP_DeInit();

    /* Enable LSE */
    RCC_LSEConfig(RCC_LSE_ON);
    /* Wait till LSE is ready */
    while ( (RCC_GetFlagStatus(RCC_FLAG_LSERDY) == RESET) && (--count) );
    if ( count == 0 )
    {
		rt_kprintf("RTC no init!");
        return -1;
    }

    /* Select LSE as RTC Clock Source */
    RCC_RTCCLKConfig(RCC_RTCCLKSource_LSE);

    /* Enable RTC Clock */
    RCC_RTCCLKCmd(ENABLE);

    /* Wait for RTC registers synchronization */
    RTC_WaitForSynchro();

    /* Wait until last write operation on RTC registers has finished */
    RTC_WaitForLastTask();
	
	/* Enable the RTC Second */
	/* 使能RTC的秒中断 */	
	//RTC_ITConfig(RTC_IT_SEC, ENABLE);

	/* Wait until last write operation on RTC registers has finished */
	/* 等待上一次对RTC寄存器的写操作完成 */	
	//RTC_WaitForLastTask();

    /* Set RTC prescaler: set RTC period to 1sec */
    RTC_SetPrescaler(32767); /* RTC period = RTCCLK/RTC_PR = (32.768 KHz)/(32767+1) */

    /* Wait until last write operation on RTC registers has finished */
    RTC_WaitForLastTask();

    return 0;
}
Beispiel #14
0
void RTC_STOP_WakeUp(void)
{
    /* Enable PWR and BKP clocks */
    /* PWR时钟(电源控制)与BKP时钟(RTC后备寄存器)使能 */
    RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR | RCC_APB1Periph_BKP, ENABLE);

    /* Allow access to BKP Domain */
    PWR_BackupAccessCmd(ENABLE);

    /* RTC clock source configuration ----------------------------------------*/
    /* Reset Backup Domain */
    BKP_DeInit();

    /* Enable 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);

    /* Enable the RTC Clock */
    RCC_RTCCLKCmd(ENABLE);

    /* RTC configuration -----------------------------------------------------*/
    /* Wait for RTC APB registers synchronisation */
    RTC_WaitForSynchro();

    /* Set the RTC time base to 1s */
    RTC_SetPrescaler(32767);
    /* Wait until last write operation on RTC registers has finished */
    RTC_WaitForLastTask();

    /* Enable the RTC Alarm interrupt */
    RTC_ITConfig(RTC_IT_ALR, ENABLE);
    /* Wait until last write operation on RTC registers has finished */
    RTC_WaitForLastTask();

    RTC_ClearFlag(RTC_FLAG_SEC);
    while(RTC_GetFlagStatus(RTC_FLAG_SEC) == RESET);

    /* Alarm in 5 second */
    RTC_SetAlarm(RTC_GetCounter()+ 5);
    /* Wait until last write operation on RTC registers has finished */
    RTC_WaitForLastTask();
}
Beispiel #15
0
void RTC_Configuration(void)
{
	RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR | RCC_APB1Periph_BKP, ENABLE);
	PWR_BackupAccessCmd(ENABLE);
	BKP_DeInit();
	RCC_LSEConfig(RCC_LSE_ON);
	while(RCC_GetFlagStatus(RCC_FLAG_LSERDY) == RESET);
	RCC_RTCCLKConfig(RCC_RTCCLKSource_LSE);
	RCC_RTCCLKCmd(ENABLE);
	RTC_WaitForSynchro();
	RTC_WaitForLastTask();
	RTC_ITConfig(RTC_IT_SEC, ENABLE);
	RTC_WaitForLastTask();
	RTC_SetPrescaler(32767); 
	RTC_WaitForLastTask();	
}
/**
  * @brief  Configures RTC clock source and prescaler.
  * @param  None
  * @retval None
  */
void RTC_Configuration(void)
{
  /* Check if the StandBy flag is set */
  if(PWR_GetFlagStatus(PWR_FLAG_SB) != RESET)
  {/* System resumed from STANDBY mode */

    /* Turn on LD4 */
    STM32vldiscovery_LEDOn(LED4);

    /* Clear StandBy flag */
    PWR_ClearFlag(PWR_FLAG_SB);

    /* Wait for RTC APB registers synchronisation */
    RTC_WaitForSynchro();
    /* No need to configure the RTC as the RTC configuration(clock source, enable,
       prescaler,...) is kept after wake-up from STANDBY */
  }
  else
  {/* StandBy flag is not set */

    /* RTC clock source configuration ----------------------------------------*/
    /* Reset Backup Domain */
    BKP_DeInit();
  
    /* Enable 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);

    /* Enable the RTC Clock */
    RCC_RTCCLKCmd(ENABLE);

    /* RTC configuration -----------------------------------------------------*/
    /* Wait for RTC APB registers synchronisation */
    RTC_WaitForSynchro();

    /* Set the RTC time base to 1s */
    RTC_SetPrescaler(32767);  
    /* Wait until last write operation on RTC registers has finished */
    RTC_WaitForLastTask();
  }
}
Beispiel #17
0
uint08 RTC_Init(void)
{
    //检查是不是第一次配置时钟
    uint08 temp=0;

    if ( BKP_ReadBackupRegister(BKP_DR1) != 0x5050 )      //从指定的后备寄存器中读出数据:读出了与写入的指定数据不相乎
    {
        RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR | RCC_APB1Periph_BKP, ENABLE);    //使能PWR和BKP外设时钟   
        PWR_BackupAccessCmd(ENABLE);    //使能后备寄存器访问 
        BKP_DeInit();   //复位备份区域 	
        RCC_LSEConfig(RCC_LSE_ON);  //设置外部低速晶振(LSE),使用外设低速晶振
        while ( RCC_GetFlagStatus(RCC_FLAG_LSERDY) == RESET && temp< 252) //检查指定的RCC标志位设置与否,等待低速晶振就绪
        {
            temp++;
            //delay_ms(10);
            //OSTimeDlyHMSM(0, 0, 0, 10); 
        }
        if ( temp>=250 )
        {
          return 1;//初始化时钟失败,晶振有问题	 
        }
        RCC_RTCCLKConfig(RCC_RTCCLKSource_LSE);     //设置RTC时钟(RTCCLK),选择LSE作为RTC时钟    
        RCC_RTCCLKCmd(ENABLE);  //使能RTC时钟  
        RTC_WaitForLastTask();  //等待最近一次对RTC寄存器的写操作完成
        RTC_WaitForSynchro();       //等待RTC寄存器同步  
        RTC_ITConfig(RTC_IT_SEC, ENABLE);       //使能RTC秒中断
        RTC_WaitForLastTask();  //等待最近一次对RTC寄存器的写操作完成
        RTC_EnterConfigMode();/// 允许配置	
        RTC_SetPrescaler(32767); //设置RTC预分频的值
        RTC_WaitForLastTask();  //等待最近一次对RTC寄存器的写操作完成
        RTC_Set(2009,12,2,10,0,55);  //设置时间	
        RTC_ExitConfigMode(); //退出配置模式  
        BKP_WriteBackupRegister(BKP_DR1, 0X5050);   //向指定的后备寄存器中写入用户程序数据
    }
    else//系统继续计时
    {

        RTC_WaitForSynchro();   //等待最近一次对RTC寄存器的写操作完成
        RTC_ITConfig(RTC_IT_SEC, ENABLE);   //使能RTC秒中断
        RTC_WaitForLastTask();  //等待最近一次对RTC寄存器的写操作完成
    }
    RTC_NVIC_Config();//RCT中断分组设置		    				     
    RTC_Get();//更新时间	
    return 0; //ok

}                           
Beispiel #18
0
static void RTC_Configuration(void)
{
	  SystemInit();
	  /* Enable PWR and BKP clocks */
	    RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR | RCC_APB1Periph_BKP, ENABLE);

	    /* Allow access to BKP Domain */
	    PWR_BackupAccessCmd(ENABLE);

	    /* Reset Backup Domain */
	    BKP_DeInit();

	    /* Enable LSE */
	    RCC_LSEConfig(RCC_LSE_ON);
	    /* Wait till LSE is ready */
	    while (RCC_GetFlagStatus(RCC_FLAG_LSERDY) == RESET)
	    {}
}
Beispiel #19
0
void RTCInit(void) {
	NVIC_InitTypeDef NVIC_InitStructure;
	
	RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR | RCC_APB1Periph_BKP, ENABLE);  

	// Allow access to BKP Domain
	PWR_BackupAccessCmd(ENABLE);

	// Reset Backup Domain
	BKP_DeInit();

	// Enable the LSE OSC
//	RCC_LSEConfig(RCC_LSE_ON);

	// Disable the LSI OSC
	RCC_LSICmd(ENABLE);

	// Select the RTC Clock Source
	RCC_RTCCLKConfig(RCC_RTCCLKSource_LSI); //RCC_RTCCLKSource_LSE);

	// Enable the RTC Clock
	RCC_RTCCLKCmd(ENABLE);

	// Wait for RTC registers synchronization
	RTC_WaitForSynchro();

	// Wait until last write operation on RTC registers has finished
	RTC_WaitForLastTask();

	// Enable the RTC overflow interrupt
	RTC_ITConfig(RTC_IT_SEC, ENABLE);

	//Set 32768 prescaler - for one second interupt
	RTC_SetPrescaler(0x7FFF);

	NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);

	NVIC_InitStructure.NVIC_IRQChannel = RTC_IRQn;
	NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;
	NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
	NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
	NVIC_Init(&NVIC_InitStructure);

}
Beispiel #20
0
u8 RTC_Init(void)
	{
	//检查是不是第一次配置时钟
	u8 temp=0;
	RTC_NVIC_Config();
	//if(BKP->DR1!=0X5050)//第一次配置
	if (BKP_ReadBackupRegister(BKP_DR1) != 0x5050)		//从指定的后备寄存器中读出数据:读出了与写入的指定数据不相乎
		{	 			
		RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR | RCC_APB1Periph_BKP, ENABLE);	//使能PWR和BKP外设时钟   
		PWR_BackupAccessCmd(ENABLE);	//使能RTC和后备寄存器访问 
		BKP_DeInit();	//将外设BKP的全部寄存器重设为缺省值 	
		RCC_LSEConfig(RCC_LSE_ON);	//设置外部低速晶振(LSE),使用外设低速晶振
		while (RCC_GetFlagStatus(RCC_FLAG_LSERDY) == RESET)	//检查指定的RCC标志位设置与否,等待低速晶振就绪
			{
			temp++;
			delay_ms(10);
			}
		if(temp>=250)return 1;//初始化时钟失败,晶振有问题	    
		RCC_RTCCLKConfig(RCC_RTCCLKSource_LSE);		//设置RTC时钟(RTCCLK),选择LSE作为RTC时钟    
		RCC_RTCCLKCmd(ENABLE);	//使能RTC时钟  
		RTC_WaitForSynchro();		//等待最近一次对RTC寄存器的写操作完成
		RTC_WaitForLastTask();	//等待最近一次对RTC寄存器的写操作完成
		RTC_ITConfig(RTC_IT_SEC, ENABLE);		//使能RTC秒中断
		RTC_WaitForLastTask();	//等待最近一次对RTC寄存器的写操作完成
		RTC_SetPrescaler(32767); //设置RTC预分频的值
		RTC_WaitForLastTask();	//等待最近一次对RTC寄存器的写操作完成
		RTC_Set(2009,12,2,10,0,55);  //设置时间	  
		BKP_WriteBackupRegister(BKP_DR1, 0X5050);	//向指定的后备寄存器中写入用户程序数据
		}
	else//系统继续计时
		{

		RTC_WaitForSynchro();	//等待最近一次对RTC寄存器的写操作完成
		RTC_ITConfig(RTC_IT_SEC, ENABLE);	//使能RTC秒中断
		RTC_WaitForLastTask();	//等待最近一次对RTC寄存器的写操作完成
		}		    				     
	RTC_Get();//更新时间	
	RCC_ClearFlag();	//清除RCC的复位标志位
	return 0; //ok
	}
//extern void flash_write_time_volitage(u8 addr_index,uint16_t volitage,u8 year_H,u8 year_L,u8 month_H,u8 month_L,u8 day_H,u8 day_L,u8 hh_H,u8 hh_L,u8 mm_H,u8 mm_L,u8 ss_H,u8 ss_L ) ;
void operating_12864_system (void)    //按键操作和界面切换
{ 
	 u16 u16_WaitForOscSource,startv=0;
    
	if(rcc_flag==0)
	{
		if(k1==key_ok)
		{
			k1=key_none;
			rcc_flag=1;
			DebugMenu(1);
		}
		if(k1==key_cancel)
		{
			k1=key_none;
			flag_i=1;
			voltage=0;
      Alarm_flag_1=0;
      BUZZER_off;
      Fault_led_off;
      Relay_off;
// 			buzzer_tick_flag=1;
		}
	}
	if(rcc_flag==1)
	{
// 		Delay_ms(1000);
	// 		flag_system=1;
		if(flag_debug==0)
		{
			flag_debug=1;
		}
			switch (k1)
			{
				case key_down:
							k1=key_none;
						 flag_debug++; 
						 if(flag_debug>4)
							{
								flag_debug=1;
							}	
							DebugMenu(flag_debug);
             //	Delay_ms(20);
              						
				break;		
				case key_up:
						 k1=key_none;
						 flag_debug--;
						 if(flag_debug==0)
							{
								flag_debug=4;
							}
							DebugMenu(flag_debug);
           //   Delay_ms(20);
              							
				break;
				case key_cancel:
						 rcc_flag=0;
							flag_debug=1;
				   //  Delay_ms(20);
				     k1=key_none;
							//DebugMenu(flag_debug);
				break;
				case key_ok:
							k1=key_none;
							
							if(flag_debug==1)
							{
								rcc_flag=21;
								flag_debug=1;
								SecondSet(flag_debug);
							}
							if(flag_debug==2)
							{
								rcc_flag=22;
								flag_debug=1;
								SecondSystemDebug(flag_debug);
							}
							if(flag_debug==3)
							{
								rcc_flag=23;
                fault_num=flash_num<0?0:flash_num;
//                 if(flash_num<0)
//                 {
//                   fault_num=0;
//                 }
//                 else{
//                   fault_num=flash_num;
//                 }
								flash_read_time_volitage(start_addr+fault_num*14);
								Second_Fault_record(frecord.voltage,fault_num+1,frecord.year_H,frecord.year_L,frecord.month_H,frecord.month_L,frecord.day_H,frecord.day_L,frecord.hh_H,frecord.hh_L,frecord.mm_H,frecord.mm_L,frecord.ss_H,frecord.ss_L);
//                 flash_read_time_volitage(start_addr+14*fault_num);
//                 Second_Fault_record(frecord.voltage,fault_num+1,frecord.year_H,frecord.year_L,frecord.month_H,frecord.month_L,frecord.day_H,frecord.day_L,frecord.hh_H,frecord.hh_L,frecord.mm_H,frecord.mm_L,frecord.ss_H,frecord.ss_L);
                
							}
							if(flag_debug==4)
							{
								rcc_flag=24;
								Second_clear_fault_records();
							}
				break;
			}
		}
		if(rcc_flag==21)
		{
			//flag_debug=1;
				switch (k1)
			{
				case key_down:
							k1=key_none;
						 flag_debug++; 
						 if(flag_debug>2)
							{
								flag_debug=1;
							}	
							SecondSet(flag_debug);
             //	Delay_ms(20);
              						
				break;		
				case key_up:
						 k1=key_none;
						 flag_debug--;
						 if(flag_debug==0)
							{
								flag_debug=2;
							}
							SecondSet(flag_debug);
           //   Delay_ms(20);
              							
				break;
				case key_cancel:
						flag_debug=0;
						 rcc_flag=1;
						DebugMenu(1);
				   //  Delay_ms(20);
				     k1=key_none;
							//DebugMenu(flag_debug);
				break;
				case key_ok:
							k1=key_none;
							
					if(flag_debug==1)
					{
							rcc_flag=31;
							ThirdSystemSetting(1);
					}
					if(flag_debug==2)
					{
             flag_debug=1;
							rcc_flag=32;
							ThirdBaudRateSetting(flag_debug,Device_Add,Band_Rate,Data_bits,Stop_bits);
					}
							
				break;
			}	
		}
		if(rcc_flag==22)
		{
			//flag_debug=1;
				switch (k1)
			{
				case key_down:
							k1=key_none;
						 flag_debug++; 
						 if(flag_debug>4)
							{
								flag_debug=1;
							}	
							SecondSystemDebug(flag_debug);
             //	Delay_ms(20);
              						
				break;		
				case key_up:
						 k1=key_none;
						 flag_debug--;
						 if(flag_debug==0)
							{
								flag_debug=4;
							}
							SecondSystemDebug(flag_debug);
           //   Delay_ms(20);
              							
				break;
				case key_cancel:
						flag_debug=1;
						 rcc_flag=1;
				   //  Delay_ms(20);
				     k1=key_none;
				     DebugMenu(1);
							//DebugMenu(flag_debug);
				break;
				case key_ok:
							k1=key_none;
						if(flag_debug==1)
						{
							flag_debug=1;
							rcc_flag=33;
							ThirdChange();
						}
						if(flag_debug==2)
						{
							flag_debug=1;
							rcc_flag=34;
							ThirdCorrect();
						}
						if(flag_debug==3)
						{
							flag_debug=1;
							rcc_flag=35;
							ThirdCheck();
						}
						if(flag_debug==4)
						{
							flag_debug=1;
							rcc_flag=36;
							ThirdReguration(1,1,1,1);
						}
							
				break;
			}	
		}
		if(rcc_flag==23)
		{
			//flag_debug=1;
				switch (k1)
			{
				case key_down: 
            fault_num++;
            if(fault_num>=50)
            {
              fault_num=0;
            }
            flash_read_time_volitage(start_addr+14*fault_num);
						Second_Fault_record(frecord.voltage,fault_num+1,frecord.year_H,frecord.year_L,frecord.month_H,frecord.month_L,frecord.day_H,frecord.day_L,frecord.hh_H,frecord.hh_L,frecord.mm_H,frecord.mm_L,frecord.ss_H,frecord.ss_L);
//                 fault_num=flash_num; 
            
            
            k1=key_none;
				break;		
				case key_up:
            fault_num--;
            if(fault_num<0)
            {
              fault_num=49;
            }
					 flash_read_time_volitage(start_addr+14*fault_num);
					 Second_Fault_record(frecord.voltage,fault_num+1,frecord.year_H,frecord.year_L,frecord.month_H,frecord.month_L,frecord.day_H,frecord.day_L,frecord.hh_H,frecord.hh_L,frecord.mm_H,frecord.mm_L,frecord.ss_H,frecord.ss_L);
//                 fault_num=flash_num; 
            
            
            k1=key_none;    							
				break;
				case key_cancel:
						 rcc_flag=1;
				   //  Delay_ms(20);
							flag_debug=1;
				     k1=key_none;
						DebugMenu(1);
							//DebugMenu(flag_debug);
				break;
				case key_ok:
							k1=key_none;
						//	rcc_flag=2;
							
							
				break;
			}	
		}
		if(rcc_flag==24)
		{
			//flag_debug=1;
				switch (k1)
			{
				
				case key_cancel:
						 rcc_flag=1;
							flag_debug=1;
				   //  Delay_ms(20);
				     k1=key_none;
						DebugMenu(1);
							//DebugMenu(flag_debug);
				break;
				case key_ok:
							k1=key_none;
//               fi++;
							rcc_flag=2;
                //flash_cache[300]=0;
//  							for(fi=0;fi<255;fi++)
//               {
//                 flash_cache[fi]=0;
//               }

//               Delay_ms(100);
//               flash_write_time_volitage(0,0,0,0,0,0,0,0,0,0,0,0,0,0 ) ;
//               Delay_ms(500);
//               flash_write(0xffff,flash_num_addr);
							
				break;
			}	
		}
		if(rcc_flag==31)
		{
			//flag_debug=1;
				switch (k1)
			{
				case key_down:
						 k1=key_none;
						 flag_debug++; 
						 if(flag_debug>2)
							{
								flag_debug=1;
							}	
							ThirdSystemSetting(flag_debug);
             //	Delay_ms(20);
              						
				break;		
				case key_up:
						 k1=key_none;
						 flag_debug--;
						 if(flag_debug==0)
							{
								flag_debug=2;
							}
							ThirdSystemSetting(flag_debug);
           //   Delay_ms(20);
              							
				break;
				case key_cancel:
						 	flag_debug=1;
						 rcc_flag=21;
						 SecondSet(1);
				   //  Delay_ms(20);
				     k1=key_none;

				timer.sec=ss_H*10+ss_L;
				timer.min=mm_H*10+mm_L;
				timer.hour=hh_H*10+hh_L;
				timer.w_date=day_H*10+day_L;
				timer.w_month=month_H*10+month_L;
				timer.w_year=(year_H*10+year_L)+2000;
				
				RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR | RCC_APB1Periph_BKP, ENABLE);
 
      /* Allow access to BKP Domain */
      PWR_BackupAccessCmd(ENABLE);
 
      /* Reset Backup Domain */
       BKP_DeInit();
 
      /* Enable LSE */
      RCC_LSEConfig(RCC_LSE_ON);
       for(u16_WaitForOscSource=0;u16_WaitForOscSource<5000;u16_WaitForOscSource++)
           {
           }
      /* Wait till LSE is ready */
      while (RCC_GetFlagStatus(RCC_FLAG_LSERDY) == RESET);
 
      /* Select LSE as RTC Clock Source */
      RCC_RTCCLKConfig(RCC_RTCCLKSource_LSE);
 
      /* Enable RTC Clock */
      RCC_RTCCLKCmd(ENABLE);
 
      /* Wait for RTC registers synchronization */
      RTC_WaitForSynchro();
 
      /* Wait until last write operation on RTC registers has finished */
      RTC_WaitForLastTask();
 
      /* Enable the RTC Second */
      RTC_ITConfig(RTC_IT_SEC, ENABLE);
 
      /* Wait until last write operation on RTC registers has finished */
       RTC_WaitForLastTask();
 
      /* Set RTC prescaler: set RTC period to 1sec */
      RTC_SetPrescaler(32767); /* RTC period = RTCCLK/RTC_PR = (32.768 KHz)/(32767+1) */
 
      /* Wait until last write operation on RTC registers has finished */
      RTC_WaitForLastTask();
        BKP_WriteBackupRegister(BKP_DR1, 0x5A5A);
        RTC_Set(timer.w_year,timer.w_month,timer.w_date,timer.hour,timer.min,timer.sec);
				break;
				case key_ok:
							k1=key_none;
							
					if(flag_debug==1)
					{
						  flag_debug=1;
							rcc_flag=41;
							FourStart(start_v);
					}
					if(flag_debug==2)
					{
						  flag_debug=1;
							rcc_flag=42;
							FourTime(year_H, year_L, month_H, month_L, day_H, day_L, hh_H, hh_L, mm_H, mm_L, ss_H, ss_L);	
					}
							
				break;
			}	
		}
		if(rcc_flag==32)
		{
			//flag_debug=1;
				switch (k1)
			{
				case key_down:
						 k1=key_none;
						 flag_debug++; 
						 if(flag_debug>4)
							{
								flag_debug=1;
							}	
							ThirdBaudRateSetting(flag_debug,Device_Add,Band_Rate,Data_bits,Stop_bits);
             //	Delay_ms(20);
              						
				break;		
				case key_up:
						 k1=key_none;
						 flag_debug--;
						 if(flag_debug==0)
							{
								flag_debug=4;
							}
							ThirdBaudRateSetting(flag_debug,Device_Add,Band_Rate,Data_bits,Stop_bits);
           //   Delay_ms(20);
              							
				break;
				case key_cancel:
						 flag_debug=1;
						 rcc_flag=21;
						 SecondSet(1);
				   //  Delay_ms(20);
				     k1=key_none;
							//DebugMenu(flag_debug);
				break;
				case key_ok:
						 k1=key_none;	
					if(flag_debug==1)
					{
// 						  flag_debug=1;
							rcc_flag=43;	
					} 
          else if(flag_debug==2)
					{
// 						  flag_debug=1;
							rcc_flag=44;
					}
           else if(flag_debug==3)
					{
// 						  flag_debug=1;
							rcc_flag=45;
					}
          else if(flag_debug==4)
					{
// 						  flag_debug=1;
							rcc_flag=46;
					}
							
				break;
			}	
		}
		if(rcc_flag==33)
		{
			//flag_debug=1;
				switch (k1)
			{
				
				case key_cancel:
						 	flag_debug=1;
						 rcc_flag=22;
						 SecondSystemDebug(1);
				   //  Delay_ms(20);
				     k1=key_none;
							//DebugMenu(flag_debug);
				break;
				case key_ok:
							
							
				break;
			}	
		}
		if(rcc_flag==34)
		{
			//flag_debug=1;
				switch (k1)
			{
				case key_down:
						
              						
				break;		
				case key_up:
						
           //   Delay_ms(20);
              							
				break;
				case key_cancel:
						 	flag_debug=1;
						 rcc_flag=22;
						 SecondSystemDebug(1);
				   //  Delay_ms(20);
				     k1=key_none;
							//DebugMenu(flag_debug);
				break;
				case key_ok:
							
							
				break;
			}	
		}
		if(rcc_flag==35)
		{
			//flag_debug=1;
				switch (k1)
			{
				case key_down:
						
              						
				break;		
				case key_up:
						
           //   Delay_ms(20);
              							
				break;
				case key_cancel:
						 	flag_debug=1;
						 rcc_flag=22;
						 SecondSystemDebug(1);
				   //  Delay_ms(20);
				     k1=key_none;
							//DebugMenu(flag_debug);
				break;
				case key_ok:
							
							
				break;
			}	
		}
		if(rcc_flag==36)
		{
			//flag_debug=1;
				switch (k1)
			{
				case key_down:
						 k1=key_none;
						 flag_debug++; 
						 if(flag_debug>3)
							{
								flag_debug=1;
							}	
							ThirdReguration(flag_debug,flag_Led,flag_Relay,flag_Buzzer);							
				break;		
				case key_up:
						 k1=key_none;
						 flag_debug--;
						 if(flag_debug==0)
							{
								flag_debug=3;
							}
							ThirdReguration(flag_debug,flag_Led,flag_Relay,flag_Buzzer);								
				break;
				case key_cancel:
						 	flag_debug=1;
						 rcc_flag=22;
						 SecondSystemDebug(1);
				   //  Delay_ms(20);
				     k1=key_none;
							//DebugMenu(flag_debug);
				break;
				case key_ok:
					   k1=key_none;	
						 if(flag_debug==1)              
					  {					  
							++flag_Led;
							if(flag_Led<1)
							{
								flag_Led=2;
              }
							else if(flag_Led>2)
							{
								flag_Led=1;
              }
						ThirdReguration(1,flag_Led,flag_Relay,flag_Buzzer);	
					  }
						if(flag_debug==2)
						{
								++flag_Relay;
							if(flag_Relay<1)
							{
								flag_Relay=2;
              }
							else if(flag_Relay>2)
							{
								flag_Relay=1;
              }
						ThirdReguration(2,flag_Led,flag_Relay,flag_Buzzer);
						}
						if(flag_debug==3)
						{
								++flag_Buzzer;
							if(flag_Buzzer<1)
							{
								flag_Buzzer=2;
              }
							else if(flag_Buzzer>2)
							{
								flag_Buzzer=1;
              }
						ThirdReguration(3,flag_Led,flag_Relay,flag_Buzzer);
						}							
				break;
			}	
		}
    if(rcc_flag==41)
		{
			//flag_debug=1;
				switch (k1)
			{
				case key_down:
							 
              if(start_v<=0)
							{
								start_v=0;
							}
				      start_v-=5;
							 FourStart(start_v);
             //	Delay_ms(20);
				      k1=key_none;
              						
				break;		
				case key_up:
							start_v+=5;
							 FourStart(start_v);
           //   Delay_ms(20);
				     k1=key_none;
              							
				break;
				case key_cancel:
              startv=start_v;
						 flag_debug=1;
						 rcc_flag=31;
						 ThirdSystemSetting(1);
				     k1=key_none;
            // flash_write_start_v(start_v);
            flash_write(startv,start_v_addr);
				break;
				case key_ok:
							
							
				break;
			}	
		}
		if(rcc_flag==42)
		{
			//flag_debug=1;
				switch (k1)
			{
				case key_down:
              						
				break;		
				case key_up:
						
              							
				break;
				case key_cancel:
						 	flag_debug=1;
						 rcc_flag=31;
						 ThirdSystemSetting(1);
				   //  Delay_ms(20);
				     k1=key_none;
							//DebugMenu(flag_debug);
				break;
				case key_ok:
					   ++flagTime;
				     if(flagTime > 12)
				     {
				      flagTime = 1;
				     }
              k1=key_none;						 
				break;
			}	
		}
		/*设置时间*/
		       if(flagTime==1)
					 {
						 switch (k1)
			      {
				     case key_down:
              	  --ss_L;
					    	if(ss_L<0)
					        {
					        	ss_L = 9;
					    	  }	
                  FourTime(year_H, year_L, month_H, month_L, day_H, day_L, hh_H, hh_L, mm_H, mm_L, ss_H, ss_L);	
                  k1=key_none;									
				     break;		
				     case key_up:
						      ++ss_L;
					    	if(ss_L>9)
					        {
					        	ss_L = 0;
					    	  }
                  FourTime(year_H, year_L, month_H, month_L, day_H, day_L, hh_H, hh_L, mm_H, mm_L, ss_H, ss_L);
                  k1=key_none;									
				     break;
            }
					}
					 else if(flagTime==2)
					 {
            	switch (k1)
			      {
				     case key_down:
                  --ss_H;
					    	if(ss_H<0)
					        {
					        	ss_H = 6;
					    	  }	
                  FourTime(year_H, year_L, month_H, month_L, day_H, day_L, hh_H, hh_L, mm_H, mm_L, ss_H, ss_L);	
                  k1=key_none;										
				     break;		
				     case key_up:
						      ++ss_H;
					    	if(ss_H>6)
					        {
					        	ss_H = 0;
					    	  }
									FourTime(year_H, year_L, month_H, month_L, day_H, day_L, hh_H, hh_L, mm_H, mm_L, ss_H, ss_L);
              		 k1=key_none;				
				     break;
            }
           }
					 else if(flagTime==3)
					 {
            	switch (k1)
			      {
				     case key_down:
							    --mm_L;
					    	  if(mm_L<0)
					        {
					        	mm_L = 9;
					    	  }
									FourTime(year_H, year_L, month_H, month_L, day_H, day_L, hh_H, hh_L, mm_H, mm_L, ss_H, ss_L);
              		k1=key_none;					
				     break;		
				     case key_up:
						      ++mm_L;
					    	  if(mm_L>9)
					        {
					        	mm_L = 0;
					    	  }
									FourTime(year_H, year_L, month_H, month_L, day_H, day_L, hh_H, hh_L, mm_H, mm_L, ss_H, ss_L);
              	  k1=key_none;							
				     break;
            }
           }
					 else if(flagTime==4)
					 {
            	switch (k1)
			      {
				     case key_down:
							    --mm_H;
					    	  if(mm_H<0)
					        {
					        	mm_H = 6;
					    	  }
									FourTime(year_H, year_L, month_H, month_L, day_H, day_L, hh_H, hh_L, mm_H, mm_L, ss_H, ss_L);
              		k1=key_none;					
				     break;		
				     case key_up:
						      ++mm_H;
					    	  if(mm_H>6)
					        {
					        	mm_H = 0;
					    	  }
									FourTime(year_H, year_L, month_H, month_L, day_H, day_L, hh_H, hh_L, mm_H, mm_L, ss_H, ss_L);
              	  k1=key_none;				
				     break;
            }
           }
				   else if(flagTime==5)
					 {
            	switch (k1)
			      {
				     case key_down:
							    --hh_L;
					    	  if(hh_L<0)
					         {
					        	 hh_L = 9;
					    	   }
              		FourTime(year_H, year_L, month_H, month_L, day_H, day_L, hh_H, hh_L, mm_H, mm_L, ss_H, ss_L);
              	  k1=key_none;			
				     break;		
				     case key_up:
						      ++hh_L;
					    	  if(hh_L>9)
					         {
					        	 hh_L = 0;
					    	   }
              		FourTime(year_H, year_L, month_H, month_L, day_H, day_L, hh_H, hh_L, mm_H, mm_L, ss_H, ss_L);
              	  k1=key_none;						
				     break;
            }
           }
					 else if(flagTime==6)
					 {
            	switch (k1)
			      {
				     case key_down:
              		--hh_H;
					    	  if(hh_H<0)
					         {
					        	 hh_H = 2;
					    	   }
              		FourTime(year_H, year_L, month_H, month_L, day_H, day_L, hh_H, hh_L, mm_H, mm_L, ss_H, ss_L);
              	  k1=key_none;			
				     break;		
				     case key_up:
						      ++hh_H;
					    	  if(hh_H>2)
					         {
					        	 hh_H = 0;
					    	   }
              		FourTime(year_H, year_L, month_H, month_L, day_H, day_L, hh_H, hh_L, mm_H, mm_L, ss_H, ss_L);
              	  k1=key_none;
              							
				     break;
            }
           }
					 else if(flagTime==7)
					 {
            	switch (k1)
			      {
				     case key_down:
              			--day_L;
					    	  if(day_L<0)
					         {
					        	 day_L = 9;
					    	   }
              		FourTime(year_H, year_L, month_H, month_L, day_H, day_L, hh_H, hh_L, mm_H, mm_L, ss_H, ss_L);
              	  k1=key_none;			
				     break;		
				     case key_up:
						      ++day_L;
					    	  if(day_L>9)
					         {
					        	 day_L = 0;
					    	   }
              		FourTime(year_H, year_L, month_H, month_L, day_H, day_L, hh_H, hh_L, mm_H, mm_L, ss_H, ss_L);
              	  k1=key_none;
              							
				     break;
            }
           }
					 else if(flagTime==8)
					 {
            	switch (k1)
			      {
				     case key_down:
              		--day_H;
					    	  if(day_H<0)
					         {
					        	 day_H = 3;
					    	   }
              		FourTime(year_H, year_L, month_H, month_L, day_H, day_L, hh_H, hh_L, mm_H, mm_L, ss_H, ss_L);
              	  k1=key_none;			
				     break;		
				     case key_up:
						      ++day_H;
					    	  if(day_H>3)
					         {
					        	 day_H = 0;
					    	   }
              		FourTime(year_H, year_L, month_H, month_L, day_H, day_L, hh_H, hh_L, mm_H, mm_L, ss_H, ss_L);
              	  k1=key_none;
              							
				     break;
            }
           }
					 else if(flagTime==9)
					 {
            	switch (k1)
			      {
				     case key_down:
              		--month_L;
					    	  if(month_L<0)
					         {
					        	 month_L = 9;
					    	   }
              		FourTime(year_H, year_L, month_H, month_L, day_H, day_L, hh_H, hh_L, mm_H, mm_L, ss_H, ss_L);
              	  k1=key_none;				
				     break;		
				     case key_up:
						      ++month_L;
					    	  if(month_L>9)
					         {
					        	 month_L = 0;
					    	   }
              		FourTime(year_H, year_L, month_H, month_L, day_H, day_L, hh_H, hh_L, mm_H, mm_L, ss_H, ss_L);
              	  k1=key_none;					
				     break;
            }
           }
					 else if(flagTime==10)
					 {
            	switch (k1)
			      {
				     case key_down:
              		--month_H;
					    	  if(month_H<0)
					         {
					        	 month_H = 1;
					    	   }
              		FourTime(year_H, year_L, month_H, month_L, day_H, day_L, hh_H, hh_L, mm_H, mm_L, ss_H, ss_L);
              	  k1=key_none;				
				     break;		
				     case key_up:
						      ++month_H;
					    	  if(month_H>1)
					         {
					        	 month_H = 0;
					    	   }
              		FourTime(year_H, year_L, month_H, month_L, day_H, day_L, hh_H, hh_L, mm_H, mm_L, ss_H, ss_L);
              	  k1=key_none;
              							
				     break;
            }
           }
					 
					 else if(flagTime==11)
					 {
            	switch (k1)
			      {
				     case key_down:
							    --year_L;
					    	  if(year_L<0)
					         {
					        	 year_L = 9;
					    	   }
              		FourTime(year_H, year_L, month_H, month_L, day_H, day_L, hh_H, hh_L, mm_H, mm_L, ss_H, ss_L);
              	  k1=key_none;	
              						
				     break;		
				     case key_up:
						       ++year_L;
					    	  if(year_L>9)
					         {
					        	 year_L = 0;
					    	   }
              		FourTime(year_H, year_L, month_H, month_L, day_H, day_L, hh_H, hh_L, mm_H, mm_L, ss_H, ss_L);
              	  k1=key_none;
              							
				     break;
            }
           }
					 else if(flagTime==12)
					 {
            	switch (k1)
			      {
				     case key_down:
              		--year_H;
					    	  if(year_H<0)
					         {
					        	 year_H = 9;
					    	   }
              		FourTime(year_H, year_L, month_H, month_L, day_H, day_L, hh_H, hh_L, mm_H, mm_L, ss_H, ss_L);
              	  k1=key_none;				
				     break;		
				     case key_up:
						       ++year_H;
					    	  if(year_H>9)
					         {
					        	 year_H = 0;
					    	   }
              		FourTime(year_H, year_L, month_H, month_L, day_H, day_L, hh_H, hh_L, mm_H, mm_L, ss_H, ss_L);
              	  k1=key_none;
              							
				     break;
            }
           }
					if(rcc_flag==43)                 //设置装置号
					{
						switch (k1)
			      {
				     case key_down: 
                  --Device_Add;
					    	if(Device_Add<1)
					        {
					        	Device_Add = 255;
					    	  }	
             ThirdBaudRateSetting(1,Device_Add,Band_Rate,Data_bits,Stop_bits);
                  k1=key_none;							
				     break;		
				     case key_up:
						      ++Device_Add;
					    	  if(Device_Add>255)
					         {
					        	Device_Add = 1;
					    	   }	
             ThirdBaudRateSetting(1,Device_Add,Band_Rate,Data_bits,Stop_bits);	
                   k1=key_none;                     
				     break;		 
						case key_cancel:                                //设置装置后返回
									 flag_debug=1;
									 rcc_flag=21;
									 SecondSet(1);
                 //  flash_write_device_b(Device_Add);	
                  flash_write(Device_Add,device_id_addr);
									 k1=key_none;
				    break;
            }
          }
					
					if(rcc_flag==44)                 //设置波特率
					{
						switch (k1)
			      {
				     case key_down: 
						     k1=key_none;
                  --flag_debug;
					    	if(flag_debug<1)
					        {
					        	flag_debug = 4;
					    	  }	
									switch(flag_debug)
									{
										case 1:
											    Band_Rate=4800;
										break;
										case 2:
											    Band_Rate=9600;
										break;
										case 3:
											    Band_Rate=19200;
										break;
										case 4:
											    Band_Rate=115200;
										break;
                  }
             ThirdBaudRateSetting(2,Device_Add,Band_Rate,Data_bits,Stop_bits);									
				     break;		
				     case key_up:
							     k1=key_none;
						      k1=key_none;
                  ++flag_debug;
					    	if(flag_debug>4)
					        {
					        	flag_debug = 0;
					    	  }	
									switch(flag_debug)
									{
										case 1:
											    Band_Rate=4800;
										break;
										case 2:
											    Band_Rate=9600;
										break;
										case 3:
											    Band_Rate=19200;
										break;
										case 4:
											    Band_Rate=115200;
										break;
                  }
             ThirdBaudRateSetting(2,Device_Add,Band_Rate,Data_bits,Stop_bits);								
				     break;		 
						case key_cancel:                                //设置装置后返回
									 flag_debug=1;
									 rcc_flag=21;
									 SecondSet(1);
									 k1=key_none;
                   uart_init(Band_Rate);
                   RS485_Init(Band_Rate);       //波特率设置  485
                  // flash_write_Band_Rate(Band_Rate);
                  flash_write(Band_Rate,Band_Rate_addr);
				    break;
            }
          }
          
          if(rcc_flag==45)                                 //设置数据位
					{
						switch (k1)
			      {
				     case key_down: 
                  --Data_bits;
					    	if(Data_bits<5)
					        {
					        	Data_bits = 8;
					    	  }	
             ThirdBaudRateSetting(3,Device_Add,Band_Rate,Data_bits,Stop_bits);
                  k1=key_none;							
				     break;		
				     case key_up:
						      ++Data_bits;
					    	  if(Data_bits>9)
					         {
					        	Data_bits = 5;
					    	   }	
             ThirdBaudRateSetting(3,Device_Add,Band_Rate,Data_bits,Stop_bits);	
                   k1=key_none;                     
				     break;		 
						case key_cancel:                                //设置停止位
									 flag_debug=1;
									 rcc_flag=21;
									 SecondSet(1);
//                    flash_write_device_b(Device_Add);	
//                  flash_write_databits(Data_bits);
                  flash_write(Data_bits,databits_addr);
									 k1=key_none;
				    break;
            }
          }
          
					if(rcc_flag==46)                                 //设置停止位
					{
						switch (k1)
			      {
				     case key_down: 
                  --Stop_bits;
					    	if(Stop_bits<1)
					        {
					        	Stop_bits = 9;
					    	  }	
             ThirdBaudRateSetting(4,Device_Add,Band_Rate,Data_bits,Stop_bits);
                  k1=key_none;							
				     break;		
				     case key_up:
						      ++Stop_bits;
					    	  if(Stop_bits>10)
					         {
					        	Stop_bits = 1;
					    	   }	
             ThirdBaudRateSetting(4,Device_Add,Band_Rate,Data_bits,Stop_bits);	
                   k1=key_none;                     
				     break;		 
						case key_cancel:                                //设置停止位
									 flag_debug=1;
									 rcc_flag=21;
									 SecondSet(1);
//                   flash_write_stopbits(Stop_bits);
                   flash_write(Stop_bits,stopbits_addr);
									 k1=key_none;
				    break;
            }
          }

}
Beispiel #22
0
/**
  * @brief  Configures the RTC.
  * @param  None
  * @retval None
  */
void RTC_Configuration(void) {
  NVIC_InitTypeDef NVIC_InitStructure;
  EXTI_InitTypeDef EXTI_InitStructure;
  
  /* Configure one bit for preemption priority */
  NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);

  /* Enable the RTC Interrupt */
  NVIC_InitStructure.NVIC_IRQChannel = RTC_IRQn;
  NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;
  NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
  NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
  NVIC_Init(&NVIC_InitStructure);
  
  /* 2 bits for Preemption Priority and 2 bits for Sub Priority */
  NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);

  NVIC_InitStructure.NVIC_IRQChannel = RTCAlarm_IRQn;
  NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0xFF;
  NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
  NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
  NVIC_Init(&NVIC_InitStructure);
  
  /* Configure EXTI Line17 (RTC Alarm)to generate an interrupt on rising edge */
  EXTI_ClearITPendingBit(EXTI_Line17);
  EXTI_InitStructure.EXTI_Line = EXTI_Line17;
  EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising;
  EXTI_Init(&EXTI_InitStructure);
  
  /* Enable PWR and BKP clocks */
  RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR | RCC_APB1Periph_BKP, ENABLE);

  /* Allow access to BKP Domain */
  PWR_BackupAccessCmd(ENABLE);

  /* Reset Backup Domain */
  BKP_DeInit();

  /* Enable LSE */
  RCC_LSEConfig(RCC_LSE_ON);
  /* Wait till LSE is ready */
  while (RCC_GetFlagStatus(RCC_FLAG_LSERDY) == RESET);

  /* Select LSE as RTC Clock Source */
  RCC_RTCCLKConfig(RCC_RTCCLKSource_LSE);

  /* Enable RTC Clock */
  RCC_RTCCLKCmd(ENABLE);

  /* Wait for RTC registers synchronization */
  RTC_WaitForSynchro();

  /* Wait until last write operation on RTC registers has finished */
  RTC_WaitForLastTask();
  
  /* Wait until last write operation on RTC registers has finished */
  RTC_WaitForLastTask();
  
  /* Alarm in 3 second */
  //RTC_SetAlarm(3);

  /* Wait until last write operation on RTC registers has finished */
  RTC_WaitForLastTask();
  
  /* Enable the RTC Second, RTC Alarm interrupt */
  RTC_ITConfig(RTC_IT_SEC || RTC_IT_ALR, ENABLE);

  /* Set RTC prescaler: set RTC period to 1sec */
  RTC_SetPrescaler(32767); /* RTC period = RTCCLK/RTC_PR = (32.768 KHz)/(32767+1) */

  /* Wait until last write operation on RTC registers has finished */
  RTC_WaitForLastTask();
}
Beispiel #23
0
u8 p_dr_RtcInit(void)
{
    //检查是不是第一次配置时钟
    u8 temp=0;
    RTC_NVIC_Config();
    //if(BKP->DR1!=0X5050)//第一次配置
    if (BKP_ReadBackupRegister(BKP_DR1) != 0x5050)      //从指定的后备寄存器中读出数据:读出了与写入的指定数据不相乎
    {
        /* Enable PWR and BKP clocks */
        RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR | RCC_APB1Periph_BKP, ENABLE);    //使能PWR和BKP外设时钟

        /* Allow access to BKP Domain */
        PWR_BackupAccessCmd(ENABLE);    //使能RTC和后备寄存器访问

        /* Reset Backup Domain */
        BKP_DeInit();   //将外设BKP的全部寄存器重设为缺省值


        /* Enable LSE */
        RCC_LSEConfig(RCC_LSE_ON);  //设置外部低速晶振(LSE),使用外设低速晶振
        /* Wait till LSE is ready */
        while (RCC_GetFlagStatus(RCC_FLAG_LSERDY) == RESET) //检查指定的RCC标志位设置与否,等待低速晶振就绪
        {
            temp++;
            delay_ms(10);
        }
        if(temp>=250)return 1;//初始化时钟失败,晶振有问题
        /* Select LSE as RTC Clock Source */
        RCC_RTCCLKConfig(RCC_RTCCLKSource_LSE);     //设置RTC时钟(RTCCLK),选择LSE作为RTC时钟
        /* Enable RTC Clock */
        RCC_RTCCLKCmd(ENABLE);  //使能RTC时钟
        /* Wait for RTC registers synchronization */
        RTC_WaitForSynchro();       //等待最近一次对RTC寄存器的写操作完成
        /* Wait until last write operation on RTC registers has finished */
        RTC_WaitForLastTask();  //等待最近一次对RTC寄存器的写操作完成
        /* Enable the RTC Second */
        RTC_ITConfig(RTC_IT_SEC, ENABLE);       //使能RTC秒中断
        /* Wait until last write operation on RTC registers has finished */
        RTC_WaitForLastTask();  //等待最近一次对RTC寄存器的写操作完成
        /* Set RTC prescaler: set RTC period to 1sec */
        /* RTC period = RTCCLK/RTC_PR = (32.768 KHz)/(32767+1) */
        RTC_SetPrescaler(32767); //设置RTC预分频的值
        /* Wait until last write operation on RTC registers has finished */
        RTC_WaitForLastTask();  //等待最近一次对RTC寄存器的写操作完成
        p_dr_RtcSet(2009,12,2,10,0,55);  //设置时间
        BKP_WriteBackupRegister(BKP_DR1, 0X5050);   //向指定的后备寄存器中写入用户程序数据
    }
    else//系统继续计时
    {
        /* Check if the Power On Reset flag is set */
        if (RCC_GetFlagStatus(RCC_FLAG_PORRST) != RESET)    //检查指定的RCC标志位设置与否:POR/PDR复位
        {
            //printf("\rPower On Reset occurred....");
        }
        /* Check if the Pin Reset flag is set */
        else if (RCC_GetFlagStatus(RCC_FLAG_PINRST) != RESET)   //检查指定的RCC标志位设置与否:管脚复位
        {
            //printf("\rExternal Reset occurred....");
        }

        //printf("\rNo need to configure RTC....");
        /* Wait for RTC registers synchronization */
        RTC_WaitForSynchro();   //等待最近一次对RTC寄存器的写操作完成

        /* Enable the RTC Second */
        RTC_ITConfig(RTC_IT_SEC, ENABLE);   //使能RTC秒中断
        /* Wait until last write operation on RTC registers has finished */
        RTC_WaitForLastTask();  //等待最近一次对RTC寄存器的写操作完成
    }
    p_dr_RtcGet();//更新时间

    /* Clear reset flags */
    RCC_ClearFlag();    //清除RCC的复位标志位

    return 0; //ok
}
/**
  * @brief  COnfiguration of RTC Registers, Selection and Enabling of 
  *   RTC clock
  * @param  None
  * @retval : None
  */
void RTC_Configuration()
{
  uint16_t WaitForOscSource;
  
  /*Allow access to Backup Registers*/
  PWR_BackupAccessCmd(ENABLE);
  
  if(BKP_ReadBackupRegister(BKP_DR1)==CONFIGURATION_RESET)
  {
    /*Enables the clock to Backup and power interface peripherals    */
    RCC_APB1PeriphClockCmd(RCC_APB1Periph_BKP | RCC_APB1Periph_PWR,ENABLE);

    if(TotalMenuPointer == 1)
    {
      /* Backup Domain Reset */
      BKP_DeInit();
      s_DateStructVar.Month=DEFAULT_MONTH ;
      s_DateStructVar.Day=DEFAULT_DAY;
      s_DateStructVar.Year=DEFAULT_YEAR;
      SummerTimeCorrect = OCTOBER_FLAG_SET;
      BKP_WriteBackupRegister(BKP_DR7,SummerTimeCorrect);
      BKP_WriteBackupRegister(BKP_DR2,s_DateStructVar.Month);
      BKP_WriteBackupRegister(BKP_DR3,s_DateStructVar.Day);
      BKP_WriteBackupRegister(BKP_DR4,s_DateStructVar.Year);
      BKP_WriteBackupRegister(BKP_DR1, CONFIGURATION_DONE);
      LCD_Clear(Blue2);
      LCD_SetBackColor(Blue2);
      LCD_SetTextColor(White);
      LCD_DisplayString(Line2,Column0,"Please wait......");
      LCD_DisplayString(Line4,Column0,"Synchronization may");
      LCD_DisplayString(Line6,Column0,"take upto a minute");
      EE_Format();
      TamperNumber=0;
      BKP_WriteBackupRegister(BKP_DR5,TamperNumber);
    }

    /*Enable 32.768 kHz external oscillator */
    RCC_LSEConfig(RCC_LSE_ON);
  
    for(WaitForOscSource=0;WaitForOscSource<5000;WaitForOscSource++)
    {
    }

    RCC_RTCCLKConfig(RCC_RTCCLKSource_LSE);
    /* RTC Enabled */
    RCC_RTCCLKCmd(ENABLE);
    RTC_WaitForLastTask();
    /*Wait for RTC registers synchronisation */
    RTC_WaitForSynchro();
    RTC_WaitForLastTask();
    /* Setting RTC Interrupts-Seconds interrupt enabled */
    /* Enable the RTC Second */
    RTC_ITConfig(RTC_IT_SEC , ENABLE);
    /* Wait until last write operation on RTC registers has finished */
    RTC_WaitForLastTask();

    if(TotalMenuPointer==1 || TotalMenuPointer==6)
    {
      BKP_WriteBackupRegister(BKP_DR6, 1);
  
      /* Set RTC prescaler: set RTC period to 1 sec */
      RTC_SetPrescaler(32765); /* RTC period = RTCCLK/RTC_PR = (32.768 KHz)/(32767+1) */
      /* Prescaler is set to 32766 instead of 32768 to compensate for
        lower as well as higher frequencies*/
      /* Wait until last write operation on RTC registers has finished */
      RTC_WaitForLastTask();
    }

    if( TotalMenuPointer==7)
    {
      BKP_WriteBackupRegister(BKP_DR6, 2);
      /* Set RTC prescaler: set RTC period to 1 sec */
      RTC_SetPrescaler(49); /* RTC period = RTCCLK/RTC_PR = (50 Hz)/(49+1) */
      /* Wait until last write operation on RTC registers has finished */
      RTC_WaitForLastTask();
    }
  
    if(TotalMenuPointer==8)
    {
      BKP_WriteBackupRegister(BKP_DR6, 3);
      /* Set RTC prescaler: set RTC period to 1 sec */
      RTC_SetPrescaler(59); /* RTC period = RTCCLK/RTC_PR = (60 Hz)/(59+1) */
      /* Wait until last write operation on RTC registers has finished */
      RTC_WaitForLastTask();
    }
 
    /* Set default system time to 09 : 24 : 00 */
    SetTime(DEFAULT_HOURS,DEFAULT_MINUTES,DEFAULT_SECONDS);
    BKP_WriteBackupRegister(BKP_DR1, CONFIGURATION_DONE);
  }
  else
  {
    /* PWR and BKP clocks selection */
    RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR | RCC_APB1Periph_BKP, ENABLE);
    for(WaitForOscSource=0;WaitForOscSource<5000;WaitForOscSource++);
    /* Wait until last write operation on RTC registers has finished */
    RTC_WaitForLastTask();
    /* Enable the RTC Second */
    RTC_ITConfig(RTC_IT_SEC, ENABLE);
    RTC_WaitForLastTask();
  }
    
  /* Check if how many days are elapsed in power down/Low Power Mode-
   Updates Date that many Times*/
  CheckForDaysElapsed();
  ClockSource = BKP_ReadBackupRegister(BKP_DR6);
  TamperNumber = BKP_ReadBackupRegister(BKP_DR5);
  s_DateStructVar.Month = BKP_ReadBackupRegister(BKP_DR2);
  s_DateStructVar.Day = BKP_ReadBackupRegister(BKP_DR3);
  s_DateStructVar.Year = BKP_ReadBackupRegister(BKP_DR4);
  SummerTimeCorrect = BKP_ReadBackupRegister(BKP_DR7);
  s_AlarmDateStructVar.Month = BKP_ReadBackupRegister(BKP_DR8);
  s_AlarmDateStructVar.Day = BKP_ReadBackupRegister(BKP_DR9);
  s_AlarmDateStructVar.Year = BKP_ReadBackupRegister(BKP_DR10);
}
Beispiel #25
0
/*******************************************************************************
* Function Name  : RCC_Configuration
* Description    : Configures the different system clocks.
* Input          : None
* Output         : None
* Return         : None
*******************************************************************************/
void RCC_Configuration(void)
{
  /* RCC system reset(for debug purpose) */
  RCC_DeInit();

  /* Enable HSE */
  RCC_HSEConfig(RCC_HSE_ON);

  /* Wait till HSE is ready */
  HSEStartUpStatus = RCC_WaitForHSEStartUp();

  if(HSEStartUpStatus == SUCCESS)
  {
    /* Enable Prefetch Buffer */
    FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable);

    /* Flash 2 wait state */
    FLASH_SetLatency(FLASH_Latency_2);
 
    /* HCLK = SYSCLK */
    RCC_HCLKConfig(RCC_SYSCLK_Div1); 
  
    /* PCLK2 = HCLK */
    RCC_PCLK2Config(RCC_HCLK_Div1); 

    /* PCLK1 = HCLK/2 */
    RCC_PCLK1Config(RCC_HCLK_Div2);

    /* PLLCLK = 8MHz * 9 = 72 MHz */
    RCC_PLLConfig(RCC_PLLSource_HSE_Div1, RCC_PLLMul_9);

    /* Enable PLL */ 
    RCC_PLLCmd(ENABLE);

    /* Wait till PLL is ready */
    while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET)
    {
    }

    /* Select PLL as system clock source */
    RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);

    /* Wait till PLL is used as system clock source */
    while(RCC_GetSYSCLKSource() != 0x08)
    {
    }
  }  
  
  /* GPIOA, GPIOC, GPIO KEY Button, GPIO_LED and AFIO clocks enable */
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIO_KEY_BUTTON | 
                         RCC_APB2Periph_GPIO_LED | RCC_APB2Periph_GPIOC |
                         RCC_APB2Periph_AFIO, ENABLE);
   
#ifdef RTC_Alarm_WFEWakeUp
  /* Enable the PWR and BKP Clocks */
  RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR | RCC_APB1Periph_BKP, ENABLE);

  /* Configure the EXTI Line 17 as Event */
  EXTI_StructInit(&EXTI_InitStructure);
  EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Event;
  EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling;
  EXTI_InitStructure.EXTI_Line = EXTI_Line17;
  EXTI_InitStructure.EXTI_LineCmd = ENABLE;
  EXTI_Init(&EXTI_InitStructure);
  
  /* Allow access to BKP Domain */
  PWR_BackupAccessCmd(ENABLE);

  /* Reset Backup Domain */
  BKP_DeInit();
  /* Enable LSE */
  RCC_LSEConfig(RCC_LSE_ON);
  /* Wait till LSE is ready */
  while(RCC_GetFlagStatus(RCC_FLAG_LSERDY) == RESET)
  {
  }

  /* Select LSE as RTC Clock Source */
  RCC_RTCCLKConfig(RCC_RTCCLKSource_LSE);

  /* Enable the RTC Clock */
  RCC_RTCCLKCmd(ENABLE);
  /* Wait for APB registers synchronisation */
  RTC_WaitForSynchro();
  
  /* Wait until last write operation on RTC registers has finished */
  RTC_WaitForLastTask();
  /* Set the RTC time base to 1s */
  RTC_SetPrescaler(32767);
    /* Wait until last write operation on RTC registers has finished */
  RTC_WaitForLastTask();
#endif 

}
Beispiel #26
0
/**
  * @brief  Init hardware of RTC

  * @param  none

  * @retval None
  */
u8 RTC_Hardware_Init(void)
{
	u16 countDown = 1000;
	RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR | RCC_APB1Periph_BKP, ENABLE);

	PWR_BackupAccessCmd(ENABLE);

	//BKP_DeInit();

	if (BKP_ReadBackupRegister(BKP_DR1) != 0xA5A5)						//从指定的后备寄存器中读出数据,判断是否为第一次配置
	{
		BKP_DeInit();												//将外设BKP的全部寄存器重设为缺省值 	
		RCC_LSEConfig(RCC_LSE_ON);									//使能外部低速时钟 32.768KHz
		while (RCC_GetFlagStatus(RCC_FLAG_LSERDY) == RESET)			//检查指定的RCC标志位设置与否,等待低速晶振就绪
		{
			vTaskDelay(2 / portTICK_RATE_MS);
			countDown--;
			if (countDown == 0)
			{
				ShowDialogue("Hardware Error", "LSE crystal", "not ready!", false, true);
				OLED_Refresh_Gram();
				while (1);
			}
		}		RCC_RTCCLKConfig(RCC_RTCCLKSource_LSE);						//设置RTC时钟(RTCCLK),选择LSE作为RTC时钟    
		RCC_RTCCLKCmd(ENABLE);										//使能RTC时钟  
		RTC_WaitForSynchro();										//等待RTC寄存器(RTC_CNT,RTC_ALR和RTC_PRL)与RTC APB时钟同步
		RTC_WaitForLastTask();										//等待最近一次对RTC寄存器的写操作完成
		RTC_ITConfig(RTC_IT_SEC, ENABLE);							//使能RTC秒中断
		RTC_WaitForLastTask();										//等待最近一次对RTC寄存器的写操作完成
		RTC_SetPrescaler(32767); 									//设置RTC预分频的值  RTC period = RTCCLK/RTC_PR = (32.768 KHz)/(32767+1)
		RTC_WaitForLastTask();										//等待最近一次对RTC寄存器的写操作完成
		Time_Set();													//时间设置	
		BKP_WriteBackupRegister(BKP_DR1, 0xA5A5);					//向指定的后备寄存器中写入用户程序数据0X5555做判断标志										
	}
	else															//不是第一次配置 继续计时
	{
		if (RCC_GetFlagStatus(RCC_FLAG_PORRST) != RESET)			//检查指定的RCC标志位设置与否:POR/PDR复位
		{
			;
		}
		else if (RCC_GetFlagStatus(RCC_FLAG_PINRST) != RESET)		//检查指定的RCC标志位设置与否:管脚复位
		{
			;
		}
		RCC_ClearFlag();

		//		NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);		//先占优先级1位,从优先级3位

		//		NVIC_InitStructure.NVIC_IRQChannel = RTC_IRQn;		//RTC全局中断
		//		NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 2;	//先占优先级1位,从优先级3位
		//		NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;	//先占优先级0位,从优先级4位
		//		NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;		//使能该通道中断
		//		NVIC_Init(&NVIC_InitStructure);		//根据NVIC_InitStruct中指定的参数初始化外设NVIC寄存器

		RTC_WaitForSynchro();										//等待最近一次对RTC寄存器的写操作完成

//		RTC_ITConfig(RTC_IT_SEC, ENABLE);							//使能RTC秒中断

		RTC_WaitForLastTask();										//等待最近一次对RTC寄存器的写操作完成
	}
	//Time_Get();														//更新时间 

	RCC_ClearFlag();												//清除RCC的复位标志位

	return 0; //ok		
}
Beispiel #27
0
/*******************************************************************************
* Function Name  : RTC_Configuration
* Description    : 来重新配置RTC和BKP,仅在检测到后备寄存器数据丢失时使用
* Input          : None
* Output         : None
* Return         : None
*******************************************************************************/
void RTC_Configuration(void)
{
	//启用PWR和BKP的时钟(from APB1)
	RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR | RCC_APB1Periph_BKP, ENABLE);

	//后备域解锁
	PWR_BackupAccessCmd(ENABLE);

	//备份寄存器模块复位
	BKP_DeInit();


	//外部32.768K其哟偶那个
	RCC_LSEConfig(RCC_LSE_ON);
		
	//等待稳定
	while (RCC_GetFlagStatus(RCC_FLAG_LSERDY) == RESET);
//	Lcd_WriteString(10,0,0,Red,"00");

	//RTC时钟源配置成LSE(外部32.768K)
	RCC_RTCCLKConfig(RCC_RTCCLKSource_LSE);

	//RTC开启
	RCC_RTCCLKCmd(ENABLE);

	//开启后需要等待APB1时钟与RTC时钟同步,才能读写寄存器
	RTC_WaitForSynchro();

	//读写寄存器前,要确定上一个操作已经结束
	RTC_WaitForLastTask();

		//使能秒中断
	RTC_ITConfig(RTC_IT_SEC, ENABLE); 

	//等待写入完成
	RTC_WaitForLastTask();

	//设置RTC分频器,使RTC时钟为1Hz
	//RTC period = RTCCLK/RTC_PR = (32.768 KHz)/(32767+1)
	RTC_SetPrescaler(32767);


	//等待寄存器写入完成
	RTC_WaitForLastTask(); 




		    time_now.tm_year = 2009;
		    time_now.tm_mon = 7;
			time_now.tm_mday = 31;
			time_now.tm_hour = 13;
			time_now.tm_min = 11;
			time_now.tm_sec = 00;

			Time_SetCalendarTime(time_now);	 



	return;




}
Beispiel #28
0
/*******************************************************************************
* Function Name  : rtc_init
* Description    : initializes HW RTC,
*                  sets default time-stamp if RTC has not been initialized before
* Input          : None
* Output         : None
* Return         : not used
*  Based on code from a STM RTC example in the StdPeriph-Library package
*******************************************************************************/
int rtc_init(void)
{
	volatile uint16_t i;

	/* Enable PWR and BKP clocks */
	RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR | RCC_APB1Periph_BKP, ENABLE);

	/* LSI clock stabilization time */
	for(i=0;i<5000;i++) { ; }

	if (BKP_ReadBackupRegister(BKP_DR1) != 0xA5A5) {
		/* Backup data register value is not correct or not yet programmed (when
		   the first time the program is executed) */

		/* Allow access to BKP Domain */
		PWR_BackupAccessCmd(ENABLE);

		/* Reset Backup Domain */
		BKP_DeInit();

		/* Enable LSE */
		RCC_LSEConfig(RCC_LSE_ON);

		/* Wait till LSE is ready */
		while (RCC_GetFlagStatus(RCC_FLAG_LSERDY) == RESET) { ; }

		/* Select LSE as RTC Clock Source */
		RCC_RTCCLKConfig(RCC_RTCCLKSource_LSE);

		/* Enable RTC Clock */
		RCC_RTCCLKCmd(ENABLE);

		/* Wait for RTC registers synchronization */
		RTC_WaitForSynchro();

		/* Wait until last write operation on RTC registers has finished */
		RTC_WaitForLastTask();

		/* Set RTC prescaler: set RTC period to 1sec */
		RTC_SetPrescaler(32767); /* RTC period = RTCCLK/RTC_PR = (32.768 KHz)/(32767+1) */

		/* Wait until last write operation on RTC registers has finished */
		RTC_WaitForLastTask();

		/* Set initial value */
		RTC_SetCounter( (uint32_t)((11*60+55)*60) ); // here: 1st January 2000 11:55:00

		/* Wait until last write operation on RTC registers has finished */
		RTC_WaitForLastTask();

		BKP_WriteBackupRegister(BKP_DR1, 0xA5A5);

		/* Lock access to BKP Domain */
		PWR_BackupAccessCmd(DISABLE);

	} else {

		/* Wait for RTC registers synchronization */
		RTC_WaitForSynchro();

	}

	return 0;
}
Beispiel #29
0
/**
 * @brief  COnfiguration of RTC Registers, Selection and Enabling of 
 *   RTC clock
 * @param  None
 * @retval : None
 */
void RTC_Configuration()
{
	uint16_t WaitForOscSource;

	/*Allow access to Backup Registers*/
	PWR_BackupAccessCmd(ENABLE);

	BKP_RTCOutputConfig(BKP_RTCOutputSource_None);

	if(READ_BKP_CONFIGURATION() != CONFIGURATION_DONE)
	{
		/*Enables the clock to Backup and power interface peripherals    */
		RCC_APB1PeriphClockCmd(RCC_APB1Periph_BKP | RCC_APB1Periph_PWR, ENABLE);

		/* Backup Domain Reset */
		BKP_DeInit();

		set_time(&s_DateStructVar);	 
		set_alarm(&s_AlarmDateStructVar);

		//EE_Format();

		/*Enable 32.768 kHz external oscillator */
		RCC_LSEConfig(RCC_LSE_ON);
		for(WaitForOscSource = 0; WaitForOscSource < 5000; WaitForOscSource++);   

		RCC_RTCCLKConfig(RCC_RTCCLKSource_LSE);

		/* RTC Enabled */
		RCC_RTCCLKCmd(ENABLE);
		RTC_WaitForLastTask();

		/*Wait for RTC registers synchronisation */
		RTC_WaitForSynchro();
		RTC_WaitForLastTask();

		/* Setting RTC Interrupts-Seconds interrupt enabled */
		/* Enable the RTC Second */
		RTC_ITConfig(RTC_IT_SEC , ENABLE);
		RTC_WaitForLastTask();

		/* Set RTC prescaler: set RTC period to 1 sec */
		RTC_SetPrescaler(32765); /* RTC period = RTCCLK/RTC_PR = (32.768 KHz)/(32767+1) */
		/* Prescaler is set to 32766 instead of 32768 to compensate for
			lower as well as higher frequencies*/
		RTC_WaitForLastTask();

		WRITE_BKP_CONFIGURATION(CONFIGURATION_DONE);
	}
	else
	{
		/* PWR and BKP clocks selection */
		RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR | RCC_APB1Periph_BKP, ENABLE);
		for(WaitForOscSource = 0; WaitForOscSource < 5000; WaitForOscSource++);
		RTC_WaitForLastTask();

		/* Enable the RTC Alarm */
		RTC_ITConfig(RTC_IT_SEC, ENABLE);
		RTC_WaitForLastTask();
	}

	/* Check if how many days are elapsed in power down/Low Power Mode-
		Updates Date that many Times*/
	CheckForDaysElapsed();
}
Beispiel #30
0
/*******************************************************************************
* Function Name  : RTC_Configuration
* Description    : COnfiguration of RTC Registers, Selection and Enabling of 
*                  RTC clock
* Input          : None
* Output         : None
* Return         : None
*******************************************************************************/
void RTC_Configuration()
{
  u16 u16_WaitForOscSource;
  
  /*Allow access to Backup Registers*/
  PWR_BackupAccessCmd(ENABLE);
  
  if(BKP_ReadBackupRegister(BKP_DR1)==CONFIGURATION_RESET)
  {
    /*Enables the clock to Backup and power interface peripherals    */
    RCC_APB1PeriphClockCmd(RCC_APB1Periph_BKP | RCC_APB1Periph_PWR,ENABLE);

    /* Backup Domain Reset */
      BKP_DeInit();
      s_DateStructVar.u8_Month=DEFAULT_MONTH ;
      s_DateStructVar.u8_Day=DEFAULT_DAY;
      s_DateStructVar.u16_Year=DEFAULT_YEAR;
      u16_SummerTimeCorrect = OCTOBER_FLAG_SET;
      BKP_WriteBackupRegister(BKP_DR7,u16_SummerTimeCorrect);
      BKP_WriteBackupRegister(BKP_DR2,s_DateStructVar.u8_Month);
      BKP_WriteBackupRegister(BKP_DR3,s_DateStructVar.u8_Day);
      BKP_WriteBackupRegister(BKP_DR4,s_DateStructVar.u16_Year);
      BKP_WriteBackupRegister(BKP_DR1, CONFIGURATION_DONE);
      u8_TamperNumber=0;
      BKP_WriteBackupRegister(BKP_DR5,u8_TamperNumber);


    /*Enable 32.768 kHz external oscillator */
    RCC_LSEConfig(RCC_LSE_ON);
  
    for(u16_WaitForOscSource=0;u16_WaitForOscSource<5000;u16_WaitForOscSource++)
    {
    }

    RCC_RTCCLKConfig(RCC_RTCCLKSource_LSE);
    /* RTC Enabled */
    RCC_RTCCLKCmd(ENABLE);
    RTC_WaitForLastTask();
    /*Wait for RTC registers synchronisation */
    RTC_WaitForSynchro();
    RTC_WaitForLastTask();
    /* Setting RTC Interrupts-Seconds interrupt enabled */
    /* Enable the RTC Second */
    RTC_ITConfig(RTC_IT_SEC , ENABLE);
    /* Wait until last write operation on RTC registers has finished */
    RTC_WaitForLastTask();

      BKP_WriteBackupRegister(BKP_DR6, 1);
  
      /* Set RTC prescaler: set RTC period to 1 sec */
      RTC_SetPrescaler(32765); /* RTC period = RTCCLK/RTC_PR = (32.768 KHz)/(32767+1) */
      /* Prescaler is set to 32766 instead of 32768 to compensate for
        lower as well as higher frequencies*/
      /* Wait until last write operation on RTC registers has finished */
      RTC_WaitForLastTask();


 
    /* Set default system time to 09 : 24 : 00 */
    SetTime(DEFAULT_HOURS,DEFAULT_MINUTES,DEFAULT_SECONDS);
    BKP_WriteBackupRegister(BKP_DR1, CONFIGURATION_DONE);
  }
  else
  {
	  //BKP_WriteBackupRegister(BKP_DR1, CONFIGURATION_RESET);
    /* PWR and BKP clocks selection */
    RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR | RCC_APB1Periph_BKP, ENABLE);
    for(u16_WaitForOscSource=0;u16_WaitForOscSource<5000;u16_WaitForOscSource++);
    /* Wait until last write operation on RTC registers has finished */
    RTC_WaitForLastTask();
    /* Enable the RTC Second */
    RTC_ITConfig(RTC_IT_SEC, ENABLE);
    RTC_WaitForLastTask();
  }
    
  /* Check if how many days are elapsed in power down/Low Power Mode-
   Updates Date that many Times*/
  CheckForDaysElapsed();
  u8_ClockSource = BKP_ReadBackupRegister(BKP_DR6);
  u8_TamperNumber = BKP_ReadBackupRegister(BKP_DR5);
  s_DateStructVar.u8_Month = BKP_ReadBackupRegister(BKP_DR2);
  s_DateStructVar.u8_Day = BKP_ReadBackupRegister(BKP_DR3);
  s_DateStructVar.u16_Year = BKP_ReadBackupRegister(BKP_DR4);
  u16_SummerTimeCorrect = BKP_ReadBackupRegister(BKP_DR7);
  s_AlarmDateStructVar.u8_Month = BKP_ReadBackupRegister(BKP_DR8);
  s_AlarmDateStructVar.u8_Day = BKP_ReadBackupRegister(BKP_DR9);
  s_AlarmDateStructVar.u16_Year = BKP_ReadBackupRegister(BKP_DR10);
}