2859|1

57

帖子

0

TA的资源

一粒金砂(中级)

楼主
 

SAM4E -实时时钟定时RTT [复制链接]

本帖最后由 梭罗瓦尔登 于 2015-1-24 21:28 编辑

    实时时钟定时器是一个围绕在32位计数器旁的一个用来计数被32khz慢时钟源驱动的可编程的16位预分频器翻滚事件的计数器.因此利用一个校验过的1HZ的时钟,RTT也可以被配置成直接由1HZRTC信号驱动.当仅仅需要一个秒计数器时慢时钟可以被完全关闭以节省功耗。
RTT是ATMEL的芯片特有的功能这在st上好像没有见过,而且RTT使用起来也比较简单,下面就让我来给大家介绍一下RTT的使用。


千言万语尽在BLOCK那张图上,首先先看看那张图
  1. /*
  2. * rtt_int.c
  3. *
  4. * Created: 2015/1/22 20:03:21
  5. *  Author: ThinkPad
  6. */
  7. #include "sam.h"

  8. #define LED1_GPIO PIO_PD22

  9. #define LED1_OFF_MS (300)
  10. #define LED1_ON_MS  (300)


  11. #define PRESCALE (1u<<10)


  12. uint32_t ReadRTT_CRTV(void)
  13. {
  14.   
  15.     uint32_t v1;
  16.     uint32_t v2;
  17.     while(1)
  18.     {
  19.         v1 = (RTT->RTT_VR) & RTT_VR_CRTV_Msk;
  20.         v2 = (RTT->RTT_VR) & RTT_VR_CRTV_Msk;
  21.         /* 通过连续读取两次RTT_VR的值以增加准备性 */
  22.         if (v1 == v2)
  23.         {
  24.             return v1;
  25.         }
  26.     }
  27. }

  28. uint32_t CalcRTTNeedInc(unsigned int ms)
  29. {
  30.     /* 计数器加一的频率 */
  31.     const uint32_t freq = CHIP_FREQ_SLCK_RC / PRESCALE;
  32.     /* 计算延迟后,计数器需要增加的值
  33.      * need_inc = ms /1000 / (1/freq) */
  34.     return (ms * freq / 1000);       //1s钟跑freq,1ms就跑freq/1000,所以ms毫秒,就是ms*freq/1000//
  35. }  

  36. void Delay(unsigned int ms)
  37. {
  38.     uint32_t begin_rttv = ReadRTT_CRTV();
  39.     uint32_t need_inc = CalcRTTNeedInc(ms);
  40.     uint32_t end_rttv = begin_rttv + need_inc;
  41.   
  42.     /* 等待*/
  43.     while(ReadRTT_CRTV() < end_rttv)
  44.         ;
  45. }


  46. /* RTT 中断处理函数
  47. * 在这里主要就进行LED1引脚电平的切换了
  48. */
  49. void RTT_Handler(void)
  50. {
  51.     /* 通过读取状态寄存器清除Alarm */
  52.     uint32_t read_clear = RTT->RTT_SR;
  53.     uint32_t begin_rttv = ReadRTT_CRTV();
  54.     uint32_t int_gap_ms ;
  55.     uint32_t need_inc;
  56.      
  57.     if ((PIOD->PIO_ODSR & LED1_GPIO) == 0)
  58.     {
  59.         /* 现在引脚电平为低,LED是亮的 */
  60.         /* 灭灯 */
  61.         PIOD->PIO_SODR = LED1_GPIO;
  62.         /* 设置下次中断唤醒间隔的时间 */
  63.                
  64.                
  65.                
  66.         int_gap_ms = LED1_OFF_MS;
  67.     }
  68.     else
  69.     {
  70.         /* 现在引脚电平为高,LED是灭的 */
  71.         /* 亮灯 */
  72.         PIOD->PIO_CODR = LED1_GPIO;
  73.         /* 设置下次中断唤醒间隔的时间 */
  74.         int_gap_ms = LED1_ON_MS;
  75.     }

  76.     /* 计算并设置下一次中断的条件 */
  77.     need_inc = CalcRTTNeedInc(int_gap_ms);
  78.     RTT->RTT_AR = RTT_AR_ALMV(begin_rttv + need_inc - 1);

  79.     return;
  80. }

  81. int main(void)
  82. {
  83.         
  84.     /* 必须要开PIOA的外围时钟*/
  85. //    PMC->PMC_PCER0 = (1 << ID_PIOA);
  86.         
  87.         /* 关闭看门狗 */
  88.     WDT->WDT_MR = WDT_MR_WDDIS;
  89.     /* 初始化PIO */
  90.     /* 让PIO控制器直接控制引脚 */

  91.     PIOD->PIO_PER = LED1_GPIO;
  92.     /* 引脚输出使能 */

  93.     PIOD->PIO_OER = LED1_GPIO;
  94.     /* 引脚输出写使能 */
  95. //    PIOA->PIO_OWER = LED0_GPIO;
  96. //    PIOD->PIO_OWER = LED1_GPIO;

  97. // NVIC_SetPriorityGrouping(0);//也可以不设置默认是0

  98.     /* 初始化 RTT */
  99.     /* 启用中断 */
  100.     NVIC_ClearPendingIRQ(RTT_IRQn);
  101.    
  102.     RTT->RTT_MR = RTT_MR_RTPRES(PRESCALE)
  103.                     | RTT_MR_RTTRST
  104.                     | RTT_MR_ALMIEN    //设置预分频器 重启定时器 开alarm中断
  105.                     ;
  106.     /* 计算第一次中断的时间
  107.      * 现在灯是亮的,第一次中断即在需要灯灭时
  108.      */
  109.          NVIC_SetPriority(RTT_IRQn,0);//设置rtt的中断优先级
  110.          
  111.          NVIC_EnableIRQ(RTT_IRQn);    //使能RTT中断
  112.          
  113.     RTT->RTT_AR = RTT_AR_ALMV(ReadRTT_CRTV() + CalcRTTNeedInc(LED1_ON_MS) -1);   //设置和CRTV比较的那个值
  114.             
  115.     while (1) {

  116.     }
  117.     return 0;
  118. }
复制代码

千言万语尽在图.png (331.85 KB, 下载次数: 1)

千言万语尽在图.png

赞赏

1

查看全部赞赏

点赞 关注(1)
 

回复
举报

57

帖子

0

TA的资源

一粒金砂(中级)

沙发
 
谢谢版主  哈哈  第一次发帖真给面子 我会继续好好学习的  嘿嘿
 
 
 

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

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

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

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

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

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

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

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