打印

STM32的高级定时器TIM1产生定时中断的问题?!

[复制链接]
7291|3
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
jtingwang|  楼主 | 2008-3-22 16:57 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
准备用TIM1的Out Cmp功能来产生4个定时中断,下面的设置,却进不去中断服务程序?有什么问题吗?

  /* Time Base configuration */
  TIM1_TimeBaseStructure.TIM1_Prescaler = 0;
  TIM1_TimeBaseStructure.TIM1_CounterMode = TIM1_CounterMode_Up;
  TIM1_TimeBaseStructure.TIM1_Period = 65535;     TIM1_TimeBaseStructure.TIM1_ClockDivision = 0;
  TIM1_TimeBaseStructure.TIM1_RepetitionCounter = 0;

  TIM1_TimeBaseInit(&TIM1_TimeBaseStructure);

  /* Channel 1, 2,3 and 4 Configuration in Timing mode */
  TIM1_OCInitStructure.TIM1_OCMode = TIM1_OCMode_Timing;  TIM1_OCInitStructure.TIM1_OutputState = TIM1_OutputState_Enable; 
  TIM1_OCInitStructure.TIM1_OutputNState = TIM1_OutputNState_Enable;                  
  TIM1_OCInitStructure.TIM1_Pulse = CCR1_Val; 
  TIM1_OCInitStructure.TIM1_OCPolarity = TIM1_OCPolarity_Low; 
  TIM1_OCInitStructure.TIM1_OCNPolarity = TIM1_OCNPolarity_Low;         
  TIM1_OCInitStructure.TIM1_OCIdleState = TIM1_OCIdleState_Reset;
  TIM1_OCInitStructure.TIM1_OCNIdleState = TIM1_OCIdleState_Reset;          
  
  TIM1_OC1Init(&TIM1_OCInitStructure);
  TIM1_OC1PreloadConfig(TIM1_OCPreload_Disable);
  TIM1_ITConfig(TIM1_IT_CC1,ENABLE);

  TIM1_OCInitStructure.TIM1_Pulse = CCR2_Val;
  TIM1_OC2Init(&TIM1_OCInitStructure);
  TIM1_OC2PreloadConfig(TIM1_OCPreload_Disable);
  TIM1_ITConfig(TIM1_IT_CC2,ENABLE);

  TIM1_OCInitStructure.TIM1_Pulse = CCR3_Val;
  TIM1_OC3Init(&TIM1_OCInitStructure);
  TIM1_OC3PreloadConfig(TIM1_OCPreload_Disable);
  TIM1_ITConfig(TIM1_IT_CC3,ENABLE);

  TIM1_OCInitStructure.TIM1_Pulse = CCR4_Val;
  TIM1_OC4Init(&TIM1_OCInitStructure);
  TIM1_OC4PreloadConfig(TIM1_OCPreload_Disable);
  TIM1_ITConfig(TIM1_IT_CC4,ENABLE);

  /* TIM1 counter enable */
  TIM1_Cmd(ENABLE);
沙发
grant_jx| | 2008-3-23 10:53 | 只看该作者

时钟开了吗?

TIM1在APB2下面,用TIM1前你要开Clock

如:RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1, ENABLE);

我没仔细看你的代码,粗略的看了一下,顺带问问你是否有配置过RCC中APB2相关函数?

使用特权

评论回复
板凳
maxcontrol| | 2008-3-25 11:11 | 只看该作者

是在RAM中仿真的么?

我也遇到过这个问题。当时是在RAM中仿真,main程序可以运行,就是进不去TIM1定时中断。后来发现有两个地方设置有问题:
1) NVIC的设置中需要Remap中断向量至RAM中
2) NVIC的设置中需要打开TIM1定时中断的通道。

例程如下:
#define VECT_TAB_RAM  //重新remap中断向量地址
/*******************************************************************************
* Function Name  : NVIC_Configuration
* Description    : Configures Vector Table base location.
* Input          : None
* Output         : None
* Return         : None
*******************************************************************************/
void NVIC_Configuration(void)
{
    //ITStatus status;
    //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

    //Enable the TIM1 Interrupt 
    NVIC_InitStructure.NVIC_IRQChannel = TIM1_UP_IRQChannel;
    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
    NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
    NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
    NVIC_Init(&NVIC_InitStructure);



    status = NVIC_GetIRQChannelActiveBitStatus(TIM1_UP_IRQChannel);
    status = status;
}

使用特权

评论回复
地板
越狱兔哥哥| | 2016-2-16 09:29 | 只看该作者
也遇到同样的问题,通用定时器换高级之后,进步了中断

使用特权

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

本版积分规则

67

主题

171

帖子

1

粉丝