这是你在15楼的提问: 第三个原因:为什么即使不加这2行代码,如果用触发模式启动定时器还是会进更新中断?即使把URS位置一也无效,这也是疑问3,也是最大的疑问。 TIM_TimeBaseStructure.TIM_Period = 6000; TIM_TimeBaseStructure.TIM_Prescaler = 65535; TIM_TimeBaseStructure.TIM_ClockDivision = 0; TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; TIM_TimeBaseInit(TIM4, &TIM_TimeBaseStructure);
TIM_ICStructInit(&TIM_ICInitStructure); TIM_ICInitStructure.TIM_ICMode = TIM_ICMode_ICAP; TIM_ICInitStructure.TIM_Channel = TIM_Channel_1; TIM_ICInitStructure.TIM_ICPolarity = TIM_ICPolarity_Falling; TIM_ICInitStructure.TIM_ICSelection = TIM_ICSelection_DirectTI; TIM_ICInitStructure.TIM_ICPrescaler = TIM_ICPSC_DIV1; TIM_ICInitStructure.TIM_ICFilter = 0; TIM_ICInit(TIM4, &TIM_ICInitStructure); TIM_ClearFlag(TIM4, TIM_FLAG_Update); TIM_ITConfig(TIM4, TIM_IT_Update , ENABLE); /* Input Trigger selection */ TIM_SelectInputTrigger(TIM4, TIM_TS_TI1FP1); /* Slave Mode selection: Trigger Mode */ TIM_SelectSlaveMode(TIM4, TIM_SlaveMode_Trigger); while (1);
我的问题是:何时进的中断,你怎么知道那不是你要的?
另外,给你一个诊断的思路:
1)定义2个全局变量: vu32 count1, count2;
2)在while循环中对这2个变量不断递加: count1 = count2 = 0; while (1) { count1++; if (count1==0) count2++; }
3)在更新中断中放置调试断点,并通过调试器设置"调试时停止定时器计数"位,这个位的作用是程序在断点处停止时,定时器的计数器会暂停。
4)每次停在上述断点时,记录下count1和count2的数值,通过比较可以大致知道,每次进入中断的时间,借次可以判断(猜测)更新中断产生的原因。
在此之前我并没有看过库函数的代码,我就是用这个方法,发现你的程序在加了那2行后,第1次进更新中断与以后进更新中断的时间有某种倍数关系,从而判断预分频数值在第1次没有生效,最后进到相应函数找到根源。
你可以试试用这个方法,追踪一下看看能否找到问题。 |