定时器TimeBase设置无效问题

原创 2016年08月30日 20:15:24
今天来公司移植回充部分代码,在设置定时器(用于采集回冲红外信号)周期时发现改变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。

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

版权声明:本文为博主原创文章,转载请声明出处:)

相关文章推荐

PCIe学习笔记(8)--- 配置地址空间

1. PCI的配置空间,其实是一种标准 避免了以前使用跳线,而产生的中断,IO,MEMORY等资源的分配冲突 从而体现了Plug & Play的设计思想 2. 每一个FUNCTION对应一个CON...

3.2 PCI设备的数据传递

PCI设备的数据传递使用地址译码方式,当一个存储器读写总线事务到达PCI总线时,在这条总线上的所有PCI设备将进行地址译码,如果当前总线事务使用的地址在某个PCI设备的BAR空间中时,该PCI设备将使...
  • mao0514
  • mao0514
  • 2013年07月22日 16:27
  • 1123

RocketMQ消费者,设置setConsumeFromWhere无效的问题

今天用了阿里开源的RocketMQ,第一次消费,使用新的consumserGroup消费,设置 consumer.setConsumeFromWhere(ConsumeFromWhere.CON...

Android ProgressBar setProgressDrawable 设置无效问题

ProgressBar的背景设置xml时可以使用,但代码setProgressDrawable设置则无效。 layer-list如下: ...

android 解决vedeoView设置高度无效的问题

在android中,是不允许给VideoView自行设置高度的,宽度是可以的,所以只能通过自定VideoView来设置高度,具体步骤如下: 1.在项目的values文件夹下建立文件attrs.xml...

vs2005 C++ 空工程设置断点无效的问题

新建空白工程时,突然发现程序设置断点不能使用。 解决方法如下: 工程属性-->Configuration Properties-->Linker-->Debugging-->Generate De...

使用ueditor时placeholder设置无效问题应对办法

基本思路:当用户要使用编辑器输入文本时,再对输入框进行实例化,当编辑器失去焦点时,根据输入内容是否为空,进行应对判断是否销毁ueditor对象 代码: ueditor #editor { ...
  • jbk3311
  • jbk3311
  • 2017年03月07日 21:25
  • 1002
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:定时器TimeBase设置无效问题
举报原因:
原因补充:

(最多只允许输入30个字)