0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

一文搞懂Cortex-A9 RTC(下)

jf_78858299 来源:土豆居士 作者:土豆居士 2023-05-26 15:21 次阅读

2. 操作滴答定时器

TICNT

图片

TICNT

RTC计时器是一个递增计数器,并引发计时中断。TICNT寄存器包含32位目标计数值,并且CURTICCNT寄存器包含32位当前计时计数。如果当前滴答数达到TICNT中指定的目标值时,计时中断发生。

一秒钟计数的次数,由RTCCON[7:4]即TICCKSEL位决定:

图片

TICCKSEL

因为我们的晶振频率也是32768,为方便计数,所以我们设置RTCCON[7:4]为0,开启滴答计时器需要设置RTCCON[8]位1:

图片

TICEN

代码如下:

RTCCON = RTCCON & (~(0xf << 4)) | (1 << 8);
 TICCNT = 32768;

3. 操作ALARM闹钟

RTCALM

图片RTCALM寄存器控制报警功能的启用和报警时间。请注意,RTCALM寄存器在断电模式下将同时生成ALARM_INT和ALARM_WK信号,但在正常模式下仅生成ALARM_INT信号。设置ALMEN[6]为1以产生ALARM_INT和ALARM_WK信号。

「举例:」

比如我们想每个小时的25分58秒产生一个中断信号,那我们需要设置RTCALM[1]、RTCALM[0]为1,同时设置RTCALM[6]为1以开启alarm功能,然后将BCD格式的时间设置到寄存器ALMSEC、ALMMIN。

代码如下:

RTCALM.ALM = (1 << 6)|(1 << 0)|(1 << 1);//使能bite:MINEN、SECEN
 RTCALM.SEC = 0x58;
 RTCALM.MIN = 0x25;  //每小时25:58产生一次中断

alarm功能设置闹钟时间寄存器如下:

图片图片图片图片图片图片寄存器操作,采用BCD格式。

五、完整代码实现

滴答计时器和alarm闹钟会产生内部中断信号,所以我们必须给这两个中断信号进行中断相关的初始化,并在中断处理函数中增加相应的处理代码。

中断号

参考datasheet 9.2.2 GIC Interrupt Table

图片

rtc中断号

关于中断的初始化的寄存器配置,我们可以参考《11. 从0开始学ARM-基于Exynos4412中断详解、key程序编写》

区别是,key连接在了第一级中断控制器,而rtc的这两个中断则没有。清中断需要设置的寄存器如下:

「滴答计时器清中断:」

RTCINTP  = RTCINTP | (1 << 0);
//清GIC中断标志位
ICDICPR.ICDICPR2 = ICDICPR.ICDICPR2 | (0x1 << 13);
//清cpu中断标志位
CPU0.ICCEOIR = CPU0.ICCEOIR&(~(0x3ff))|irq_num;

「alarm计时器清中断:」

RTCINTP  = RTCINTP | (1 << 1);
//清GIC中断标志位
ICDICPR.ICDICPR2 = ICDICPR.ICDICPR2 | (0x1 << 12);
//清cpu中断标志位
CPU0.ICCEOIR = CPU0.ICCEOIR&(~(0x3ff))|irq_num;

「滴答计时器中断初始化:」

void rtc_tic(void)
{
 RTCCON = RTCCON & (~(0xf << 4)) | (1 << 8);
 TICCNT = 32768;
 ICDDCR = 1;  //使能分配器
 ICDISER.ICDISER2 = ICDISER.ICDISER2 | (0x1 << 13); //使能相应中断到分配器
 ICDIPTR.ICDIPTR19 = ICDIPTR.ICDIPTR19 & (~(0xff << 8))|(0x1 << 8); //选择CPU接口
 CPU0.ICCPMR = 255; //中断屏蔽优先级
 CPU0.ICCICR = 1;   //使能中断到CPU
}

「alarm初始化」

void rtc_alarm(void)
{
 RTCALM.ALM = (1 << 6)|(1 << 0)|(1 << 1);
 RTCALM.SEC = 0x58;
 RTCALM.MIN = 0x25;  //每小时25:58产生一次中断
 ICDDCR = 1;    //使能分配器
  //使能相应中断到分配器
 ICDISER.ICDISER2 = ICDISER.ICDISER2 | (0x1 << 12);
 //选择CPU接口
 ICDIPTR.ICDIPTR19 = ICDIPTR.ICDIPTR19 & (~(0xff << 0))|(0x1 << 0); 
 CPU0.ICCPMR = 255; //中断屏蔽优先级
 CPU0.ICCICR = 1;   //使能中断到CPU
}

「中断处理函数」

void do_irq(void)
{
 static int a = 1;
 int irq_num;
 irq_num = CPU0.ICCIAR&0x3ff;  //获取中断号
 switch(irq_num)
 {
  case 57: //按键key
   printf("in the irq_handler\\n");
   //清GPIO中断标志位
   EXT_INT41_PEND = EXT_INT41_PEND |((0x1 << 1)); 
   //清GIC中断标志位
   ICDICPR.ICDICPR1 = ICDICPR.ICDICPR1 | (0x1 << 25); 
  break;
  case 76:
   printf("in the alarm interrupt!\\n");
   RTCINTP  = RTCINTP | (1 << 1);
   //清GIC中断标志位
   ICDICPR.ICDICPR2 = ICDICPR.ICDICPR2 | (0x1 << 12); 
  break;
  case 77:
   printf("in the tic interrupt!\\n");
   RTCINTP  = RTCINTP | (1 << 0);
    //清GIC中断标志位
   ICDICPR.ICDICPR2 = ICDICPR.ICDICPR2 | (0x1 << 13);
   break;
 }
 //清cpu中断标志位
 CPU0.ICCEOIR = CPU0.ICCEOIR&(~(0x3ff))|irq_num; 
}

