1. 这种模式与halt模式的区别就是RTC是工作的,且可以使用RTC中断来唤醒,利用外部低速时钟作为时钟源。
2. 本实验设计为:按键之后,led灯亮灭交替,要接外部时钟需要单独飞一根线接时钟源。
void CLK_Config(void)
{
/* Select HSE as system clock source */
CLK_SYSCLKSourceSwitchCmd(ENABLE);//使能时钟切换
CLK_SYSCLKSourceConfig(CLK_SYSCLKSource_LSI);//选择外部低速时钟作为时钟源
/* system clock prescaler: 1*/
CLK_SYSCLKDivConfig(CLK_SYSCLKDiv_1);//设置系统时钟分频
while (CLK_GetSYSCLKSource() != CLK_SYSCLKSource_LSI)//等待时钟稳定
{}
}
void RTC_Config(void)
{
CLK_LSEConfig(CLK_LSE_ON);
CLK_RTCClockConfig(CLK_RTCCLKSource_LSE, CLK_RTCCLKDiv_1);
while (CLK_GetFlagStatus(CLK_FLAG_LSERDY) == RESET);
RTC_WakeUpCmd(DISABLE);
CLK_PeripheralClockConfig(CLK_Peripheral_RTC, ENABLE);//RTC时钟门控使能
RTC_WakeUpClockConfig(RTC_WakeUpClock_RTCCLK_Div16);
RTC_ITConfig(RTC_IT_WUT, ENABLE);
RTC_SetWakeUpCounter(2047);
ITC_SetSoftwarePriority(RTC_IRQn, ITC_PriorityLevel_3);//优先级
enableInterrupts();
}
PWR_FastWakeUpCmd(ENABLE); //快速唤醒使能
RTC_Config();//所有IO输出低电平
GPIO_Init(GPIOA, GPIO_Pin_All, GPIO_Mode_Out_PP_Low_Slow);
GPIO_Init(GPIOB, GPIO_Pin_All, GPIO_Mode_Out_PP_Low_Slow);
GPIO_Init(GPIOC, GPIO_Pin_All, GPIO_Mode_Out_PP_Low_Slow);
GPIO_Init(GPIOD, GPIO_Pin_All, GPIO_Mode_Out_PP_Low_Slow);
PWR_UltraLowPowerCmd(ENABLE);//超低功耗
RTC_ITConfig(RTC_IT_WUT, ENABLE);//唤醒定时器中断使能
RTC_WakeUpCmd(ENABLE);//RTC唤醒使能 开始计时 到时间了 就产生RTC中断
while(1)
{
halt();
}
INTERRUPT_HANDLER(RTC_CSSLSE_IRQHandler,4)
{
/* In order to detect unexpected events during development,
it is recommended to set a breakpoint on the following instruction.
*/
RTC_WakeUpCmd(DISABLE);
Delay(0x002F);
GPIO_ToggleBits(GPIOD,GPIO_Pin_4);
RTC_ClearITPendingBit(RTC_IT_WUT);
RTC_WakeUpCmd(ENABLE);
}