打印

大家帮我看看这个定时器定了多长时间

[复制链接]
2153|4
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
boboluoluo|  楼主 | 2009-11-16 10:27 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
void RCC_Configuration(void)
{
    RCC_DeInit();
    RCC_HSEConfig(RCC_HSE_ON);
  /* Wait till HSE is ready */
  HSEStartUpStatus = RCC_WaitForHSEStartUp();
  if(HSEStartUpStatus == SUCCESS)
  {
    /* Enable Prefetch Buffer */
    FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable);
    /* Flash 2 wait state */
    FLASH_SetLatency(FLASH_Latency_2);

    /* HCLK = SYSCLK */
    RCC_HCLKConfig(RCC_SYSCLK_Div1);
  
    /* PCLK2 = HCLK */
    RCC_PCLK2Config(RCC_HCLK_Div1);
    /* PCLK1 = HCLK/2 */
    RCC_PCLK1Config(RCC_HCLK_Div2);
    /* PLLCLK = 8MHz * 9 = 72 MHz */
    RCC_PLLConfig(RCC_PLLSource_HSE_Div1, RCC_PLLMul_9);
    /* Enable PLL */
    RCC_PLLCmd(ENABLE);
    /* Wait till PLL is ready */
    while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET)
    {
    }
    /* Select PLL as system clock source */
    RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);
    /* Wait till PLL is used as system clock source */
    while(RCC_GetSYSCLKSource() != 0x08)
    {
    }
  }
    /* TIM2 clock enable */
  RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);  
  /* Enable USART1, GPIOA, GPIOA and AFIO clocks */
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1 | RCC_APB2Periph_GPIOA  | RCC_APB2Periph_AFIO, ENABLE);
                        
}


void TIM2_config(void)
{
  /* Time base configuration*/
  TIM_TimeBaseStructure.TIM_Period = 0xffff;//周期值  TIM_TimeBaseStructure.TIM_Prescaler = 0;//时钟的预分频数
  TIM_TimeBaseStructure.TIM_ClockDivision = 0;//TIM配置时钟分割  TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;//向上计数
  TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure);
  /* Prescaler configuration [配置TIM的预分频数]*/
  TIM_PrescalerConfig(TIM2, 36, TIM_PSCReloadMode_Immediate);//TIM2,36分频,预分频数立即载入
  /* Output Compare Timing Mode configuration: Channel1 [配置输出比较模式]*/
  TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_Timing;//TIM输出比较计时模式
  TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;//输出允许
  TIM_OCInitStructure.TIM_Pulse = 1000;
  TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;//极性HIGH
  TIM_OC1Init(TIM2, &TIM_OCInitStructure);
  TIM_OC1PreloadConfig(TIM2, TIM_OCPreload_Disable);//关闭TIM2在CCR1寄存器上的预载入寄存器
  /* TIM IT enable [使能TIM2比较中断]*/
  TIM_ITConfig(TIM2, TIM_IT_CC1, ENABLE);
  /* TIM2 enable counter */
  TIM_Cmd(TIM2, ENABLE);
}


定时器2定了多长时间呢?怎样计算的呢?
沙发
barboon| | 2009-11-16 12:11 | 只看该作者
你的TIM预分频写36,实际预分频系数是36+1
也就是你的TIM2时钟频率是72/37 MHz

定时器周期是65535,也就是65535/(72/37 MHz) = 33677.7 微秒
CCR1寄存器是4096,也就是会在TIM开始计数以后4096/(72/37 MHz) = 2104.9 微秒
的时候产生中断

使用特权

评论回复
板凳
boboluoluo|  楼主 | 2009-11-16 21:11 | 只看该作者
为什么CCR1寄存器是4096呢?
TIM_OCInitStructure.TIM_Pulse = 1000;
从这句来看不是应该为1000吗?

使用特权

评论回复
地板
疏竹潇潇| | 2009-11-28 21:47 | 只看该作者
比较中断周期是1000/(72/37)

使用特权

评论回复
5
xsgy123| | 2009-11-29 20:45 | 只看该作者
看不出来

使用特权

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

本版积分规则

17

主题

51

帖子

1

粉丝