打印
[STM32F1]

(求助)STM32F107 TIM2定时不准,请版主和各位大侠帮忙看看!

[复制链接]
1520|5
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
BryanChang|  楼主 | 2014-7-1 09:53 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
STM32F107 TIM2定时不准,定1S,结果测试出来是880mS

晶振8M

原工程是按照默认25M晶振来配置的,所以system_stm32f10x.c文件中RCC配置改了一下,如下:

/*                                                  
    RCC->CFGR2 |= (uint32_t)(RCC_CFGR2_PREDIV2_DIV5 | RCC_CFGR2_PLL2MUL8 |
                             RCC_CFGR2_PREDIV1SRC_PLL2 | RCC_CFGR2_PREDIV1_DIV5);*/
          RCC->CFGR2 |= (uint32_t)(RCC_CFGR2_PREDIV2_DIV1 | RCC_CFGR2_PLL2MUL8 |
                             RCC_CFGR2_PREDIV1SRC_PLL2 | RCC_CFGR2_PREDIV1_DIV8);

Timer配置,NVIC配置,中断函数如下:
Void TIM_Configuration(void)
{
  TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
  /* TIM2 configuration */
  TIM_TimeBaseStructure.TIM_Period = 7199;         
  TIM_TimeBaseStructure.TIM_Prescaler = 9999;      
  TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1;   
  TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;  
  TIM_TimeBaseStructure.TIM_RepetitionCounter = 0x0000;
  TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure);

  //TIM_PrescalerConfig(TIM2, 35999, TIM_PSCReloadMode_Immediate);       

  TIM_ARRPreloadConfig(TIM2, DISABLE);//禁止ARR预装载缓冲器
  /* Immediate load of TIM2 Precaler value */
  //TIM_PrescalerConfig(TIM2, ((SystemCoreClock/1200) - 1), TIM_PSCReloadMode_Immediate);


  /* Clear TIM2 update pending flag */
  TIM_ClearFlag(TIM2, TIM_FLAG_Update);
  /* Clear TIM3 update pending flag */

  /* Enable TIM2 Update interrupt */
  TIM_ITConfig(TIM2, TIM_IT_Update, ENABLE);
   /* TIM2 enable counter */
  TIM_Cmd(TIM2, ENABLE);
}

void NVIC_Configuration(void)
{
  NVIC_InitTypeDef NVIC_InitStructure;
    NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
  /* Enable the TIM2 gloabal Interrupt */
  NVIC_InitStructure.NVIC_IRQChannel = TIM2_IRQn;
  NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
  NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
  NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;

  NVIC_Init(&NVIC_InitStructure);
}

void TIM2_IRQHandler(void)
{
  /* Clear TIM2 update interrupt */
if (TIM_GetITStatus(TIM2, TIM_IT_Update) != RESET)
{
  TIM_ClearITPendingBit(TIM2, TIM_IT_Update);

  /* Toggle GPIO */
  GPIO_WriteBit(GPIOC, GPIO_Pin_6, (BitAction)(1 - GPIO_ReadOutputDataBit(GPIOC, GPIO_Pin_6)));
  }
}

请各位大侠给点意见啊!



沙发
BryanChang|  楼主 | 2014-7-1 11:44 | 只看该作者
10位大侠路过也不讨论一下啊,请赐教啊!

使用特权

评论回复
板凳
mmuuss586| | 2014-7-1 12:27 | 只看该作者
定时不准?差多少啊?
先把系统时钟读出来看下是多少M(程序跟踪下看看)

使用特权

评论回复
地板
BryanChang|  楼主 | 2014-7-1 13:03 | 只看该作者
mmuuss586 发表于 2014-7-1 12:27
定时不准?差多少啊?
先把系统时钟读出来看下是多少M(程序跟踪下看看) ...

定1S,结果测试出来是880mS

使用特权

评论回复
5
BryanChang|  楼主 | 2014-7-1 13:20 | 只看该作者
mmuuss586 发表于 2014-7-1 12:27
定时不准?差多少啊?
先把系统时钟读出来看下是多少M(程序跟踪下看看) ...

版主,我配置了一下A8脚系统时钟输出,确实不对啊,示波器测出来是82.64MHz。

/* Configure USARTy Tx as alternate function push-pull */
  GPIO_InitStructure.GPIO_Pin = USARTy_TxPin;
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
  GPIO_Init(USARTy_GPIO, &GPIO_InitStructure);
  /****Config MCO GPIO,A8******/
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8;
  GPIO_Init(GPIOA, &GPIO_InitStructure);

  RCC_MCOConfig(RCC_MCO_SYSCLK);
    版主的经验一般是什么问题啊?

使用特权

评论回复
6
BryanChang|  楼主 | 2014-7-1 13:57 | 只看该作者
好不容易把系统时钟搞定了,可能也是治标不治本,配置如下:
        //RCC->CFGR2 |= (uint32_t)(RCC_CFGR2_PREDIV2_DIV5 | RCC_CFGR2_PLL2MUL8 | RCC_CFGR2_PREDIV1SRC_PLL2 | RCC_CFGR2_PREDIV1_DIV5);
          //RCC->CFGR2 |= (uint32_t)(RCC_CFGR2_PREDIV2_DIV2 | RCC_CFGR2_PLL2MUL8 | RCC_CFGR2_PREDIV1SRC_PLL2 | RCC_CFGR2_PREDIV1_DIV4);
        RCC->CFGR2 |= (uint32_t)(RCC_CFGR2_PREDIV1SRC_HSE | RCC_CFGR2_PREDIV1_DIV1);
大侠们能给个深层原因解释最好了!

使用特权

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

本版积分规则

4

主题

57

帖子

4

粉丝