「其他代码:」

void rtc_init(void)
{
 RTCCON = 1;//使能RTC控制写功能
 RTC.BCDYEAR = 0x20;// 20201111日, 15:24:50.以BCD码格式写入
 RTC.BCDMON = 0x11;
 RTC.BCDDAY = 0x11;
 RTC.BCDHOUR = 0x15;
 RTC.BCDMIN = 0x24;
 RTC.BCDSEC = 0x50;
 RTCCON = 0;//关闭RTC控制写功能
}
int main (void)
{     rtc_init();
  rtc_alarm();
  rtc_tic();
  //每隔一秒打印以下当前时间
  while(1)
  {
   printf("%x-%x-%x %x:%x:%x\\n",RTC.BCDYEAR,
   RTC.BCDMON,
   RTC.BCDDAY,
   RTC.BCDHOUR,
   RTC.BCDMIN,RTC.BCDSEC);
   delay_ms(1000);
  }
}
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 集成电路
    +关注

    关注

    5321

    文章

    10732

    浏览量

    353391
  • 嵌入式系统
    +关注

    关注

    40

    文章

    3430

    浏览量

    128221
  • 时钟芯片
    +关注

    关注

    2

    文章

    229

    浏览量

    39577
  • RTC
    RTC
    +关注

    关注

    2

    文章

    484

    浏览量

    65440
收藏 人收藏

    评论

    相关推荐

    Cortex-A9处理器的精妙应用

    卡片电脑等等。并且通过开发板内的资料文档可快速开发产品,缩短研发周期。 Cortex-A9代表——Rayeager PX2开发板 、微结构  1.Cortex-A9两种微架构  可扩展
    发表于 11-03 17:02

    Cortex-A9处理器的精妙应用-Rayeager PX2 开发板详解

    播放机,家用网关以及卡片电脑等等。并且通过开发板内的资料文档可快速开发产品,缩短研发周期。 Cortex-A9代表——Rayeager PX2开发板 、微结构1.Cortex-A9两种微架构可扩展
    发表于 01-27 11:00

    求ucosii 移植到cortex-A9教程

    想要把ucosii移植到cortex-A9上,因为水平有限,希望有人帮忙,我们用的是DS-5软件进行移植,最好是有个工程!!谢谢!!!
    发表于 10-13 15:43

    嵌入式系统开发发展方向和ARM Cortex-A9体系架构

    和iPad实际上都是基于Coretex-A8核心,而近来发展方兴未艾的Smartbook智能本基本上 也都是这架构处理器的应用产品。   Cortex-A9将继续这路线,由于从
    发表于 08-17 02:52

    AM4379 Cortex-A9试用体验

    (1)【创龙AM4379 Cortex-A9试用体验】+ 開發板第次觸電【创龙AM4379 Cortex-A9试用体验】搭建Linux开发环境【创龙AM4379 Cortex-A9
    发表于 08-29 17:45

    ARM Cortex-A9的具体开发流程有哪些

    Linux的常用命令该怎样去使用呢?ARM Cortex-A9的具体开发流程有哪些?ARM Cortex-A9的开发流程与51的有什么不同?
    发表于 11-12 07:53

    双内核Cortex-A9处理器设计实现

    类别:嵌入式系统处理器知识产权许可商ARMHoldingsplc已经成功开发出双内核Cortex-A9处理器设计(被称为Osprey)的两个实现。Cortex-A9处理器能与其他Cortex系列
    发表于 12-13 06:03

    cortex-A9的核心板为什么还需使用个STM8的单片机呢

    cortex-A9的核心板,底板为什么还需使用个STM8的单片机,是为了加载程序吗?谢谢
    发表于 06-06 16:16

    Cortex-A9数据处理引擎技术参考手册

    Cortex-A9数据处理引擎技术参考手册
    发表于 08-02 11:37

    Cortex-A9 MPCore 技术参考手册

    Cortex-A9 MPCore技术参考手册
    发表于 08-02 18:22

    Cortex-A9处理器技术参考手册

    Cortex-A9处理器是款高性能、低功耗的ARM宏单元,具有L1缓存子系统,可提供完整的虚拟内存功能。Cortex-A9处理器实现ARMv7-A架构,在Jazelle®状态
    发表于 08-02 16:29

    ARM Cortex-A9 MPCore 测试芯片技术手册

    ARM Cortex-A9 MPCore 测试芯片技术手册
    发表于 08-02 19:07

    Cortex-A9技术参考手册

    Cortex-A9处理器是款高性能、低功耗的ARM宏单元,具有提供完整虚拟内存功能的级高速缓存子系统。 Cortex-A9处理器实现ARMv7-
    发表于 08-17 06:53

    cortex-a9是什么处理器_cortex-a9处理器介绍

    本文首先介绍了cortex-a9是什么处理器,其次介绍了cortex-a9处理器的单核与多核,最后阐述了cortex-a9处理器的特点及优势。
    发表于 04-18 16:41 2.5w次阅读

    一文搞懂Cortex-A9 RTC(上)

    RTC是集成电路,通常称为时钟芯片。在一个嵌入式系统中,通常采用RTC来提供可靠的系统时间,包括时分秒和年月日等,而且要求在系统处于关机状态下它也能正常工作(通常采用后备电池供电)。 它的外围
    的头像 发表于 05-26 15:11 1143次阅读
    一文<b class='flag-5'>搞懂</b><b class='flag-5'>Cortex-A9</b> <b class='flag-5'>RTC</b>(上)