STM32F103ZET6的TIM5-TIM8不能工作(新手求助)

2019-03-23 19:05发布

STM32F103ZET6的TIM5-TIM8不能工作,TIM1-TIM4工作正常。TIM2-TIM5是通用定时器,但是TIM5与TIM234配置完全一样,却不能工作。TIM1换成TIM8也是同样问题,查看寄存器,TIM5678->CNT根本没有计数。下面是TIM2和TIM8的配置。

static void TIM2_GPIO_Config(void)
{                       
        GPIO_InitTypeDef GPIO_InitStructure;

        /* TIM2 clock enable */
  RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);

  /* GPIOA clock enable */
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);

  /*GPIOA Configuration: TIM3 channel 1 and 2 as alternate function push-pull */
  GPIO_InitStructure.GPIO_Pin =  GPIO_Pin_3;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;                    // 复用推挽输出
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;

  GPIO_Init(GPIOA, &GPIO_InitStructure);
}
static void TIM2_Mode_Config(void)
{
  TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
        TIM_OCInitTypeDef  TIM_OCInitStructure;
        u16 CCR4_Val =         1000;
       

  /* Time base configuration */                 
  TIM_TimeBaseStructure.TIM_Period = 9999;       //当定时器从0计数到9999,即为10000次 10MS,为一个定时周期
  TIM_TimeBaseStructure.TIM_Prescaler = 71;            //设置预分频:72   1Mhz           1us
  TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1 ;        //设置时钟分频系数:不分频
  TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;  //向上计数模式

  TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure);

  /* PWM1 Mode configuration: Channel1 */
  TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;            //配置为PWM模式1
  TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;       
  TIM_OCInitStructure.TIM_Pulse = CCR4_Val;           //设置跳变值,当计数器计数到这个值时,电平发生跳变
  TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_Low;  //当定时器计数值小于CCR4_Val时为低电平

  TIM_OC4Init(TIM2, &TIM_OCInitStructure);         //使能通道1

  TIM_OC4PreloadConfig(TIM2, TIM_OCPreload_Enable);

  TIM_ARRPreloadConfig(TIM2, ENABLE);                         // 使能TIM2重载寄存器ARR

  /* TIM3 enable counter */
  TIM_Cmd(TIM2, ENABLE);                   //使能定时器2       
}


static void TIM8_GPIO_Config(void)
{                       
        GPIO_InitTypeDef GPIO_InitStructure;

        /* TIM2 clock enable */
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM8, ENABLE);

  /* GPIOA clock enable */
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE);

  /*GPIOA Configuration: TIM3 channel 1 and 2 as alternate function push-pull */
  GPIO_InitStructure.GPIO_Pin =  GPIO_Pin_6;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;                    // 复用推挽输出
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;

  GPIO_Init(GPIOC, &GPIO_InitStructure);
}
static void TIM8_Mode_Config(void)
{
  TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
        TIM_OCInitTypeDef  TIM_OCInitStructure;
       

  /* Time base configuration */                 
  TIM_TimeBaseStructure.TIM_Period = 9999;       //当定时器从0计数到9999,即为10000次 10MS,为一个定时周期
  TIM_TimeBaseStructure.TIM_Prescaler = 71;            //设置预分频:72   1Mhz           1us
  TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1 ;        //设置时钟分频系数:不分频
  TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;  //向上计数模式

  TIM_TimeBaseInit(TIM8, &TIM_TimeBaseStructure);

  /* PWM1 Mode configuration: Channel1 */
  TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;            //配置为PWM模式1
  TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;       
  TIM_OCInitStructure.TIM_Pulse = 5000;           //设置跳变值,当计数器计数到这个值时,电平发生跳变
  TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_Low;  //当定时器计数值小于CCR1_Val时为低电平

  TIM_OC1Init(TIM8, &TIM_OCInitStructure);         //使能通道1

  TIM_OC1PreloadConfig(TIM8, TIM_OCPreload_Enable);

  TIM_ARRPreloadConfig(TIM8, ENABLE);                         // 使能TIM8重载寄存器ARR

  /* TIM3 enable counter */
  TIM_Cmd(TIM8, ENABLE);                   //使能定时器8
  TIM_CtrlPWMOutputs(TIM8,ENABLE);       
} 此帖出自小平头技术问答
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。