完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
STM32F030 的RTC 定时3秒,进入中断后,清除所有标志位,再重设定时时间3秒,后开闹钟,竟然不能再进中断?这个是为什么
if(RTC_GetiTStatus(RTC_IT_ALRA)!=0)//RTC_IT_ALRA { } RCC_LSICmd(DISABLE);//OPEN LSI RTC_AlarmCmd(RTC_Alarm_A,DISABLE);//ÄÖÖÓʹÄÜ RTC_ITConfig(RTC_IT_ALRA, DISABLE);//ÖжÏÅäÖà RTC_ClearFlag(RTC_FLAG_ALRAF);//alarm flag RTC_ClearFlag(RTC_FLAG_WUTF);//WakeUp Timer flag RTC_ClearFlag(RTC_FLAG_TAMP2F); RTC_ClearFlag(RTC_FLAG_TAMP1F); RTC_ClearFlag(RTC_FLAG_TSOVF); RTC_ClearFlag(RTC_FLAG_TSF); RTC_ClearFlag(RTC_FLAG_RSF); RTC_ClearITPendingBit(RTC_IT_TS); RTC_ClearITPendingBit(RTC_IT_WUT); RTC_ClearITPendingBit(RTC_IT_ALRA); RTC_ClearITPendingBit(RTC_IT_TAMP1); RTC_ClearITPendingBit(RTC_IT_TAMP2); sleeptemp1=11; IWDG_WriteAccessCmd(IWDG_WriteAccess_Enable);//DOGдʹÄÜ 0X5555 IWDG_SetPrescaler(0X7);//Ô¤·ÖƵ IWDG_SetReload(0XAAAA);//×°ÔØÖµ IWDG_ReloadCounter();//0XAAAA IWDG_Enable();//¿ªÆôDOG EXTI_ClearITPendingBit(EXTI_Line0 | EXTI_Line2 | EXTI_Line4 | EXTI_Line1 | EXTI_Line17); // ?? EXIT ???? RTC_AlarmCmd(RTC_Alarm_A,DISABLE);//RTC-CR-ALARM ¹ØµôÄÖÖÓ RTC_TIMESET.RTC_H12 = RTC_H12_AM; RTC_TIMESET.RTC_Hours = 0x02; RTC_TIMESET.RTC_Minutes = 0x00; RTC_TIMESET.RTC_Seconds = 0x02; RTC_SetTime(RTC_Format_BIN, &RTC_TIMESET); RTC_SLEEP(); sleeptemp1=1; RTC_ITConfig(RTC_IT_ALRA, ENABLE);//ÖжÏÅäÖà } void RTC_CONFIG(void) { RTC_InitTypeDef RTC_InitStruct; RTC_TimeTypeDef RTC_TIMESET; int LSIFreq=40000; RTC_INT(); RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR,ENABLE);//open the clock PWR_BackupAccessCmd(ENABLE);//POWER OPEN PWR_ClearFlag(PWR_FLAG_WU); RCC_LSICmd(ENABLE);//OPEN LSI /* Wait till LSI is ready */ while (RCC_GetFlagStatus(RCC_FLAG_LSIRDY) == RESET) {} /* Check if the StandBy flag is set */ if (PWR_GetFlagStatus(PWR_FLAG_SB) != RESET) { /* Clear StandBy flag */ PWR_ClearFlag(PWR_FLAG_SB); /* Check if the StandBy flag is cleared */ if (PWR_GetFlagStatus(PWR_FLAG_SB) != RESET) { while(1); } IWDG_ReloadCounter();//FEED WACHDOG RTC_WaitForSynchro(); /* No need to configure the RTC as the RTC config(clock source, enable, prescaler,...) are kept after wake-up from STANDBY */ } else { /* RTC Configuration ******************************************************/ /* Reset Backup Domain */ RCC_BackupResetCmd(ENABLE); RCC_BackupResetCmd(DISABLE); /* Select the RTC Clock Source */ RCC_RTCCLKConfig(RCC_RTCCLKSource_LSI);//4000 /* Enable the RTC Clock */ RCC_RTCCLKCmd(ENABLE); /* Wait for RTC APB registers synchronisation */ RTC_WaitForSynchro(); IWDG_ReloadCounter();//FEED WACHDOG /* Get the LSI frequency: TIM14 is used to measure the LSI frequency */ //LSIFreq = GetLSIFrequency(); RTC_InitStruct.RTC_HourFormat = RTC_HourFormat_24; RTC_InitStruct.RTC_AsynchPrediv = 127; // RTC_InitStruct.RTC_SynchPrediv = (LSIFreq/100) - 1; RTC_InitStruct.RTC_SynchPrediv = 255; RTC_Init(&RTC_InitStruct); /* Set the time to 01h 00mn 00s AM */ RTC_TIMESET.RTC_H12 = RTC_H12_AM; RTC_TIMESET.RTC_Hours = 0x02; RTC_TIMESET.RTC_Minutes = 0x00; RTC_TIMESET.RTC_Seconds = 0x00; IWDG_ReloadCounter();//FEED WACHDOG RTC_SetTime(RTC_Format_BIN, &RTC_TIMESET); } // RTC_DeInit();//³õʼ»¯RTC¸÷¼Ä´æÆ÷Ϊ³õÖµ // // RCC_RTCCLKConfig(RCC_RTCCLKSource_LSI);//4000 RCC_RTCCLKSource_LSI LSI_VALUE RCC_RTCCLKSource_LSI // RCC_RTCCLKCmd(ENABLE);//ENABLE rtc CLOCK } void RTC_INT(void) { EXTI_InitTypeDef EXTI_InitStructure; NVIC_InitTypeDef NVIC_InitStructure;IWDG_ReloadCounter();//FEED WACHDOG /* Configure EXTI Line17(RTC Alarm) to generate an interrupt on rising edge */ EXTI_ClearITPendingBit(EXTI_Line17);//¡¢¡¢RTC_IRQn EXTI_InitStructure.EXTI_Line = EXTI_Line17; EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;//EXTI_Mode_Event EXTI_Mode_Interrupt EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising; EXTI_InitStructure.EXTI_LineCmd = ENABLE; EXTI_Init(&EXTI_InitStructure); IWDG_ReloadCounter();//FEED WACHDOG /* Enable the RTC Interrupt */ NVIC_InitStructure.NVIC_IRQChannel = RTC_IRQn;//TIM17_IRQn NVIC_InitStructure.NVIC_IRQChannelPriority = 1;//NVIC_IRQChannelPriority NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; NVIC_Init(&NVIC_InitStructure); //EXTI_ClearITPendingBit(EXTI_Line0 | EXTI_Line2 | EXTI_Line4 | EXTI_Line1 | EXTI_Line17); // ?? EXIT ???? IWDG_ReloadCounter();//FEED WACHDOG } void RTC_SLEEP(void) { RTC_AlarmTypeDef RTC_AlarmStructure; RTC_TimeTypeDef RTC_TIMESET; RTC_AlarmCmd(RTC_Alarm_A,DISABLE);//RTC-CR-ALARM ¹ØµôÄÖÖÓ IWDG_ReloadCounter();//FEED WACHDOG RTC_GetTime(RTC_Format_BIN, &RTC_TIMESET); RTC_AlarmStructure.RTC_AlarmTime.RTC_H12=RTC_H12_AM;//0 RTC_AlarmStructure.RTC_AlarmTime.RTC_Hours=0x02; RTC_AlarmStructure.RTC_AlarmTime.RTC_Minutes=0x00; // RTC_AlarmStructure.RTC_AlarmTime.RTC_Seconds=( RTC_TIMESET.RTC_Seconds + 0x3b )%60; RTC_AlarmStructure.RTC_AlarmTime.RTC_Seconds=0x02; //¶¨Ê±Ê±¼äÃë IWDG_ReloadCounter();//FEED WACHDOG RTC_AlarmStructure.RTC_AlarmDateWeekDay = 31; RTC_AlarmStructure.RTC_AlarmDateWeekDaySel = RTC_AlarmDateWeekDaySel_Date; RTC_AlarmStructure.RTC_AlarmMask = RTC_AlarmMask_DateWeekDay | RTC_AlarmMask_Hours | RTC_AlarmMask_Minutes; RTC_SetAlarm(RTC_Format_BIN, RTC_Alarm_A, &RTC_AlarmStructure); /* Clear RTC Alarm Flag */ RTC_ClearFlag(RTC_FLAG_ALRAF); RTC_ClearFlag(RTC_FLAG_ALRAF);//alarm flag RTC_ClearFlag(RTC_FLAG_WUTF);//WakeUp Timer flag RTC_ClearITPendingBit(RTC_IT_TS); RTC_ClearITPendingBit(RTC_IT_ALRA); RTC_ClearITPendingBit(RTC_IT_TAMP1); RTC_ClearITPendingBit(RTC_IT_TAMP2); /* Enable RTC Alarm A Interrupt: this Interrupt will wake-up the system from STANDBY mode (RTC Alarm IT not enabled in NVIC) */ RTC_ITConfig(RTC_IT_ALRA, ENABLE); /* Enable the Alarm A */ RTC_AlarmCmd(RTC_Alarm_A, ENABLE); IWDG_ReloadCounter();//FEED WACHDOG /* Clear RTC Alarm Flag */ // RTC_ClearFlag(RTC_FLAG_ALRAF); // EXTI_ClearITPendingBit(EXTI_Line0 | EXTI_Line2 | EXTI_Line4 | EXTI_Line1 | EXTI_Line17); // ?? EXIT ???? // PWR_EnterSTANDBYMode(); // PWR_EnterSTOPMode(PWR_Regulator_ON,PWR_STOPEntry_WFI);//WFI=every interrput PWR_Regulator_LowPower PWR_Regulator_ON } |
|
相关推荐
7个回答
|
|
|
|
|
|
我的目地很简单,就是想用RTC中断,在STOP模式后,称看门狗还没有把程序RESET,先在中断程序里面喂狗,再进入RTC计时后,进STOP模式如此循环?
|
|
|
|
是不是我说得不太清楚,我再说一下我的目的:
1,设置RTC闹钟定时2秒 2,进入STOP状态。 3,到达闹钟时间,进入中断函数,我再次在中断函数里面设置RTC闹钟定时2秒后 4进入STOP状态,… ……………一直循环 |
|
|
|
两个问题:
1、alarm后,是否重新初始化了RTC,如果没有,下一个唤醒时间应该是用当前的RTC秒进行加。 2、可以设置为秒闹钟,其他的不要,如果不能唤醒,看一下下一分钟是否能发生中断,如果能说明RTC闹钟设置不对。 |
|
|
|
TOPCB 发表于 2019-4-17 14:53 ALARM后,我把启动时的代码又重跑了一次,应当是初始化了吧,第一次是能进入中断的,但是进入一次后,再也不进了 |
|
|
|
进入alarm之前,读一下RTC实际的时间是多少。
|
|
|
|
我搞好了,都是那个中断函数里面太多东西了,只要一个清除标志,其它的都不要就OK了
|
|
|
|
你正在撰写答案
如果你是对答案或其他答案精选点评或询问,请使用“评论”功能。
STM32进行DMA数据转运,为什么只有A组最后一位数据被转运到B组去?
1229 浏览 2 评论
1561 浏览 3 评论
1185 浏览 0 评论
嵌入式开发 Win11安装ST-Link 提示 设备描述符请求失败 怎么处理?
1317 浏览 0 评论
1604 浏览 1 评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-8-17 17:31 , Processed in 0.911417 second(s), Total 88, Slave 71 queries .
Powered by 电子发烧友网
© 2015 www.ws-dc.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191