关闭

定时器TimeBase设置无效问题

标签: 中断ARM
427人阅读 评论(0) 收藏 举报
分类:
今天来公司移植回充部分代码,在设置定时器(用于采集回冲红外信号)周期时发现改变TIM_TimeBaseStructure的成员变量TIM_Period和TIM_Prescaler均无效,令我十分不解。

定时器设置代码如下:
void TIM5_Init(double T)
{
    u8 Count=T*10;     //T的单位ms
   TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
    RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM5, ENABLE); //时钟使能

    TIM_TimeBaseStructure.TIM_Period = Count-1;  //重装值,
    TIM_TimeBaseStructure.TIM_Prescaler =7200-1; //分频系数,72M/7200=10KHz(0.1ms),其他依此类推
    TIM_TimeBaseStructure.TIM_ClockDivision = 0; //设置时钟分割:TDTS = Tck_tim
    TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;  //TIM向上计数模式
    TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure);     //把上述数值写入对应寄存器

    TIM_ITConfig(TIM5,TIM_IT_Update,ENABLE);            //使能或者失能指定的TIM中断
    TIM_Cmd(TIM5, ENABLE);  //使能TIMx外设                         
}
中断函数中处理如下:
void TIM5_IRQHandler(void)   //TIM2中断
{
    GPIO_WriteBit(GPIOG,GPIO_Pin_2,(1-GPIO_ReadInputDataBit(GPIOG,GPIO_Pin_2))); //电平翻转
}
每进一次中断函数改变一次PortG.2口的输出电平以输出方波,理论上方波周期T=T_timer*2,因为产生一周期方波需要两个周期定时器中断。但通过示波器观察PG2的输出方波频率为500kHz,即定时器周期1/(500k*2)=1us,该周期在改变TIM_Period或TIM_Prescaler值时均不变,所以不是定时器设置的问题,同时排除了定时器或中断嵌套等可能性。

最后检查代码发现原因就在于中断函数中没有关闭中断标志位,应该附上:
TIM_ClearITPendingBit(TIM5, TIM_IT_Update  );  //清除TIMx更新中断标志
由于一直有中断标志,程序不断执行中断函数TIM5_IRQHandler(),而STM32F103的指令执行时间是us级别,加上很短的响应时间,使得方波周期为1us。

结论是以后在中断函数中务必记得清中断标志位,以避免类似情况发生。

0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:12695次
    • 积分:357
    • 等级:
    • 排名:千里之外
    • 原创:24篇
    • 转载:0篇
    • 译文:0篇
    • 评论:0条
    文章分类