新手求助:STM32f103c8外部中断与定时问题

2019-03-23 19:22发布

在一个样板上控制几个IO,由外部按钮来触发开始动作,采用定时器Timer2进行I/O 动作计时. 在进入外部中断的时候,Timer2 似乎停止了工作, 从而造成死机状态. 必须在中断函数最后增加:TIM_Cmd(TIM2,ENABLE),才能启动定时器跳出定时函数. 现遇到以下问题请大神指点:
1.外部中断的时候是否会是TIM2工作停止;
2.想先读取定时器计数值,中断完毕后在把当前值写如计数器起始计数中,增加以下代码:
uint16_t    count;
count=TIM_GetCounter(TIM2);但编译提示count未使用.更改成count=TIM2->CNT,也是这样
手册上此寄存器也是可读写的,请问这些寄存器该如何操作!!

以下是相关程序部分:

main:
        GPIO_Config();
        GPIO_EXIT_Init();
        NVIC_GPIO_EXIT();
        timer2_config();
        IWDG_Init();
        RCC->CFGR &= ~0x00000003;//系统时钟清0
        RCC->CFGR |=  0x00000001;//选择外部晶振作为时钟
        while(1)
        {
                        IWDG_ReloadCounter();
                        if(start_test)
                        {
                                test_sets=GPIO_ReadInputData(GPIOA);
                                test_sets=~test_sets;
                                if(0==(test_sets&0x07))
                                                relay_time=500;
                                else
                                                relay_time=1000*(test_sets&0x07);
                                relay_110V_enable=(test_sets>>3)&0x01;
                                relay_220V_enable=(test_sets>>4)&0x01;
                                delay_time=((test_sets>>5)+1)*100;
                       
                                testseq(relay_time,delay_time,relay_110V_enable,relay_220V_enable);
                                start_test=0;
                        }
        }
}


外部中断:

void EXTI15_10_IRQHandler(void)
{

        if( EXTI_GetITStatus(EXTI_Line10) != RESET )
        {
                EXTI_ClearFlag(EXTI_Line10);
                EXTI_ClearITPendingBit(EXTI_Line10);
                tim2_delayms(100);
                if(RESET==GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_10))
                                {start_test=1;}
        }

        //TIM_Cmd(TIM2,ENABLE);
}

定时程序:

void tim2_delayms(uint16_t time)
{       
                TIM_SetCounter(TIM2,0);
                TIM_SetAutoreload(TIM2,time);
                START_TIM2();
                while(TIM_GetFlagStatus(TIM2,TIM_FLAG_Update)!=SET);
                STOP_TIM2();
                TIM_ClearFlag(TIM2,TIM_FLAG_Update);
} 此帖出自小平头技术问答
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。