1. RTC 滴答计时器
1.1 寄存器配置
RTCCON RTC控制寄存器
[7:4] = 0000 设置频率
[8] = 1 使能滴答计时器
TICNT
32位滴答时间计数值。
滴答计时器是一个上行计数器。如果当前的滴答数达到这个值,滴答时间中断发生。
备注:该值必须大于3
周期= (n + 1)/滴答时钟源频率
(n =滴答计数器值)
rtc_tic----main.c
#include"exynos_4412.h"
#include"uart.h"
//rtc作为滴答定时器使用
/*
* 滴答计时器初始化
* 参数:tic :滴答时钟计数 32768HZ 输入
* 初始化完成后自动开始
*/
void rtc_tic_init(unsigned int tic)
{
//设置寄存器RTCCON[7:4]位,设置滴答计时器子时钟源选择,
//这里设置为0000,及时钟源为32.768KHz
RTCCON = RTCCON & (~(0xF << 4));
//设置寄存器RTCCON[8]位置1,滴答计时器使能
RTCCON = RTCCON | (0x1 << 8);
//配置TICCNT寄存器,这里设置为32.768KHz,1s发生一次中断
//周期= (n + 1)/滴答时钟源频率
//(n =滴答计数器值)
TICCNT = tic;
//GIC 面向中断源
//开启总中断
ICDDCR = ICDDCR | 0x1;
//配置端口中断使能
ICDISER.ICDISER2 = ICDISER.ICDISER2 | (0x1 << 13);
//配置端口优先级 优先级设置为5 rtc_alarm 中断id 77
ICDIPR.ICDIPR19 = ICDIPR.ICDIPR19 & (~(0xFF << 8)) | (5 << 8);
//配置中断源送去哪个cpu处理 0x1表示直送cpu0
ICDIPTR.ICDIPTR19 = ICDIPTR.ICDIPTR19 & (~(0xFF << 8)) | (0x1 << 8);
//GIC 面向cpu
//cpu响应中断使能 =1 使能 =0 不使能
CPU0.ICCICR = CPU0.ICCICR | 0x1;
//配置cpu过滤优先级
CPU0.ICCPMR = CPU0.ICCPMR | 255;
}
void rtc_tic_interrupt_clear(void)
{
RTCINTP = RTCINTP | (0x1 << 0); //清RTC中断标志位
ICDICPR.ICDICPR2 = ICDICPR.ICDICPR2 | (0x1 << 13); //清除GIC中断标志位
}
void do_irq(void)
{
unsigned int irq_num;
irq_num = CPU0.ICCIAR & 0x3FF; //获取中断号
switch(irq_num)
{
case 77:
rtc_tic_interrupt_clear();
printf("rtc_tic time interrupt!\r\n");
break;
}
//最后清除cpu中断挂起
//写入中断id清除对应中断挂起
CPU0.ICCEOIR = irq_num;
}
int main()
{
int a = 100;
uart_init();
printf("hello!a=%d\r\n",a);
//周期= (n + 1)/滴答时钟源频率
//(n =滴答计数器值)
rtc_tic_init(32767);
while(1);
return 0;
}