中级会员
 
- 积分
- 217
- 金钱
- 217
- 注册时间
- 2013-10-25
- 在线时间
- 44 小时
|
在写闹钟中断的时候与到这个问题,看了原子哥战舰版综合试验的例程。对于这问题,我也困惑了很久!
这个帖子也提及过:http://www.openedv.com/posts/list/9985.htm,代码中没有设置闹钟中断,也没有闹钟中断服务程序,只有秒中断设置和秒中断服务程序,但闹钟还是被执行了。
寄存器RTC_CRL,ALRF:闹钟标志 (Alarm flag)
当32位可编程计数器达到RTC_ALR寄存器所设置的预定值,此位由硬件置’1’。如果RTC_CRH寄存器中ALRIE=1,则产生中断。此位只能由软件清’0’。对此位写’1’是无效的。
是不是可以理解成:即使不设置“允许闹钟中断”,中断标志位也可以被置“1”,因为例程中也没有执行闹钟中断,只是执行了秒中断,在执行秒中断时,执行了
if(RTC->CRL&0x0002)//闹钟中断
{
RTC->CRL&=~(0x0002); //清闹钟中断
if(alarm.weekmask&(1<<calendar.week))
{
alarm.ringsta|=1<<7;//标记为闹铃状态.
//printf("Alarm!\n");
}
calendar_alarm_init(&alarm);//重新设置下一次闹铃
}
这条判断语句,所以当32位可编程计数器达到RTC_ALR寄存器所设置的预定值,此位由硬件置’1’,if()就会被执行。这样闹钟程序就会被执行。
不知是否可以这样理解,贴出来,看看大家的看法。
|
|