新手入门
- 积分
- 19
- 金钱
- 19
- 注册时间
- 2020-7-13
- 在线时间
- 3 小时
|
1金钱
RTC闹钟中断是连接到EXTI_LINE17,主函数里初始化一些寄存器后,就通过PWR_EnterSTOPMode(PWR_Regulator_LowPower, PWR_STOPEntry_WFI)进入停止模式了。但是这个程序运行后,发现进入停止模式后,RTC闹钟不工作,不会唤醒单片机。
如果我把PWR_EnterSTOPMode(PWR_Regulator_LowPower, PWR_STOPEntry_WFI)屏蔽掉,不进入STOP模式,那么RTC闹钟可以进入中断。但是进入中断后,时间感觉也不对,我设置的ALARM是10秒,
但是实际上大概是6秒。
看不出来什么问题,有大神帮忙看一下吗?谢谢了。
/*****************************************************
RTC配置函数
*****************************************************/
u8 rtc_config(void)
{
u8 temp = 0;
RCC_APB1PeriphClockCmd(RCC_APB1Periph_BKP|RCC_APB1Periph_PWR, ENABLE); //使能BKP和PWR时钟
PWR_BackupAccessCmd(ENABLE); //允许BKP访问
RCC_LSEConfig(RCC_LSE_ON); //开启LSE
while(RCC_GetFlagStatus(RCC_FLAG_LSERDY) == RESET && temp < 250) //等待LSE起振或者超时
{
temp++;
delay_ms(10);
}
if(temp >= 250) return 1;
RCC_RTCCLKConfig(RCC_RTCCLKSource_LSE); //选择RTC时钟源LSE
RCC_RTCCLKCmd(ENABLE); //使能RTC时钟
RTC_WaitForSynchro();
RTC_WaitForLastTask(); //等待上一次操作完成
RTC_SetPrescaler(32767); //设置预分频:1秒
RTC_WaitForLastTask();
RTC_SetAlarm(RTC_GetCounter()+10); //设置闹钟时间10秒
RTC_WaitForLastTask();
RTC_SetCounter(0x0000);
RTC_WaitForLastTask();
RTC_ITConfig(RTC_IT_ALR, ENABLE); //使能闹钟中断
RTC_ClearITPendingBit(RTC_IT_ALR);
NVIC_InitTypeDef NVIC_InitStruct;
NVIC_InitStruct.NVIC_IRQChannel = RTCAlarm_IRQn;
NVIC_InitStruct.NVIC_IRQChannelCmd = ENABLE;
NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority = 1;
NVIC_InitStruct.NVIC_IRQChannelSubPriority = 0;
NVIC_Init(&NVIC_InitStruct);
EXTI_InitTypeDef EXTI_InitStruct;
EXTI_InitStruct.EXTI_Line = EXTI_Line17;
EXTI_InitStruct.EXTI_LineCmd = ENABLE;
EXTI_InitStruct.EXTI_Mode = EXTI_Mode_Interrupt;
EXTI_InitStruct.EXTI_Trigger = EXTI_Trigger_Rising;
EXTI_Init(&EXTI_InitStruct);
return 0;
}
/************************************************************
RTC闹钟中断函数
每次闹钟唤醒,重新写ALARM的值,并使LED灯翻转
************************************************************/
void RTCAlarm_IRQHandler(void)
{
EXTI_ClearITPendingBit(EXTI_Line17);
RTC_WaitForSynchro();
RTC_WaitForLastTask();
RTC_SetAlarm(RTC_GetCounter()+10);
RTC_WaitForLastTask();
PN_LED0 = ~PN_LED0;
}
|
|