新手入门
- 积分
- 12
- 金钱
- 12
- 注册时间
- 2021-12-22
- 在线时间
- 5 小时
|
10金钱
使用的是正点原子的例子,但是用的是LSI最为时钟源,但是一直复位,不懂为什么,有没有老哥解答一下的,main函数里面有一个打印,上电之后就是一直刷那个打印static void RTC_NVIC_Config(void)
{
NVIC_InitTypeDef NVIC_InitStructure;
EXTI_InitTypeDef EXTI_InitStructure;
NVIC_InitStructure.NVIC_IRQChannel = RTC_IRQn; //RTC諾ÖÖD¶Ï
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 2; //ÏèÕ¼óÅÏè¼¶1λ,′óóÅÏè¼¶3λ
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 2; //ÏèÕ¼óÅÏè¼¶0λ,′óóÅÏè¼¶4λ
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //ê1Äü¸Ãí¨μàÖD¶Ï
NVIC_Init(&NVIC_InitStructure); //¸ù¾YNVIC_InitStructÖDÖ¸¶¨μÄ2Îêy3õê¼»ˉíaéèNVIC¼Ä′æÆ÷
NVIC_InitStructure.NVIC_IRQChannel =RTCAlarm_IRQn;
NVIC_InitStructure.NVIC_IRQChannelCmd =ENABLE;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority =1;
NVIC_InitStructure.NVIC_IRQChannelSubPriority =1;
NVIC_Init(&NVIC_InitStructure);
EXTI_ClearITPendingBit(EXTI_Line17);
EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;
EXTI_InitStructure.EXTI_Line = EXTI_Line17;
EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising;
EXTI_InitStructure.EXTI_LineCmd = ENABLE;
EXTI_Init(&EXTI_InitStructure);
}
//êμê±ê±ÖóÅäÖÃ
//3õê¼»ˉRTCê±Öó,í¬ê±¼ì2aê±ÖóêÇ·ñ1¤×÷Õy3£
//BKP->DR1óÃóú±£′æêÇ·ñμúò»′ÎÅäÖÃμÄéèÖÃ
//·μ»Ø0:Õy3£
//ÆäËû:′íÎó′úÂë
u8 RTC_Init(void)
{
//¼ì2éêÇ2»êÇμúò»′ÎÅäÖÃê±Öó
u8 temp=0;
RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR | RCC_APB1Periph_BKP, ENABLE); //ê1ÄüPWRoíBKPíaéèê±Öó
PWR_BackupAccessCmd(ENABLE); //ê1Äüo󱸼Ä′æÆ÷·ÃÎê
BKP_DeInit(); //¸′λ±¸·YÇøóò
RCC_LSICmd(ENABLE); //éèÖÃía2¿μíËù¾§Õñ(LSE),ê1óÃíaéèμíËù¾§Õñ
while (RCC_GetFlagStatus(RCC_FLAG_LSIRDY) == RESET) //¼ì2éÖ¸¶¨μÄRCC±ê־λéèÖÃóë·ñ,μè′yμíËù¾§Õñ¾íD÷
{
temp++;
delay_ms(10);
}
if(temp>=250)return 1;//3õê¼»ˉê±Öóê§°ü,¾§ÕñóDÎêìa
RCC_RTCCLKConfig(RCC_RTCCLKSource_LSI); //éèÖÃRTCê±Öó(RTCCLK),Ñ¡ÔñLSE×÷ÎaRTCê±Öó
RCC_RTCCLKCmd(ENABLE); //ê1ÄüRTCê±Öó
RTC_WaitForLastTask(); //μè′y×î½üò»′ζÔRTC¼Ä′æÆ÷μÄD′2ù×÷íê3é
RTC_WaitForSynchro(); //μè′yRTC¼Ä′æÆ÷í¬2½
RTC_ITConfig(RTC_IT_SEC|RTC_IT_ALR, ENABLE); //ê1ÄüRTCÃëÖD¶ÏoíÄÖÖóÖD¶Ï
RTC_WaitForLastTask(); //μè′y×î½üò»′ζÔRTC¼Ä′æÆ÷μÄD′2ù×÷íê3é
RTC_EnterConfigMode();/// ÔêDíÅäÖÃ
RTC_SetPrescaler(39999); //éèÖÃRTCÔ¤·ÖÆμμÄÖμ
RTC_WaitForLastTask(); //μè′y×î½üò»′ζÔRTC¼Ä′æÆ÷μÄD′2ù×÷íê3é
RTC_SetCounter(0); //??????0s
/* Wait until last write operation on RTC registers has finished */
RTC_WaitForLastTask();
//????WORK_TIMES
RTC_SetAlarm(10);
RTC_WaitForLastTask();
RTC_WaitForSynchro();
RTC_ExitConfigMode(); //íË3öÅäÖÃÄ£ê½
RTC_NVIC_Config();//RCTÖD¶Ï·Ö×ééèÖÃ
printf("Time is =%d \r\n",RTC_GetCounter()); //???????
return 0; //ok
}
//RTCê±ÖóÖD¶Ï
//ÿÃë′¥·¢ò»′Î
extern int count;
void RTC_IRQHandler(void)
{
if(RTC_GetITStatus(RTC_IT_SEC)!=RESET)
{
printf("Time is =%d \r\n",RTC_GetCounter()); //???????
}
RTC_ClearITPendingBit(RTC_IT_OW|RTC_IT_SEC);
RTC_WaitForLastTask();
}
//ÄÖÖóÖD¶Ï
void RTCAlarm_IRQHandler(void)
{
if(RTC_GetITStatus(RTC_IT_ALR) != RESET)
{
printf("THE ALARM READY =%d \r\n",RTC_GetCounter());//???????
RTC_ClearITPendingBit(RTC_IT_ALR);
PWR_BackupAccessCmd(ENABLE);
RTC_EnterConfigMode();
RTC_WaitForLastTask();
RTC_SetAlarm(10+RTC_GetCounter()); //???????40s?
RTC_WaitForLastTask();
RTC_ExitConfigMode();
PWR_BackupAccessCmd(DISABLE);
}
EXTI_ClearITPendingBit(EXTI_Line17);
RTC_WaitForLastTask();
RTC_ClearITPendingBit(RTC_IT_ALR);
RTC_WaitForLastTask();
}
|
|