[学习笔记] 寄存器学习之rtc

[复制链接]
 楼主| JasonLee27 发表于 2020-10-16 16:55 | 显示全部楼层 |阅读模式
硬件环境:AC7801x 通用开发板  ATC-LINK
软件环境:keil 5.23


最近都比较忙,所以先挑了几个简单的模块,AC7801x的RTC模块其实就有由一个预分频器+一个计数器组成,再简单点说,可以理解为两个定时器级联组成,预分频器的计数溢出作为计数器的计数时钟源,同时也可以产生预分频器溢出中断。

RTC相比普通的Timer还有的一个区别就是,RTC可以选择时钟源,可以选择外部晶振,系统时钟,内部32K时钟,或者外部RTCIN的输入时钟。在选择后两者时,RTC模块可以在stop以及standby模式下继续工作,产生的中断可以作为唤醒源唤醒芯片。

我们设置RTC选择内部32K时钟源,预分频器设置31999,这样预分频器便1s产生一次中断,同时设置计数器为5,即5s产生一次中断,在中断中设置两个标志位,main函数中设置LED在1s的flag中翻转,CAN报文在5s flasg中发送。

  1. void RTC_IRQHandler(void)
  2. {
  3.     uint32_t value;
  4.     value = RTC->SC;
  5.     if (value & (1 << 7))    ///<P interrupt
  6.     {
  7.         g_rtc5sFlag = 1;
  8.     }
  9.     if (value & (1 << 17))    ///<P interrupt
  10.     {
  11.         g_rtc1sFlag = 1;
  12.     }
  13.     RTC->SC = value;    ///<clear flag
  14. }

  15. void Rtc_Init(void)
  16. {
  17.     CKGEN->PERI_CLK_EN_0 |= CKGEN_PERI_CLK_EN_0_RTC_EN_Msk;    ///<RTC clock en
  18.     CKGEN->PERI_SFT_RST0 |= CKGEN_PERI_SFT_RST0_SRST_RTC_Msk;
  19.    
  20.     RTC->MOD = 5;       ///<Set 5s triger a interrupt
  21.    
  22.     RTC->PS = 31999;    ///<count 1 per second
  23.    
  24.     RTC->SC = 1 << 16 | 1 << 14 | 1 << 6;  ///<internal 32K RC as clock source , enable interrupt
  25.    
  26.     NVIC_EnableIRQ(RTC_IRQn);
  27. }



rtc.rar (695.5 KB, 下载次数: 2)
BettyBerry 发表于 2020-10-18 21:24 | 显示全部楼层
谢谢分享 RTC的使用确实会比timer来得更加有效率且方便课读
喷水壶 发表于 2020-10-22 11:12 | 显示全部楼层
谢谢分享【寄存器学习之rtc】
向日葵的武士 发表于 2020-10-27 16:41 | 显示全部楼层
谢谢楼主分享
ADZ2016 发表于 2020-10-28 10:13 | 显示全部楼层
谢谢楼主分享
powermaker2568 发表于 2020-10-28 10:14 | 显示全部楼层
学习学习
carefull3357dc 发表于 2020-10-28 10:19 | 显示全部楼层
学习学习!感谢分享
您需要登录后才可以回帖 登录 | 注册

本版积分规则

66

主题

415

帖子

12

粉丝
快速回复 在线客服 返回列表 返回顶部