3113|2

1291

帖子

0

TA的资源

纯净的硅(中级)

楼主
 

SAM4E的RTT实现延时 [复制链接]

SAM4E的可以计数的时钟很多,其中有个RTT(Real-time Timer)实时时钟,它是32位的计数器,他可以可编程的16位的预分频器,有两个时钟源选择,分别是慢时钟SCLK(32.768K)RTC_1HZ(1HZ),分别就是系统时钟和1HZRTC。还有闹钟中断的功能,相当的强大。如手册部分截图概要:
下图是RTT的大概框图:
这个图可以很直观的看出他的时钟来源有两部分:SCLKRTC1HZ,一旦选择RTC1HZ,计一次数就是1s了。
RTT有几个比较重要的寄存器,一个是RTT_VR(Real-time Timer Value Register);从手册的说明可以知道,这个寄存器是要读取两次的,这是为了读取的数据稳定和正确。如下手册的截图:
还有RTT_VR寄存器是一个32位的,所以就可以说明这个计数器可以从0一直计数到232次方,这个数字是个天文数字了,如果按照一秒计数一次来算,可以计数超过136年,我也是醉了,还有一点要注意的是RTT_MR这个寄存器的复位值是0x8000,十进制就是32.768K,刚好这个值就是低RTT_MR的低十六位的值,也就是预分频寄存器(RTPRES)的值,这就是一上电时啥也不做,RTT的时钟源(如果RTT的时钟源选择SCLKSCLK32.768K)进行32768分频,刚好就是1HZ,效果等同于RTC1HZ,所以要避免这种写法RTT->RTT_MR | = RTT_MR_RTTRST | 24;这样一写原想24分频的目的就达不到了,反而变成了32768+24分频了,正确的写法是RTT->RTT_MR = RTT_MR_RTTRST | 24;写法还有其他,反正就是要把RTT_MR的第15位的影响要去除。如手册截图下的说明:
还有一个是时选择控制在RTT_MR寄存器中的RTC1HZ位,如下手册的说明:
还有下面的提示这个RTC1HZ这能写,不可以读,RTT_MR寄存器其他位均可读写。

下面我用寄存器的方式配置下RTT时钟,代码很简单。首先我这里用寄存器写个利用RTT实现一个定时器。
  1. int32_t value;

  2. void RTT_Init()
  3. {
  4.   

  5.   RTT->RTT_MR = RTT_MR_RTTRST | 32 ;

  6.   
  7. }


  8. void RTT_1HZ_Init()
  9. {
  10.   
  11.   
  12.   RTT->RTT_MR = RTT_MR_RTTRST;
  13.   RTT->RTT_MR = RTT_MR_RTC1HZ;
  14.   
  15. }

  16. int32_t Get_RTT_Value()
  17. {
  18.   int32_t value;
  19.   value = RTT->RTT_VR;
  20.   while(value == RTT->RTT_VR);
  21.   return value;
  22. }

  23. void Clear_RTT_Value()
  24. {
  25.   RTT->RTT_MR = RTT_MR_RTTRST | 32 ;
  26. }

  27. void delayms(int32_t ms)
  28. {
  29.   
  30.              while(value < ms)
  31.             {
  32.              value = Get_RTT_Value();
  33.               
  34.             }
  35.             value = 0;
  36.             Clear_RTT_Value();
  37. }

  38. int main (void)
  39. {
  40.                
  41.       
  42.       
  43.                 sysclk_init();

  44.       
  45.                 board_init();


  46.                 RTT_Init();
  47.                
  48.                 value = Get_RTT_Value();
  49.         while (1)
  50.         {
  51.             
  52.             delayms(100);
  53.             ioport_toggle_pin_level(PIO_PD22_IDX);

  54.                
  55.         }

  56. }
复制代码
附上源代码:
RTT.zip (1.42 MB, 下载次数: 14)

附上视频链接:



最新回复

以为是RTthread 进来看了下  详情 回复 发表于 2015-3-2 09:25
点赞 关注
 

回复
举报

2144

帖子

3

TA的资源

五彩晶圆(中级)

沙发
 
以为是RTthread 进来看了下

点评

哪有那么高级  详情 回复 发表于 2015-3-2 10:02
 
个人签名电工
 
 

回复

1291

帖子

0

TA的资源

纯净的硅(中级)

板凳
 
lyzhangxiang 发表于 2015-3-2 09:25
以为是RTthread 进来看了下
哪有那么高级



 
 
 

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

开源项目 更多>>
    随便看看
    查找数据手册?

    EEWorld Datasheet 技术支持

    相关文章 更多>>
    关闭
    站长推荐上一条 1/10 下一条

     
    EEWorld订阅号

     
    EEWorld服务号

     
    汽车开发圈

    About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

    站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

    北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

    电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved
    快速回复 返回顶部 返回列表