u8 RTC_Init(void)
{
//检查是不是第一次配置时钟
u8 temp=0;
if(BKP->DR1==0X5050)//第一次配置
{
RCC->APB1ENR|=1<<28; //使能电源时钟
RCC->APB1ENR|=1<<27; //使能备份时钟
 WR->CR|=1<<8; //取消备份区写保护
RCC->BDCR|=1<<16; //备份区域软复位
RCC->BDCR&=~(1<<16); //备份区域软复位结束
RCC->BDCR|=1<<0; //开启外部低速振荡器
while((!(RCC->BDCR&0X02))&&temp<250)//等待外部时钟就绪
{
temp++;
delay_ms(10);
};
if(temp>=250)return 1;//初始化时钟失败,晶振有问题
RCC->BDCR|=1<<8; //LSI作为RTC时钟
RCC->BDCR|=1<<15;//RTC时钟使能
while(!(RTC->CRL&(1<<5)));//等待RTC寄存器操作完成
while(!(RTC->CRL&(1<<3)));//等待RTC寄存器同步
RTC->CRH|=0X01; //允许秒中断
RTC->CRH|=0X02; //允许闹钟中断
while(!(RTC->CRL&(1<<5)));//等待RTC寄存器操作完成
RTC->CRL|=1<<4; //允许配置
RTC->RLH=0X0000;
RTC->RLL=32767; //时钟周期设置(有待观察,看是否跑慢了?)理论值:32767
// Auto_Time_Set(); //获取当前编译时间
RTC_Set(1970,1,1,0,0,30);
RTC->ALRH=0; //设置闹钟值
RTC->ALRL=60;
//RTC_Set(2009,12,2,10,0,55); //设置时间
RTC->CRL&=~(1<<4); //配置更新
while(!(RTC->CRL&(1<<5))); //等待RTC寄存器操作完成
BKP->DR1=0X5050;
//BKP_Write(1,0X5050);;//在寄存器1标记已经开启了
//printf("FIRST TIME
");
}else//系统继续计时
{
while(!(RTC->CRL&(1<<3)));//等待RTC寄存器同步
RTC->CRH|=0X01; //允许秒中断
RTC->CRH|=0X02; //允许闹钟中断
while(!(RTC->CRL&(1<<5)));//等待RTC寄存器操作完成
//printf("OK
");
}
EXTI->IMR|=1<<17; //开启线17中断,连接到RTC闹钟事件
MY_NVIC_Init(0,0,RTC_IRQChannel,2);//RTC,G2,P2,S2.优先级最低
RTC_Get();
return 0; //ok
}
void RTC_IRQHandler(void)
{
if(RTC->CRL&0X0001)
{
RTC_Get();//更新时间
}
if(RTC->CRL&0X0002)
{ LED1=0;
RTC->CRL&=~(0X0002);
}
RTC->CRL&=0X0FFA; //清除溢出,秒钟中断标志
while(!(RTC->CRL&(1<<5)));//等待RTC寄存器操作完成
}
设置了EXTI 17为什么也不行呢??? 搞了很久就是不能进入闹钟中断呀???
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
---------------------------------
你搞出来了吗?我闹钟也进不了中断
---------------------------------
综合试验的闹钟没有实现。
---------------------------------
实现了的,你买了我们开发板就可以测试下。
---------------------------------
买的你们开发板,可以确定没实现,不过已经解决了。
因为:那个代码里面没有开启RTC闹钟中断呀!
RTC_ITConfig(RTC_IT_SEC, ENABLE); //RTC_Init ( );代码里面只开启了秒中断,
//并没有开启闹钟中断
RTC_Init ( )里面改为:RTC_ITConfig(RTC_IT_SEC|RTC_IT_ALR, ENABLE);就可以了
一周热门 更多>