我用Timer的Input Capture功能的时候,发现怎么也测不到方波的周期。 但是独立写一个测试程序是没有问题的,感到很奇怪。 于是看我所用的FWLib版本,是1.0的原始版,2007年的,最新的版本是08年9月份的。 于是备份代码,然后换新的FWLib,问题依然存在。
因为我用Timer2用了2个用途,一个是测频率,一个是测周期。 测频率是外部触发做时钟,测周期用的是Input Capture功能。
后来分析发现是“TIM_InternalClockConfig”的问题,无法从“TIM_ETRClockMode2Config”设置的环境中恢复回来。 而小Demo做测试时候,Reset后寄存器的默认状态就是内部CLK计数的,所以不存在问题。
继续Trace进去,看看到底怎么缺斤短两了? TIM_InternalClockConfig是负责转换到内部CLK做时钟计数之用: void TIM_InternalClockConfig(TIM_TypeDef* TIMx) { /* Disable slave mode to clock the prescaler directly with the internal clock */ TIMx->SMCR &= SMCR_SMS_Mask; } 非常Easy,只有一句话,SMCR_SMS_Mask的定义是: #define SMCR_SMS_Mask ((u16)0xFFF0) 新版本的FWLib是0xFFF8
再看TIM_ETRClockMode2Config中有调用TIM_ETRConfig来设置外部触发,而TIM_ETRConfig对SMCR寄存器的修改如下: void TIM_ETRConfig(..........) { u32 tmpsmcr = 0;
tmpsmcr = TIMx->SMCR;
/* Set the Prescaler, the Filter value and the Polarity */ tmpsmcr &= SMCR_ETR_Mask; tmpsmcr |= TIM_ExtTRGPrescaler | TIM_ExtTRGPolarity | (u16)((u16)ExtTRGFilter << 8);
TIMx->SMCR = (u16)tmpsmcr; }
SMCR_ETR_Mask是个非常重点的Mask,找它的define去: #define SMCR_ETR_Mask ((u16)0x00F7)
问题找到了,就是那个太Easy的函数干活缺斤少两造成的。 |