sky-Hawk where 发表于 2015-7-28 16:10:36

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

用的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--;
                        }

}}


sky-Hawk where 发表于 2015-7-31 09:54:02

你仿真调试下   看看具体的寄存器工作没
页: [1]
查看完整版本: STM32两个普通定时器,一个正常中断,一个不中断

Baidu
map