关于STM32的RTC闹钟休眠唤醒
如题,本人在测试STOP模式下闹钟唤醒,发现唤醒间隙不一致,如图所示:在非低功耗模式下,则可以获得等宽的脉冲,希望得到大神解惑。
file:///D:\Personal\Documents\Tencent Files\406178052\Image\C2C\C3967C544EC568420CF45759007E7027.jpg
停止模式下,闹钟唤醒,要在中断唤醒后,再次初始化系统时钟的。 下面是代码:
int RTC_Init_User(void)
{
EXTI_InitTypeDef EXTI_InitStructure;
NVIC_InitTypeDef NVIC_InitStructure;
// RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);
RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR | RCC_APB1Periph_BKP, ENABLE);
BKP_DeInit();
//使能后备寄存器访问
PWR_BackupAccessCmd(ENABLE);
RCC_LSICmd(ENABLE);
while(RCC_GetFlagStatus(RCC_FLAG_LSIRDY) == 0) {};
RCC_RTCCLKConfig(RCC_RTCCLKSource_LSI);
RCC_RTCCLKCmd(ENABLE);
RTC_WaitForLastTask();
RTC_WaitForSynchro();
RTC_SetPrescaler(4000);
RTC_WaitForLastTask();
RTC_SetCounter(0);
RTC_WaitForLastTask();
RTC_SetAlarm(RTC_GetCounter()+2);//设置闹钟时间默认初始化为0.5秒钟后闹钟事件
RTC_WaitForLastTask();
RTC_ITConfig(RTC_IT_ALR, ENABLE);
RTC_WaitForLastTask();
// PWR_Cfg_User();
//闹钟中断接到第17线外部中断
EXTI_ClearITPendingBit(EXTI_Line17);
EXTI_InitStructure.EXTI_Line = EXTI_Line17;
EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;
EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising;
EXTI_InitStructure.EXTI_LineCmd = ENABLE;
EXTI_Init(&EXTI_InitStructure);
NVIC_InitStructure.NVIC_IRQChannel = RTCAlarm_IRQn;//闹钟唤醒
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
return 0;
}
int RTC_Cfg_User(uint8_t Alarm)
{
RTC_SetAlarm(RTC_GetCounter()+Alarm);//设置闹钟时间
RTC_WaitForLastTask();
return 0;
}
void RTCAlarm_IRQHandler()
{
uint32_t iTemp=0;
RTC_WaitForSynchro();
if (RTC_GetITStatus(RTC_IT_ALR) != RESET)
{
EXTI_ClearITPendingBit(EXTI_Line17);
RTC_WaitForLastTask();
RTC_ClearITPendingBit(RTC_IT_ALR);
RTC_WaitForLastTask();
if(PWR_GetFlagStatus(PWR_FLAG_WU) != RESET)
{
PWR_ClearFlag(PWR_FLAG_WU); // 清除唤醒标志
RTC_WaitForLastTask();
}
GPIO_ToggleBits(GPIO_Pin_13,GPIOC);
RTC_SetCounter(0);
RTC_WaitForLastTask();
iTemp=RTC_GetCounter();
RTC_SetAlarm((uint32_t)(iTemp+2));//设置闹钟时间默认初始化为0.5秒钟后闹钟事件
RTC_WaitForLastTask();
RTC_ClearITPendingBit(RTC_IT_ALR);
RTC_WaitForLastTask();
}
} 3楼没错,没有重新初始化系统时钟。 zhao.zhao 发表于 2017-4-30 15:29
停止模式下,闹钟唤醒,要在中断唤醒后,再次初始化系统时钟的。
正解,需要初始化始终。 簽到簽到啦!!!! 长不大的小孩 发表于 2017-5-18 16:20
簽到簽到啦!!!!
这里不签到……请出门左转 没有重新初始化系统时钟。
页:
[1]