STM32
直播中

djfldsthtr

8年用户 955经验值
擅长:光电显示
私信 关注
[问答]

cc1110设置time1定时器的定时时间总是不对的原因?

大侠们好,最近在捣鼓 cc1110 这个无线的芯片,
            使用外部 26MHz 晶振
            
            
            设置 time 1 定时器的定时时间 总是不对,不知道是哪里出错了,请大侠们指点指点 ?
            代码如下:
            
            
            我的定时时间的计算方法: 26MHz/128  = 203.125KHz, 1/203.125KHz = 5uS;   
            那么1ms 就是 1000/5us = 200次,所以TIM1_VAL 这个设置为200,
            #define TIM1_VAL    ( 200 )      //
            
            #define TIMER1_INIT()            
              do{                             
                  T1CTL     =  0x00;         
                  T1CCTL0   =  0x00;         
                  T1CCTL1   =  0x00;         
                  T1CCTL2   =  0x00;         
                  TIMIF     amp;=  ~0x40;         
              }while(0)
            
            
            //#define TIMER1_RUN(value)  (T1CTL = (value) ? T1CTL |= 0x02 : T1CTL  amp; ~0x03)    //比较计数
            #define TIMER1_RUN(value)  (T1CTL = (value) ? T1CTL |= 0x01 : T1CTL  amp; ~0x03)      //自动装载
            
            #define TIMER1_ENABLE_OVERFLOW_INT(val)  
              (TIMIF = (val) ? TIMIF | 0x40 : TIMIF  amp; ~0x40)
            
            
            void TIME1_Init(void);
            
            
            
            
            
            void TIME1_Init(void)
            {
              TIMER1_INIT();
                    
                    T1CTL |= 0x0C;                          //128分频,设置为模模式  0000 1100
              T1CC0L = (u8)TIM1_VAL;            //溢出值低8位
              T1CC0H = (u8)(TIM1_VAL  gt; gt; 8);     //溢出值高8位
            
              TIMER1_ENABLE_OVERFLOW_INT(TRUE);     //定时器 T1 溢出中断使能
              INT_ENABLE(INUM_T1, INT_ON);          //定时器 T1 中断使能
              EA = INT_ON;                          //全局中断使能
              TIMER1_RUN(TRUE);                     //启动定时器
            }
            
            
            
            #pragma  vector = T1_VECTOR
            __interrupt void Timer1_ISR(void)    //1ms中断,实际不止1ms,貌似有几百ms了 ?????????????????????
            {
                  TempFlag = !TempFlag;                   //改变闪烁标志
            
            
            }
            
            
            void main()
            {
            TIME1_Init();
            
                  while(1)
                  {
                       if(TempFlag)
                      {
                         RLED = !RLED;
                         TempFlag = 0;
                        }
            
            
                  }
            }

回帖(1)

杨帆

2024-5-17 18:03:04
您好!首先,我们需要确保您的代码中设置了正确的时钟源和时钟分频。在 CC1110 中,TIME1 定时器的时钟源可以是系统时钟或外部时钟。您提到使用了外部 26MHz 晶振,所以我们需要确保定时器使用的是这个时钟源。

以下是一些可能的原因和解决方案:

1. 确保时钟源设置正确:
   在您的代码中,确保设置了正确的时钟源。例如,使用以下代码设置系统时钟为外部 26MHz 晶振:
   ```c
   RFST = 0x0C; // 关闭所有模块
   RFIO = 0x40;  // 设置外部时钟源
   RFST = 0x0D; // 开启所有模块
   ```

2. 检查时钟分频设置:
   CC1110 的时钟分频器(CLKDIV)可以用于调整系统时钟频率。确保您的代码中设置了正确的时钟分频值。例如,要将系统时钟设置为 13MHz,可以使用以下代码:
   ```c
   CLKDIV = 0x03; // 26MHz / (3 + 1) = 13MHz
   ```

3. 检查定时器预分频设置:
   TIME1 定时器有一个预分频器,可以用于调整定时器的时钟频率。确保您的代码中设置了正确的预分频值。例如,要将定时器时钟设置为 1MHz,可以使用以下代码:
   ```c
   T1DIV = 0x03; // 13MHz / (3 + 1) = 3.25MHz
   ```

4. 检查定时器模式和寄存器设置:
   确保您的代码中正确设置了 TIME1 定时器的工作模式(如上升沿触发、下降沿触发等),并正确配置了定时器的寄存器,如 T1CCTLx、T1CCTLx、T1DIV 等。

5. 检查中断和回调函数:
   如果您使用了定时器中断,请确保正确设置了中断使能位,并在中断服务程序中正确处理了定时器中断。

6. 调试和测试:
   使用调试器逐步执行您的代码,检查定时器的寄存器值和中断标志位,以确定问题所在。

希望这些建议能帮助您解决问题。如果问题仍然存在,请提供更多关于您的代码和设置的详细信息,以便我们能够更准确地为您提供帮助。
举报

更多回帖

发帖
×
20
完善资料,
赚取积分