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寄存器操作完成
}
其中_alarm_obj的结构体定义如下:
//闹钟结构体
__packed typedef struct
{
u8 weekmask; //闹钟响铃掩码
u8 ringsta; //闹铃状态及铃声标志.
//[7]:0,无闹铃;1,闹铃中;
//[6:3]:保留
//[2:0]:闹钟铃声类型
u8 hour; //闹铃小时
u8 min; //闹铃分钟
u8 saveflag; //保存标志,0X0A,保存过了;其他,还从未保存
}_alarm_obj;
这个也没太看懂。。。
我想问就是如果设置10S后闹钟 是不是
RTC->ALRH=0;
RTC->ALRL=10;就可以了啊 如果 设置12:10分闹铃怎么办呢
设置时间有RTC_Set(2009,12,2,10,0,55)函数如果闹铃也有一个类似功能函数就好了,那有没有可以MINI板跑起来的闹铃程序啊,学习一下,