在一个样板上控制几个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);
}
此帖出自
小平头技术问答
一周热门 更多>