求助!!STM32L151中的RTC唤醒(wake up)中断问题
各位大大,我最近在做STM32L151时出现了一个问题,就是RTC唤醒(wake up)中断不会中断啊,不知道为什么。下面是我的部分程序:void RTC_Configuration(void)
{
/* Enable PWR and BKP clock */
RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR, ENABLE);
/* Allow access to BKP Domain */
PWR_RTCAccessCmd(ENABLE);
/* Enable the 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);
/* Wait for RTC APB registers synchronisation */
RTC_WaitForSynchro();
RTC_InitStructure.RTC_AsynchPrediv = 0x06;
RTC_InitStructure.RTC_SynchPrediv = 0x66;
RTC_InitStructure.RTC_HourFormat = RTC_HourFormat_24;
RTC_Init(&RTC_InitStructure);
/* Configure the RTC WakeUp Clock source: CK_SPRE (1Hz) */
RTC_WakeUpClockConfig(RTC_WakeUpClock_CK_SPRE_16bits);
RTC_SetWakeUpCounter(0x0);
/* Enable the RTC Wakeup Interrupt */
RTC_ITConfig(RTC_IT_WUT, ENABLE);
/* Enable Wakeup Counter */
RTC_WakeUpCmd(ENABLE);
}
void NVIC_Configuration(void)
{
NVIC_InitTypeDef NVIC_InitStructure;
// Set the Vector Table base location at 0x08000000 */
NVIC_SetVectorTable(NVIC_VectTab_FLASH, 0x0);
// 1 bits for Preemption Priority and 3 bits for Sub Priority */
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0);
NVIC_InitStructure.NVIC_IRQChannel = RTC_WKUP_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
}
时钟用的是LSE,就是外部低速晶振(32.768K)的
一直不能产生中断,各位大大,帮我看看是怎么回事吧,小弟在此谢过了... 以STM32F207VE中的RTC为例。
第一,所有的RTC中断都必须由EXTI产生,手册上面有这样一句话:
All RTC interrupts are connected to the EXTI controller.
第二,既然是EXTI在产生,所以他不同于一般的中断。一般的中断是只要标志位为1,就一直触发中断,直到标志位被清零,这是电平触发(例如TIM_IT_Update就属于此类)。EXTI只能检测上升沿和下降沿,不能直接通过电平触发。因此,如果开机的时候一来RTC_FLAG_WUTF就已经置位,那么EXTI_Line22将永远是高电平,不会有上升沿,因此永远也不会触发中断。解决方案是在开中断前手动清除标志位:
RTC_WakeUpCmd(DISABLE);
RTC_WakeUpClockConfig(RTC_WakeUpClock_CK_SPRE_16bits);
RTC_SetWakeUpCounter(0);
RTC_WakeUpCmd(ENABLE);
RTC_ClearFlag(RTC_FLAG_WUTF); // 由于EXTI中断只对WUTF的上升沿有效, 因此若之前WUTF已经置位, 则永远不会触发中断!!!
RTC_ITConfig(RTC_IT_WUT, ENABLE);第三,启动文件startup_stm32f2xx.s里面所定义的RTC_WKUP_IRQHandler、RTC_Alarm_IRQHandler和TAMP_STAMP_IRQHandler这几个中断函数实质上分别是EXTI22、EXTI17和EXTI21的中断函数,都只能通过对应的RTC_FLAG_xx标志位的上升/下降沿(也就是0-1跳变)触发,且在不清除RTC标志位的前提下只能触发一次(EXTI_PR标志位已清除)!
第四,RTC_ITConfig(RTC_IT_WUT, ENABLE)和EXTI_Init(&exti)要同时打开。并且RTC_IT_WUT有记忆性,系统复位后不会关闭该中断。手动执行RTC_ITConfig(RTC_IT_WUT, DISABLE)后中断不再有效。 如果你是由待机模式唤醒的话不会进入中断,他相当于复位直接由程序开始运行
你可以在正常运行模式下使能唤醒,就会进入中断
回复:求助!!STM32L151中的RTC唤醒(wake up)中断问题
:'(哪位大神可以帮帮我的咧~~~回复:求助!!STM32L151中的RTC唤醒(wake up)中断问题
回复第 2 楼 于2013-02-27 16:22:32发表::'(哪位大神可以帮帮我的咧~~~
你在stm32l1xxit.h文件中有加中断程序吗?http://www.amobbs.com/thread-5004198-1-1.html这里貌似有这个中断。。不过我刚开始学,也不清楚这些。
RE:求助!!STM32L151中的RTC唤醒(wake up)中断问题
RTC中断和代码开起了吗?:D回复:求助!!STM32L151中的RTC唤醒(wake up)中断问题
楼主问题解决了吗 RTC中断配置程序有写吗?例如:
/* EXTI configuration *******************************************************/
EXTI_ClearITPendingBit(EXTI_Line20);
EXTI_InitStructure.EXTI_Line = EXTI_Line20;
EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;
EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising;
EXTI_InitStructure.EXTI_LineCmd = ENABLE;
EXTI_Init(&EXTI_InitStructure);
官网上下载的STM32L固件库中就有RTC中断的例子,你可以参考。 我正在愁这个呢,无法使用RTC唤醒。:'( freewarm_300572 发表于 2016-8-25 10:33
我正在愁这个呢,无法使用RTC唤醒。
什么问题,发帖说明情况。
页:
[1]
2