rtc时钟系统里还有闹钟发生器,通过程序员自己设置,每隔一段时间就产生中断程序一次。
本章使用的寄存器地址在上一章已经说明过(基地址加偏移量)
RTC时钟的闹钟需要借助中断的方法来完成,中断的使用方面以及相应的函数设置我们在以前的文章中已经详细地说过,这里不再赘述。
//alarm使能函数,使能alarm
void rtc_set_alarm(void)
{
(*((volatile unsigned long *)(RTC_BASE + 0x54))) = num_to_bcd(14);
//RTCALM有很多使能位,可以使能年月日时分秒等情况
//bit6是全局使能位 bit1是“分”使能位
//设置RTCALM的各个位。
(*((volatile unsigned long *)(RTC_BASE + 0x50))) |= 1<<0;
(*((volatile unsigned long *)(RTC_BASE + 0x50))) |= 1<<6;
}
void isr_rtc_alarm(void)
{
static int a = 0;
printf("rtc alarm, a = %d...", a++);
(*((volatile unsigned long *)(RTC_BASE + 0x30))) |= (1<<1);
//清除中断处理函数的地址
VIC0ADDR = 0;
VIC1ADDR = 0;
VIC2ADDR = 0;
VIC3ADDR = 0;
}
int main(void)
{
uart_init();
system_init_exception();
rtc_set_alarm();
intc_setvectaddr(NUM_RTC_ALARM, isr_rtc_alarm);
intc_enable(NUM_RTC_ALARM);
struct rtc_time aa;
while (1)
{
rtc_get_time(&aa);
printf("The time is: %d.",aa.second);
volatile int i, j;
for (i=0; i<10000; i++)
for (j=0; j<1000; j++);
printf("-------");
}
}
这个时间设定的意义是,在每分钟的第14秒产生一次闹钟中断,只借助硬件的话,只能设置一个闹钟,如果想设置多个闹钟,也可以通过软件的方式来设置。