查看: 1543|回复: 0

Atmel SAM4S学习笔记(七)——实时定时器 (RTT)

[复制链接]
  • TA的每日心情
    慵懒
    2016-10-17 12:07
  • 签到天数: 306 天

    连续签到: 1 天

    [LV.8]以坛为家I

    发表于 2014-11-27 16:48:39 | 显示全部楼层 |阅读模式
    分享到:
    RTT(Real-time Timer)是一个32位的计时器,对可编程的16位的预分频器(时钟源来自32KHz的慢速时钟)的反转进行统计。RTT可以周期的产生中断和/或设定触发值报警。RTT也可以配置采用来自RTC(实时时钟)1Hz的信号,可以用1Hz的信号产生定时。为了降低功耗,RTT不需要使用的时候可以完全禁止。
    RTT嵌入式特征:
    32位自由运行的计数器时钟源来自预分频的慢速时钟源或者1Hz带校准的RTC时钟源。
    16位可配置的预分频器
    中断报警
    框架图如图7-1所示



    下面是RTT 的寄存器表(如图7-2所示)



    RTT_MR(模式寄存器):只要是对分频器、中断警告等一些功能的设置。
    RTT_AR(警报寄存器):设置的报警值(CRTV+1)和实时定时器值的比较。
      注:当RTT_AR上写入新的数值的时候,必须禁止掉警报寄存器。
    RTT_VR(数值寄存器):实时计数的数值。
    RTT_SR(状态寄存器):
      bit 0:ALMS(实时时间状态)
       bit 1:RTTINC (预分频器翻转状态)
    bit2-bit31 为保留为。
    详细内容请查看数据手册(289页)
    RTT功能描述
    RTT(实时定时器)是一个32位的计数器来计算从某一时刻到某一时刻经历的时间。RTT可以采用可配置的16位预分频时钟源,分频值可以用RTT_MR中的bit8-bit15  RTPRES来设置分频值。
    设置RTPRES的值为0x800(默认值),相当于给实时定时器一个1Hz的信号(如果慢速时钟为32.768KHz)。32位的计数器可以计数到2的32次方秒,然后翻转到0,相当于136年。
    实时定时器的值(CRTV)在RTT_VR寄存器中,可以说随时读取。
    计数器当前值会与设置的RTT_AR寄存器中的值做比较,当两值相等时,则RTT_SR寄存器中的SLM位被置位(1)。复位(0)后,RTT_AR中的值将变为0xFFFFFFFF。
    如若不使用RTT,可以将RTT_MR寄存器的RTTDIS设置为1,降低功耗。
    下面就来简单了写一个例子,来控制板子上的LED亮灭
    #include "sam4sd32c.h"#include "rtt.h"int main (void){        uint32_t ul_previous_time;        SystemInit();        PIOC-&gtIO_PER  = (uint32_t)0x00800000;        PIOC-&gtIO_OER  = (uint32_t)0x00800000;        PIOC-&gtIO_OWER = (uint32_t)0x00800000;        PIOC-&gtIO_CODR = (uint32_t)0x00800000;        rtt_sel_source(RTT, false);        rtt_init(RTT, 32768);        ul_previous_time = rtt_read_timer_value(RTT);        while (ul_previous_time == rtt_read_timer_value(RTT));        /* 使能 RTT 中断 */        NVIC_DisableIRQ(RTT_IRQn);        NVIC_ClearPendingIRQ(RTT_IRQn);        NVIC_SetPriority(RTT_IRQn, 0);        NVIC_EnableIRQ(RTT_IRQn);        rtt_enable_interrupt(RTT, RTT_MR_RTTINCIEN);        while(1);}void RTT_Handler(){        uint32_t ul_status;        /* Get RTT status */        ul_status = rtt_get_status(RTT);        /* 时间改变,关闭LED */        if ((ul_status & RTT_SR_RTTINC) == RTT_SR_RTTINC) {                PIOC-&gtIO_CODR = (uint32_t)0x00800000;        }        /* 开启LED */        if ((ul_status & RTT_SR_ALMS) == RTT_SR_ALMS) {                PIOC-&gtIO_SODR = (uint32_t)0x00800000;          }}<br>Atmel SAM4S Xplained pro学习笔记(一)-- 开发套件介绍
    Atmel SAM4S 学习笔记(二)-- 开发环境搭建
    Atmel SAM4S 学习笔记(三)-- 示例代码分析
    Atmel SAM4S学习笔记(四)——ASF详解
    Atmel SAM4S学习笔记(五)——GPIO
    Atmel SAM4S学习笔记(六)--CHIPID(芯片编号)
    回复

    使用道具 举报

    您需要登录后才可以回帖 注册/登录

    本版积分规则

    关闭

    站长推荐上一条 /2 下一条

    手机版|小黑屋|与非网

    GMT+8, 2024-4-26 14:40 , Processed in 0.112933 second(s), 17 queries , MemCache On.

    ICP经营许可证 苏B2-20140176  苏ICP备14012660号-2   苏州灵动帧格网络科技有限公司 版权所有.

    苏公网安备 32059002001037号

    Powered by Discuz! X3.4

    Copyright © 2001-2024, Tencent Cloud.