打印

关于STM32定时器的问题,求解答求解答~~~·

[复制链接]
4144|8
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
不锈钢铁|  楼主 | 2011-3-29 21:46 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我原来在学习51单片机的时候知道51的定时器可以当一个“闹钟”用,就是打开它,然后让它一直计数,加到预先设定的值后进入中断。我刚开始接触STM32,也想这么试一下,所以没使用TIM的任何通道,就是设置了时间基,然后打开定时器,但是计数器加到预装载值后,为什么进不去中断呢????求哪位专家帮忙解答下,小弟先行谢过了。
这是我写的程序,
主程序:int main(void)
{
// u32 cnt = 0x000fffff;
  /* System Clocks Configuration */
  RCC_Configuration();
  NVIC_Configuration();
  /* Configure the GPIO ports */
  GPIO_Configuration();
  timer_configuration();
}
设置定时器:void timer_configuration(void)
{
  TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
  TIM_DeInit(TIM3);         /* deinitiate */
  TIM_TimeBaseStructure.TIM_Period =800;   
  TIM_TimeBaseStructure.TIM_Prescaler=0x5;
  TIM_TimeBaseStructure.TIM_ClockDivision=0x0;
  TIM_TimeBaseStructure.TIM_CounterMode =TIM_CounterMode_Up;  
  TIM_TimeBaseInit(TIM3,&TIM_TimeBaseStructure);

  TIM_Cmd(TIM3, ENABLE);
  TIM_ITConfig(TIM3,TIM_IT_CC1,ENABLE);
  TIM_iTConfig(TIM3,ENABLE);
}
沙发
不锈钢铁|  楼主 | 2011-3-29 21:52 | 只看该作者
这是中断嵌套部分的设置:
void NVIC_Configuration(void)
{
  NVIC_InitTypeDef NVIC_InitStructure;

  NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);

  NVIC_InitStructure.NVIC_IRQChannel = TIM3_IRQn;
  NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
  NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
  NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
}

使用特权

评论回复
板凳
不锈钢铁|  楼主 | 2011-3-30 08:15 | 只看该作者
求助啊~~

使用特权

评论回复
地板
wz232600| | 2011-3-30 08:33 | 只看该作者
确定定时器工作了么?
定时器的时钟源选择了么?

使用特权

评论回复
5
airwill| | 2011-3-30 12:47 | 只看该作者
好象没有给 TIM3 打开时钟吧? 再看看
其实你这个功能用 Systick 更合适, 用 TIM3 有点浪费

使用特权

评论回复
6
lu150| | 2011-3-30 16:39 | 只看该作者
#include"stm32f10x_lib.h"

void RCC_Configuration(void);
void NVIC_Configuration(void);
void Timer_Configuration(void);
void GPIO_Configuration(void);

int main(void)
{
#ifdef debug
  debug();
#endif
  RCC_Configuration();
  NVIC_Configuration();
  Timer_Configuration();
  GPIO_Configuration();
  while(1)
  {

  }
}

void RCC_Configuration(void)
{
   ErrorStatus HSEStartUpStatus;
   /* RCC system reset(for debug purpose) */
   RCC_DeInit();
   /* Enable HSE */
   RCC_HSEConfig(RCC_HSE_ON);  //设置外部高速晶振(HSE)          HSE晶振ON
   /* Wait till HSE is ready */
   HSEStartUpStatus = RCC_WaitForHSEStartUp();  //等待HSE起振
   if(HSEStartUpStatus == SUCCESS)//          该函数将等待直到HSE就绪,或者在超时的情况下退出
   {                                                                 //SUCCESS:HSE晶振稳定且就绪  ERROR:HSE晶振未就绪
    /* HCLK = SYSCLK */
    RCC_HCLKConfig(RCC_SYSCLK_Div1);  //设置AHB时钟(HCLK)         系统时钟=AHB时钟  
    /* PCLK2 = HCLK */
    RCC_PCLK2Config(RCC_HCLK_Div1); //设置高速AHB时钟(PCLK2)        APB1时钟 = HCLK
    /* PCLK1 = HCLK/2 */
    RCC_PCLK1Config(RCC_HCLK_Div2);        //设置低速AHB时钟(PCLK1) APB1时钟 = HCLK / 2
    /* Flash 2 wait state */
    FLASH_SetLatency(FLASH_Latency_2); //设置代码延时值         2延时周期
    /* Enable Prefetch Buffer */
    FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable);  //使能或者失能预取指缓存          预取指缓存使能 ?
    /* PLLCLK = 8MHz * 9 = 56 MHz */
    RCC_PLLConfig(RCC_PLLSource_HSE_Div1, RCC_PLLMul_9);  //设置PLL时钟源及倍频系数
    /* Enable PLL */                            //PLL的输入时钟 = HSE时钟频率   PLL输入时钟 x 9
    RCC_PLLCmd(ENABLE);          //使能或者失能PLL
    /* Wait till PLL is ready */
    while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET)        //检查指定的RCC标志位设置与否  PLL就绪
    {
    }
    /* Select PLL as system clock source */
    RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK); //设置系统时钟(SYSCLK)         RCC_SYSCLKSource: 用作系统时钟的时钟源
    /* Wait till PLL is used as system clock source */
    while(RCC_GetSYSCLKSource() != 0x08) //返回用作系统时钟的时钟源         PLL作为系统时钟
    {
    }
    }
    /* Enable peripheral clocks --------------------------------------------------*/
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOD|RCC_APB2Periph_AFIO, ENABLE);        //使能GPIOD TIM2
        RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2,ENABLE);
}

