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->CRH|=0X01; //允许秒中断
RTC->CRH|=0X02; //允许闹钟断
u8 RTC_Init(void)
{
//检查是不是第一次配置时钟
u8 temp=0;
u32 curtime=0; //获取当前的秒钟数
if(BKP->DR1!=0X5050)//第一次配置
{
RCC->APB1ENR|=1<<28; //使能电源时钟
RCC->APB1ENR|=1<<27; //使能备份时钟
PWR->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; //允许闹钟中断
// EXTI->IMR|=1<<17;
// EXTI->RTSR|=1<<17;
/******************************************/
while(!(RTC->CRL&(1<<5)));//等待RTC寄存器操作完成
RTC->CRL|=1<<4; //允许配置
RTC->RLH=0X0000;
RTC->RLL=32767; //时钟周期设置(有待观察,看是否跑慢了?)理论值:32767
RTC_Set(2012,9,7,13,16,55); //设置时间
/*************添加*******************************/
curtime=RTC->CNTH;//得到计数器中的值(秒钟数)
curtime<<=16;
curtime+=RTC->CNTL;
curtime += 30;
RTC->ALRL=curtime&0xffff;
RTC->ALRH=curtime>>16; //测试30秒后闹铃测试
/********************************************/
RTC->CRL&=~(1<<4); //配置更新
while(!(RTC->CRL&(1<<5))); //等待RTC寄存器操作完成
BKP->DR1=0X5050;
printf("FIRST TIME ");
}
else//系统继续计时
{
while(!(RTC->CRL&(1<<3)));//等待RTC寄存器同步
RTC->CRH|=0X01; //允许秒中断
RTC->CRH|=0X02; //允许闹钟中断
// EXTI->IMR|=1<<17;
// EXTI->RTSR|=1<<17;
while(!(RTC->CRL&(1<<5)));//等待RTC寄存器操作完成
printf("OK ");
}
MY_NVIC_Init(0,0,RTC_IRQChannel,2);//优先级设置
RTC_Get();//更新时间
return 0; //ok
}
void RTC_IRQHandler(void)
{
u32 curtime=0; //获取当前的秒钟数
if(RTC->CRL&0x0001)//秒钟中断
{
RTC_Get();//更新时间
//printf("sec:%d ",calendar.sec);
}
if(RTC->CRL&0x0002)//闹钟中断
{
curtime=RTC->CNTH;//得到计数器中的值(秒钟数)
curtime<<=16;
curtime+=RTC->CNTL;
curtime += 30;
RTC->CRL&=~(0x0002); //清闹钟中断
//printf("Alarm! ");
LED1=!LED1;
RTC->CRL|=1<<4; //允许配置
RTC->ALRL=curtime&0xffff;
RTC->ALRH=curtime>>16;
RTC->CRL&=~(1<<4);//配置更新
}
RTC->CRL&=0X0FFA; //清除溢出,秒钟中断标志
while(!(RTC->CRL&(1<<5)));//等待RTC寄存器操作完成
}
---------------------------------
请参考战舰板的综合实验,有闹钟实现。
一周热门 更多>