待机模式:唤醒后复位,从头开始执行主函数,所有时钟关闭,仅有RTC时钟开启
停止模式:除RTC时钟外,所有外设时钟关闭,但保存数据和运行到的位置(PC值),唤醒后需要等时钟同步
睡眠模式:外设时钟开启,CPU时钟关闭,保存数据和运行到的位置(PC值)
void RTC_Init(uint32_t count)
{
RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR | RCC_APB1Periph_BKP, ENABLE); //使能BPK PWR时钟
NVIC_InitTypeDef NVIC_InitStruct;
NVIC_InitStruct.NVIC_IRQChannel =RTC_IRQn;
NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority = 0;
NVIC_InitStruct.NVIC_IRQChannelSubPriority = 1;
NVIC_InitStruct.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStruct);
PWR_BackupAccessCmd(ENABLE); //系统复位后,会自动禁止访问后备寄存器和 RTC,以防止对后备区域(BKP)的意外写操作,使能 RTC 和后备寄存器以进行写入访问
BKP_DeInit();//复位备份区域,(可选)
//BKP_TamperPinCmd(DISABLE);
RCC_LSICmd(ENABLE);
while(RCC_GetFlagStatus(RCC_FLAG_LSIRDY) == RESET);//检查指定的 RCC 标志位设置与否,等待低速晶振就绪
RCC_RTCCLKConfig(RCC_RTCCLKSource_LSI); //选择 LSE 作为 RTC 时钟
RCC_RTCCLKCmd(ENABLE); //使能 RTC 时钟
RTC_WaitForLastTask(); //等待最近一次对 RTC 寄存器的写操作完成
RTC_WaitForSynchro(); //等待 RTC 寄存器同步
RTC_SetPrescaler(39999);//设置 RTC 时钟分频数 晶振32.768KHz
RTC_WaitForLastTask(); //等待最近一次对 RTC 寄存器的写操作完成
RTC_SetCounter(count);//最后在配置完成之后
RTC_WaitForLastTask(); //等待最近一次对 RTC 寄存器的写操作完成
RTC_ITConfig(RTC_IT_SEC,ENABLE); //使能 RTC 秒中断
RTC_WaitForLastTask(); //等待最近一次对 RTC 寄存器的写操作完成