打印

请教一个定时器的问题,我用TIMER2做了个溢出中断

[复制链接]
3730|14
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
请教一个定时器的问题,我用TIMER2做了个溢出中断,我本来是要1S中断一次的,我在中断服务程序中不断的取反一个IO口,结果用示波器量出来是0。5S中断一次,是否我在哪设置错了。
代码如下:
void Timer2Init(void)
{
   
    TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
    NVIC_InitTypeDef NVIC_InitStructure;

  TIM_DeInit( TIM2);//复位TIM2定时器

  // TIM2 configuration
  TIM_TimeBaseStructure.TIM_Period = 9999; //最大计数值0xffff      
  TIM_TimeBaseStructure.TIM_Prescaler = 3599;//分频0x3599 + 1 =3600      
  TIM_TimeBaseStructure.TIM_ClockDivision = 0; // 时钟分割  
  TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;  //计数方向向上计数
  TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure);

  // Clear TIM2 update pending flag[清除TIM2溢出中断标志]
  TIM_ClearFlag(TIM2, TIM_FLAG_Update);


  // Enable TIM2 Update interrupt [TIM2溢出中断允许
  TIM_ITConfig(TIM2, TIM_IT_Update, ENABLE);  

  // TIM2 enable counter [允许tim2计数]
  TIM_Cmd(TIM2, ENABLE);
  
  NVIC_InitStructure.NVIC_IRQChannel = TIM2_IRQn;
  NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 3;
  NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3;
  NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
  NVIC_Init(&NVIC_InitStructure);

  /* TIM2 enable counter */
  TIM_Cmd(TIM2, ENABLE);        
}


void TIM2_IRQHandler(void)
{
  if(TIM_GetITStatus(TIM2,TIM_IT_Update)==SET)
  {
    TIM_ClearITPendingBit(TIM2, TIM_IT_Update);
        if(Second >= 60)
            {
                Second = 0;
                Minute++;
            }
        Second++;
         if(GPIO_ReadOutputDataBit(GPIOB, GPIO_Pin_7))
            GPIO_ResetBits(GPIOB, GPIO_Pin_7);
        else
            GPIO_SetBits(GPIOB, GPIO_Pin_7);
/*        if(GPIO_ReadOutputDataBit(GPIOB, GPIO_Pin_5))
            GPIO_ResetBits(GPIOB, GPIO_Pin_5);
        else
            GPIO_SetBits(GPIOB, GPIO_Pin_5);*/
  }
}

        
}
沙发
香水城| | 2010-1-14 14:29 | 只看该作者
请问你的参数是如何计算出来的?如何设置的?

使用特权

评论回复
板凳
myworkmail|  楼主 | 2010-1-14 14:46 | 只看该作者
36MHZ
3600分频,(3599 + 1)
记数到9999
不是正好1S吗?现在实际是0。5S。
求教原因

使用特权

评论回复
地板
myworkmail|  楼主 | 2010-1-14 14:47 | 只看该作者
TIMER2 36MHZ

使用特权

评论回复
5
香水城| | 2010-1-14 14:50 | 只看该作者
TIM2的36MHz是怎么得到的?

使用特权

评论回复
6
myworkmail|  楼主 | 2010-1-14 15:23 | 只看该作者
PLL72MHZ
APB1上的TIMER2不是36MHZ吗?

使用特权

评论回复
7
香水城| | 2010-1-14 15:38 | 只看该作者
不要想当然嘛,还是看看手册吧。

《STM32技术参考手册中文翻译第10版》:这个手册第56页最后3行。

STM32_Clock_Tree_Partial.GIF (13.54 KB )

STM32_Clock_Tree_Partial.GIF

使用特权

评论回复
8
myworkmail|  楼主 | 2010-1-14 15:48 | 只看该作者
原来是这样,谢谢

使用特权

评论回复
9
myworkmail|  楼主 | 2010-1-14 15:52 | 只看该作者
那TIMER1的时钟不是到144MHZ吗?

使用特权

评论回复
10
香水城| | 2010-1-14 15:56 | 只看该作者
那TIMER1的时钟不是到144MHZ吗?
myworkmail 发表于 2010-1-14 15:52


这是手册的第56页最后3行,请再看2遍:

定时器时钟频率分配由硬件按以下2种情况自动设置:
1. 如果相应的APB预分频系数是1,定时器的时钟频率与所在APB总线频率一致。
2. 否则,定时器的时钟频率被设为与其相连的APB总线频率的2倍。

使用特权

评论回复
11
myworkmail|  楼主 | 2010-1-14 16:12 | 只看该作者
那APB1最高为36M,就是必须得2分频HCLK,也就是说从TIME2到TIME7的时钟都是72MHZ了?
或者把APB1,4分频,TIME2到TIME7的时钟才能是36MHZ

使用特权

评论回复
12
myworkmail|  楼主 | 2010-1-14 16:14 | 只看该作者
也就是说我的APB1为36M,那么TIMER2的时钟就是是72MHZ

使用特权

评论回复
13
香水城| | 2010-1-14 16:47 | 只看该作者
本帖最后由 香水城 于 2010-1-14 16:48 编辑

当AHB的频率为72MHz时,要得到APB2的频率为36MHz,就需要设置APB2的预分频系数为2,按照10楼给出的规则,当预分频系数不是1时,定时器的频率就是APB2频率的2倍,即72MHz。

对于APB1,要得到72MHz则预分频系数应该设为1,同样按照10楼给出的规则,当预分频系数是1时,定时器的频率就与APB1相同,所以TIM1的频率为72MHz。

使用特权

评论回复
14
pkat| | 2010-1-14 19:52 | 只看该作者
在中断里面放一个变量自加,再观察变量是否变化,然后检查你的I/O配置是否正确

使用特权

评论回复
15
myworkmail|  楼主 | 2010-1-14 22:00 | 只看该作者
谢谢斑竹和楼上,已解决,的确是的

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

22

主题

100

帖子

0

粉丝