void calendar_alarm_init(_alarm_obj *alarmx)
{
u32 curtime=0;
u32 temptime=0;
u32 destime=0XFFFFFFFF;//目标闹铃时间(s)设定到最大 为什么 设置最大啊
if(alarmx->weekmask)//必须要有闹钟存在,周日到周六任意一天
{
curtime=RTC->CNTH;//得到计数器中的值(秒钟数)
curtime<<=16;
curtime+=RTC->CNTL;
//取一个与当前时间最接近的值作为闹钟寄存器的内容
temptime=curtime/86400; //得到当前运行天数(此处没有用到天数,仅作说明用)
temptime=temptime*86400;
temptime+=(u32)alarmx->hour*3600+(u32)alarmx->min*60;//得到秒钟数
if(temptime<=curtime)temptime+=86400;//执行时间已过,推迟到明天
destime=temptime;//更改闹钟寄存器
}
RCC->APB1ENR|=1<<28;//使能电源时钟
RCC->APB1ENR|=1<<27;//使能备份时钟
PWR->CR|=1<<8; //取消备份区写保护
//上面三步是必须的!
RTC->CRL|=1<<4; //允许配置
RTC->ALRL=destime&0xffff; 什么意思
RTC->ALRH=destime>>16; 不懂
RTC->CRL&=~(1<<4);//配置更新
while(!(RTC->CRL&(1<<5)));//等待RTC寄存器操作完成
}
这 程序什么套路 |