关于定时器的分频问题 求助

2019-03-23 20:21发布

我想让定时器tim2实现1s一次中断 但是不知道为什么代码下载到板子上发现非常快 检查了时钟tim2的时钟频率是72M 那么预分频系数设定为36000  重装载为2000 但是不管用
代码如下:

#include "stm32f10x.h"
void ttttt(void);
void GPIO_Configuration(void);
void delay(u32 t);
        int i=0;
int main()
{

   RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOC | RCC_APB2Periph_GPIOD,ENABLE);//GPIO时钟开启,A0控制B1按键,PD控制锁存器,PC控制数码管
   GPIO_Configuration();
   RCC->APB1ENR=(RCC->APB1ENR&0xfffffffe)|0x1;
   GPIOC->BSRR=0xff00;//关闭所有led
   GPIO_SetBits(GPIOD,GPIO_Pin_2);
   GPIO_ResetBits(GPIOD,GPIO_Pin_2);
   

   NVIC->ISER[0]=0x10000000;
   TIM2->DIER=0x41;//使能timer中断
   TIM2->PSC=0x8ca0;//36000分频
   TIM2->ARR=0x7d0;//到2000
   TIM2->CR1=0x15;
   
   while(1)
   {

     ;
         
        }  

}

void GPIO_Configuration(void)
{
  GPIO_InitTypeDef GPIO_InitStructure;                //定义一个结构体名称为GPIO_InitStructure
  //LED
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8 | GPIO_Pin_9 | GPIO_Pin_10 | GPIO_Pin_11         
                                |GPIO_Pin_12 | GPIO_Pin_13 | GPIO_Pin_14 | GPIO_Pin_15;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;  
  GPIO_Init(GPIOC, &GPIO_InitStructure);
  //NLE
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  GPIO_Init(GPIOD, &GPIO_InitStructure);
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;
  GPIO_InitStructure.GPIO_Mode =GPIO_Mode_IN_FLOATING;
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  GPIO_Init(GPIOD, &GPIO_InitStructure);
}

void delay(u32 t)
{
  for(;t>0;t--);
}

void TIM2_IRQHandler(void)
{
          GPIO_Write(GPIOC,~(1<<(i+8)));
          GPIO_SetBits(GPIOD,GPIO_Pin_2);
          GPIO_ResetBits(GPIOD,GPIO_Pin_2);
         // delay(500000);
          i++ ;
          if(i==8)
          {
                  i=0;
          }
}

Clock Enabled, TIM2CLK: 72.00 MHz 这句话是不是就是说tim2的时钟频率是72mhz啊??
请大家帮忙看看
我后来改成tim3 也不行啊 为什么啊???

[ 本帖最后由 cyhssw12 于 2011-7-29 12:00 编辑 ] 此帖出自小平头技术问答
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
2条回答
daicheng
2019-03-24 05:52
/

STM32中有多达8个定时器,其中TIM1和TIM8是能够产生三对PWM互补输出的高级定时器,常用于三相电机的驱动,它们的时钟由APB2的输出产生。其它6个为普通定时器,时钟由APB1的输出产生。

下图是STM32参考手册上时钟分配图中,有关定时器时钟部分的截图:

qw.JPG

从图中可以看出,定时器的时钟不是直接来自APB1或APB2,而是来自于输入为APB1或APB2的一个倍频器,图中的蓝 {MOD}部分。

下面以定时器2~7的时钟说明这个倍频器的作用:当APB1的预分频系数为1时,这个倍频器不起作用,定时器的时钟频率等于APB1的频率;当APB1的预分频系数为其它数值(即预分频系数为2、4、8或16)时,这个倍频器起作用,定时器的时钟频率等于APB1的频率两倍。

假定AHB=36MHz,因为APB1允许的最大频率为36MHz,所以APB1的预分频系数可以取任意数值;当预分频系数=1时,APB1=36MHz,TIM2~7的时钟频率=36MHz(倍频器不起作用);当预分频系数=2时,APB1=18MHz,在倍频器的作用下,TIM2~7的时钟频率=36MHz。

有人会问,既然需要TIM2~7的时钟频率=36MHz,为什么不直接取APB1的预分频系数=1?答案是:APB1不但要为TIM2~7提供时钟,而且还要为其它外设提供时钟;设置这个倍频器可以在保证其它外设使用较低时钟频率时,TIM2~7仍能得到较高的时钟频率。

再举个例子:当AHB=72MHz时,APB1的预分频系数必须大于2,因为APB1的最大频率只能为36MHz。如果APB1的预分频系数=2,则因为这个倍频器,TIM2~7仍然能够得到72MHz的时钟频率。能够使用更高的时钟频率,无疑提高了定时器的分辨率,这也正是设计这个倍频器的初衷。

一周热门 更多>