[活动专区] 【Autochips评测】+ 3、定时器

[复制链接]
995|1
 楼主| tlled 发表于 2021-1-21 22:35 | 显示全部楼层 |阅读模式
        一、手册有关的定时器资料

    下面来了解下ac781x定时器,定时器有下面特性和功能。    001.png

    比较想了解的就是通道支持链模式。


    手册上有关定时器链的介绍
    002.png
    除了定时器0不能连接其他定时器,其他定时器可以组成链模式。

    二、定时器应用

   2.1、timer.c
  1. #include "ac78xx_timer.h"
  2. #include "timer.h"
  3. #include "led.h"

  4. #define MAX_MIN_SECOND_COUNT        9
  5. #define MAX_SECOND_MINUTE_COUNT     249
  6. #define MAX_HOURS_COUNT             249

  7. /* 以下四个全局变量为具体计数 */
  8. uint8_t g_timer0Count = 0;  
  9. uint8_t g_timer1Count = 0;  
  10. uint8_t g_timer4Count = 0;  
  11. uint8_t g_timer7Count = 0;

  12. /**
  13. *
  14. * @param[in] timerIndex: timer Index from 0 to 7
  15. *
  16. * [url=home.php?mod=space&uid=266161]@return[/url] none
  17. *
  18. * [url=home.php?mod=space&uid=247401]@brief[/url] TIMER0 CallBack
  19. * TIMER0中断回调
  20. */
  21. void TIM0_Task(uint8_t timerIndex)
  22. {
  23.     if (TIMER_GetIntFlag(TIMER0))
  24.     {
  25.         TIMER_ClrIntFlag(TIMER0); //清中断标志
  26.         g_timer0Count ++;
  27.         if (g_timer0Count > MAX_MIN_SECOND_COUNT)
  28.                                 {
  29.                                        
  30.             g_timer0Count = 0;
  31.                                 }
  32.     }
  33. }
  34. /**
  35. *
  36. * @param[in] timerIndex: timer Index from 0 to 7
  37. *
  38. * @return none
  39. *
  40. * @brief TIMER1 CallBack
  41. * TIMER1中断回调
  42. */
  43. void TIM1_Task(uint8_t timerIndex)
  44. {
  45.     if (TIMER_GetIntFlag(TIMER1))
  46.     {
  47.         TIMER_ClrIntFlag(TIMER1);
  48.                                
  49.         g_timer1Count ++;
  50.         if (g_timer1Count > MAX_SECOND_MINUTE_COUNT)
  51.                                 {
  52.             g_timer1Count = 0;
  53.                                                 LED1_TOGGLE;
  54.                                 }
  55.     }
  56. }
  57. /**
  58. *
  59. * @param[in] timerIndex: timer Index from 0 to 7
  60. *
  61. * @return none
  62. *
  63. * @brief TIMER4 CallBack
  64. * TIMER4中断回调
  65. */
  66. void TIM4_Task(uint8_t timerIndex)
  67. {
  68.     if (TIMER_GetIntFlag(TIMER4))
  69.     {
  70.         TIMER_ClrIntFlag(TIMER4);
  71.         g_timer4Count ++;
  72.                                
  73.                                 LED2_TOGGLE;
  74.                        
  75.         if (g_timer4Count > MAX_SECOND_MINUTE_COUNT)
  76.             g_timer4Count = 0;
  77.     }
  78. }
  79. /**
  80. *
  81. * @param[in] timerIndex: timer Index from 0 to 7
  82. *
  83. * @return none
  84. *
  85. * @brief TIMER7 CallBack
  86. * TIMER7中断回调
  87. */
  88. uint8_t tt=0;
  89. void TIM7_Task(uint8_t timerIndex)
  90. {
  91.     if (TIMER_GetIntFlag(TIMER7))
  92.     {
  93.                         TIMER_ClrIntFlag(TIMER7);
  94.                        
  95.                         LED3_TOGGLE;
  96.                        
  97.                         g_timer7Count ++;
  98.       if (g_timer7Count > MAX_HOURS_COUNT)
  99.                                 g_timer7Count = 0;
  100.                                                
  101.     }
  102. }
  103. /**
  104. *
  105. * @param[in] none
  106. *
  107. * @return 0:Success
  108. *
  109. * @brief TIMER init
  110. *(0)timer delay frequency = SYS_CLK / (timerloadValue + 1)
  111. *(1)timer0 for 10ms Delay
  112. *(2)tiemr1 for 0.25s Delay
  113. *(3)timer2,timer3,timer4 used for link mode, for 0.5s delay
  114. *(4)timer5,timer6,timer7 used for link mode, for 1s delay
  115. * timer0,timer1是32位计数器,而其他计数器只有16位,则timerConfig0.loadValue的值应合理设置,不应溢出
  116. * 在48M的总线频率下,timer单独使用的话,timer0~1,最大loadValue为4294967295;其他timer最大loadValue为65535,计数范围较小
  117. * 在链接模式中,timer0是不能链接到任何其他timer上面的
  118. */
  119. void Timer_Init(void)
  120. {
  121.     TIMER_ConfigType  timerConfig0 = {0};
  122.     TIMER_ConfigType  timerConfig1 = {0};
  123.     TIMER_ConfigType  timerConfig2 = {0};
  124.     TIMER_ConfigType  timerConfig3 = {0};
  125.     TIMER_ConfigType  timerConfig4 = {0};
  126.     TIMER_ConfigType  timerConfig5 = {0};
  127.     TIMER_ConfigType  timerConfig6 = {0};
  128.     TIMER_ConfigType  timerConfig7 = {0};

  129.     timerConfig0.loadValue              = Delay10ms;  ///10ms timeout
  130.     timerConfig0.interruptEn      = 1;                //中断使能
  131.     timerConfig0.linkMode                = 0;                 //禁能链接
  132.     timerConfig0.timerEn          = 1;                //使能TIMER0

  133.     timerConfig1.loadValue              = Delay1ms;
  134.     timerConfig1.interruptEn      = 1;
  135.     timerConfig1.linkMode                = 0;
  136.     timerConfig1.timerEn          = 1;

  137.     TIMER_SetCallback(TIMER0, TIM0_Task);
  138.     TIMER_SetCallback(TIMER1, TIM1_Task);
  139.     TIMER_Init(TIMER0, &timerConfig0);    //TIMER0配置初始化
  140.     TIMER_Init(TIMER1, &timerConfig1);

  141.     timerConfig2.loadValue              = Delay1ms;             
  142.     timerConfig2.interruptEn      = 0;                          
  143.     timerConfig2.linkMode                = 0;                   
  144.     timerConfig2.timerEn          = 1;

  145.     timerConfig3.loadValue              = 249;    //0.25s TimerOut
  146.     timerConfig3.interruptEn      = 0;
  147.     timerConfig3.linkMode                = 1;             //使能链接
  148.     timerConfig3.timerEn          = 1;
  149.                
  150.     timerConfig4.loadValue                      = 1;      //0.5s TimerOut
  151.     timerConfig4.interruptEn      = 1;            //使能中断
  152.     timerConfig4.linkMode                = 1;             //使能链接
  153.     timerConfig4.timerEn          = 1;

  154.     TIMER_Init(TIMER2, &timerConfig2);
  155.     TIMER_Init(TIMER3, &timerConfig3);
  156.     TIMER_SetCallback(TIMER4, TIM4_Task);    //TIMER4设置回调
  157.     TIMER_Init(TIMER4, &timerConfig4);       //TIMER4配置初始化

  158.     timerConfig5.loadValue              = Delay1ms;          //1ms TimerOut
  159.     timerConfig5.interruptEn      = 0;                       //禁能中断
  160.     timerConfig5.linkMode                = 0;                //禁能链接
  161.     timerConfig5.timerEn          = 1;

  162.     timerConfig6.loadValue              = 249;                           //0.25s TimerOut
  163.     timerConfig6.interruptEn      = 0;
  164.     timerConfig6.linkMode                = 1;                             //使能链接
  165.     timerConfig6.timerEn          = 1;

  166.     timerConfig7.loadValue              = 3;                            //1s TimerOut
  167.     timerConfig7.interruptEn      = 1;                             //使能中断
  168.     timerConfig7.linkMode                = 1;                      //使能链接
  169.     timerConfig7.timerEn          = 1;


  170.     TIMER_Init(TIMER5, &timerConfig5);
  171.     TIMER_Init(TIMER6, &timerConfig6);
  172.     TIMER_SetCallback(TIMER7, TIM7_Task);
  173.     TIMER_Init(TIMER7, &timerConfig7);
  174. }

   
     2.2、程序实现的功能
    1、定时器通道0  实现10ms定时中断
    2、定时器通道1  实现0.25s定时中断  
    3、定时器通道2、通道3、通道4 实现链模式,实现0.5s定时中断
    4、定时器通道5、通道6、通道7 实现链模式,实现1s定时中断

   2.3、通过这个例程看到,定时器通道n是以通道n-1为基准来计时,实现长时间定时的功能。
   

xlq3 发表于 2021-3-12 11:01 | 显示全部楼层
请教一个问题,timer1在中断的时候,改变loadvalue,是否需要重新初始化?还是怎么实现?直接改变loadvalue,发现timer1不工作。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

132

主题

701

帖子

7

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