请问原子哥,我先用定时器上升沿,开始测高电平时间,在下降沿捕获中断读取高民平时间,然后我想关闭,处理完自己想要处理的事情后再开启这个定时器的捕获中断,这时候测得的就不准了,。。。如果我没有去碰定时器的捕获中断,就能正常测得高电平时间。以下,是我的程序:
这是中断服务程序:
u16 Tim_Date; //测得的时间
u8 Tim_Dateh; //上升沿,下降沿处理标志位
u8 Recive_OK; //测完标志位
void TIM2_IRQHandler(void)
{
if(TIM_GetITStatus(TIM2, TIM_IT_CC1)==SET){
if(Tim_Dateh==1){
TIM_ITConfig(TIM2, TIM_IT_CC1, DISABLE); //关闭TIM中断
Tim_Date = TIM_GetCapture1(TIM2);
TIM_OC1PolarityConfig(TIM2, TIM_ICPolarity_Rising); //CC1P=1 设置为上升沿捕获
Recive_OK = 1;
}
if(Tim_Dateh==0){
TIM_SetCounter(TIM2, 0); //将计数器清0
Tim_Date = 0;
TIM_OC1PolarityConfig(TIM2, TIM_ICPolarity_Falling); //CC1P=1 设置为下降沿捕获
Tim_Dateh=1;
}
}
TIM_ClearITPendingBit(TIM2, TIM_IT_CC1);
}
下面是主函数:
int main(void)
{
delay_init(72);
SystemInit();
uart_init(9600);
LCD_Init();
LED_Init();
Tim_Cap_Init(65535, 71); //以1M频率计时,一次1us
  OINT_COLOR = RED;
while(1){
if(Recive_OK==1){
LCD_ShowNum(100, 100, Tim_Date, 10, 16);
delay_ms(1000);
delay_ms(1000);
delay_ms(1000);
delay_ms(1000);
Recive_OK=0;
Tim_Dateh = 0;
TIM_ITConfig(TIM2, TIM_IT_CC1, ENABLE); //使能TIM中断
}
}
}
我还有几个疑问:
1.为什么一初始化完定时器,UIF就立刻置1?
2.如果我们使能完定时器后,CNT就自己开始计数吗?当计数到我们所设定的值时,UIF也会置1 吗?
希望会的大神们,及原子哥能帮忙解答一下,。
学了STM32的定时器中断,感觉比51更需要注意很多细节。
|