1回答

0收藏

STM32两个普通定时器,一个正常中断,一个不中断

#开源分享 #开源分享 3034 人阅读 | 1 人回复 | 2015-07-28

用的STM32F103RB,设置了两个TIM定时器TIM2和TIM3,产生中断后计数,通过Jlink查看计数值,来判断中断执行情况。
现在其中一个定时器TIM3中断,可以正常进行(正常计数)。另一个TIM2中断,就没法产生中断(因为计数变量没有变化)。
这两个中断程序基本是一样的,求大神们帮忙看看为什么TIM2就不能中断呢?

void NVIC_Configuration(void)             //中断优先级
{
  NVIC_InitTypeDef NVIC_InitStructure;

  /* Configure the NVIC Preemption Priority Bits */  
  NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);                  

  /* Enable the USART1 Interrupt */
        NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 3;
  NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;                                    
  NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3;
  NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
  NVIC_Init(&NVIC_InitStructure);
  /* Enable the USART2 Interrupt */
        NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;
  NVIC_InitStructure.NVIC_IRQChannel = USART2_IRQn;                          
  NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;
  NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
  NVIC_Init(&NVIC_InitStructure);       

        /* Enable the TIM3 Interrupt */
        NVIC_InitStructure.NVIC_IRQChannel = TIM3_IRQn;      
        NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 2;
        NVIC_InitStructure.NVIC_IRQChannelSubPriority = 2;
        NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
        NVIC_Init(&NVIC_InitStructure);       
       
        /* Enable the Motor 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 TIM3_Config(void)
{
        TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
        TIM_DeInit(TIM3);       
        RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3,ENABLE);                                       
       

        TIM_TimeBaseStructure.TIM_Period = 2000 - 1;                       
        TIM_TimeBaseStructure.TIM_Prescaler = 8400 - 1;               
        TIM_TimeBaseStructure.TIM_ClockDivision = 0x0;                                                       
        TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;       
        TIM_TimeBaseInit(TIM3,&TIM_TimeBaseStructure);       
        TIM_ClearFlag(TIM3,TIM_FLAG_Update);                                                        
        TIM_ITConfig(TIM3,TIM_IT_Update,ENABLE);
        TIM_Cmd( TIM3, ENABLE);                                                                                                               
}


void TIM2_Config(void)
{
        TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
        TIM_DeInit(TIM2);       
        RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2,ENABLE);                                       
       

        TIM_TimeBaseStructure.TIM_Period = 2000 - 1;                       
        TIM_TimeBaseStructure.TIM_Prescaler = 8400 - 1;               
        TIM_TimeBaseStructure.TIM_ClockDivision = 0x0;                                                       
        TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;       
        TIM_TimeBaseInit(TIM2,&TIM_TimeBaseStructure);       
        //TIM_ARRPreloadCongig(TIM2,ENABLE);               
        TIM_ClearFlag(TIM2,TIM_FLAG_Update);                                                        
        TIM_ITConfig(TIM2,TIM_IT_Update,ENABLE);
        TIM_Cmd( TIM2, ENABLE);                                                                                                       
}

/*******************************************************************************

* Function Name  : TIM3_IRQHandler

* Description    : This function handles TIM3 global interrupt request. Count for 1min

* Input          : None

* Output         : None

* Return         : None

* Global                                 : Count1min

******************************************************************************/
u8 Count1min=59;        //1s->1min

void TIM3_IRQHandler(void)
{
        if(TIM_GetITStatus(TIM3, TIM_IT_Update) != RESET)    //?ì????·?·??ú?????ü??????
        {
                TIM_ClearITPendingBit(TIM3 , TIM_FLAG_Update);//                ?????????????í??         
                if(Count1min == 0)                   //??60s
                        {
                                GPIOC->ODR ^= GPIO_Pin_6;
                                //Count1min=59;                                       
                        }
                        else                            //for test                       
                        {
                                Count1min--;
                        }  
         }        
}

/*******************************************************************************

* Function Name  : TIM2_IRQHandler

* Description    : This function handles TIM2 global interrupt request.

* Input          : None

* Output         : None

* Return         : None

* Global                                 : delay

******************************************************************************/

        u8 Count1min4=59;        //1s->1min

void TIM2_IRQHandler(void)
{
        u8 outflag;

        if(TIM_GetITStatus(TIM2, TIM_IT_Update) != RESET)   
        {
                TIM_ClearITPendingBit(TIM2 , TIM_FLAG_Update);
                if(Count1min4 == 0)                  
                        {
                                GPIOC->ODR ^= GPIO_Pin_2;
                                Count1min4=59;                                       
                        }
                        else                            //for test                       
                        {
                                Count1min4--;
                        }  

}}


评分

参与人数 1与非币 +5 收起 理由
loveeeboard + 5 三周年铜板双倍!

查看全部评分

分享到:
回复

使用道具 举报

回答|共 1 个

倒序浏览

沙发

#define

发表于 2015-7-31 09:54:02 | 只看该作者

你仿真调试下   看看  具体的寄存器工作没  
您需要登录后才可以回帖 注册/登录

本版积分规则

关闭

站长推荐上一条 /3 下一条