void NVIC_Configuration(void)
{
    NVIC_InitTypeDef  NVIC_InitStructure;
#ifdef  VECT_TAB_RAM  
    /* Set the Vector Table base location at 0x20000000 */
        NVIC_SetVectorTable(NVIC_VectTab_RAM, 0x0);  
#else  /* VECT_TAB_FLASH  */
    /* Set the Vector Table base location at 0x08000000 */
    NVIC_SetVectorTable(NVIC_VectTab_FLASH, 0x0);  
#endif
        NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0);
        NVIC_InitStructure.NVIC_IRQChannel = TIM2_IRQChannel;  //TIM2全局中断 通道
        NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
        NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1; //
        NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
        NVIC_Init(&NVIC_InitStructure);
}


void Timer_Configuration(void)
{
    TIM_TimeBaseInitTypeDef         TIM_TimeBaseStructure;

        TIM_TimeBaseStructure.TIM_Period=2000; //自动重装载寄存器的值            1s
        TIM_TimeBaseStructure.TIM_Prescaler= (36000 - 1); //时钟预分频数
        TIM_TimeBaseStructure.TIM_ClockDivision=TIM_CKD_DIV1; //时钟分割0x00
        TIM_TimeBaseStructure.TIM_CounterMode=TIM_CounterMode_Up; //向上计数模式
        TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure);
        TIM_ClearFlag(TIM2, TIM_FLAG_Update); //清除溢出中断标志
        TIM_ITConfig(TIM2,TIM_IT_Update,ENABLE);//标志位 当TIM_IT_Update,ENABLE 定时时间到
        TIM_Cmd(TIM2, ENABLE);   
}

void GPIO_Configuration(void)
{
    GPIO_InitTypeDef GPIO_InitStructure;
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8|GPIO_Pin_9|GPIO_Pin_10|GPIO_Pin_11;   //推挽输出
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
    GPIO_Init(GPIOD, &GPIO_InitStructure);
}

void TIM2_IRQHandler(void)
{
  if(TIM_GetITStatus(TIM2,TIM_IT_Update)!=RESET)
         {
          TIM_ClearITPendingBit(TIM2 , TIM_FLAG_Update);
          if(ten==0x11)
           {
            GPIO_Write(GPIOD,0x0f00);
                ten=0x22;
           }
           else if(ten==0x22)
           {
                   GPIO_Write(GPIOD,0x0000);
                ten=0x33;
           }
           else if(ten==0x33)
           {
                GPIO_SetBits(GPIOD,GPIO_Pin_8|GPIO_Pin_10);
                ten=0x44;
           }
           else if(ten==0x44)
           {
                GPIO_ResetBits(GPIOD,GPIO_Pin_8|GPIO_Pin_10);
                ten=0x55;
           }
           else if(ten==0x55)
           {
                GPIO_SetBits(GPIOD,GPIO_Pin_9|GPIO_Pin_11);
                ten=0x66;
           }
           else
           {
           GPIO_ResetBits(GPIOD,GPIO_Pin_9|GPIO_Pin_11);
           ten=0x11;
           }
        }
}

使用特权

评论回复
7
lu150| | 2011-3-30 16:40 | 只看该作者
这是我当时的TIM学习程序 希望能对你有用

使用特权

评论回复
8
不锈钢铁|  楼主 | 2011-4-5 12:31 | 只看该作者
7# lu150


LZ开错中断了,应该像你给的里程这样开溢出更新的中断。谢了~

使用特权

评论回复
9
zj0914| | 2011-4-6 10:43 | 只看该作者
给你一个我的
void TIM2_int(void)
{
  TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
  TIM_OCInitTypeDef  TIM_OCInitStructure;

  /* Time base configuration */
  TIM_TimeBaseStructure.TIM_Period = 18000;
  TIM_TimeBaseStructure.TIM_Prescaler = 0;
  TIM_TimeBaseStructure.TIM_ClockDivision = 0x0;
  TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_CenterAligned3;
  TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure);

  TIM_ARRPreloadConfig(TIM2,DISABLE);
  /* only counter overflow/underflow generate U interrupt */
  TIM_UpdateRequestConfig(TIM2,TIM_UpdateSource_Global);

  /* Output Compare Timing Mode configuration: Channel1 */
  TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1 ;
  TIM_OCInitStructure.TIM_Pulse = 5455;
  TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
  TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;
  TIM_OC3Init(TIM2, &TIM_OCInitStructure);

  TIM_OC3PreloadConfig(TIM2, TIM_OCPreload_Enable);
  
  
  TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_Timing;
  TIM_OCInitStructure.TIM_Pulse = 9000;
  TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;
  TIM_OC2Init(TIM2, &TIM_OCInitStructure);

  TIM_OC2PreloadConfig(TIM2, TIM_OCPreload_Disable);
  

  /* TIM IT enable */
  TIM_ITConfig(TIM2, TIM_IT_CC3 | TIM_IT_CC2 , ENABLE);

  /* TIM2 enable counter */
  //TIM_Cmd(TIM2, ENABLE);
}
用时TIM_Cmd(TIM2, ENABLE);
就可以了

使用特权

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

本版积分规则

31

主题

730

帖子

5

粉丝