|
谈谈目前我的想法:
依然采用PWM_INPUT模式,当频率>=36MHz/65536 = 549.31Hz时,原PWM_INPUT中断处理方式等都不变。
当频率<549.31Hz时,当CNT达到65536时,肯定还没有一个周期结束,此时CNT归零,产生一个UIF事件中断位。TIM肯定进中断,中断里面记录这次计数值count,并清零SR的bit[0]。因为CC1IF此时肯定还未触发,所以理论上继续进中断,如果CNT溢出,则下一次中断count值++。
中断服务程序先判SR的bit[0],再判bit[1]. 当周期结束的时候,肯定会进入CC1IF,bit[1]的处理,此时读出CNT值,再加上count*65536,那么整个值就应该是周期值了。
不过在具体操作时,我先Flow输入600Hz,理论上应该计数值未溢出,直接就中断里面判断CC1IF了。count应该还是0,但是好像SR的bit[0]位进了许多次,count值我发觉有0x15,不知道是哪里有问题。请教了。谢谢了。
附tim中断,IT_Update和IT_CC1中断都已打开:
IT_Status = TIM4->SR & (TIM_IT_CC1 | TIM_IT_Update);
IT_Enable = TIM4->DIER & (TIM_IT_CC1 | TIM_IT_Update);
IT_Flag = IT_Status & IT_Enable;
TIM4->SR = (INT16U)(~(TIM_IT_CC1 | TIM_IT_Update));
if (ValBit(IT_Flag, 0))
{
O4FLOW2_FreqA_Step_CNT1++; //初始值是0
TIM4->SR &= 0xfffe;
}
//==
if (ValBit(IT_Flag, 1))
{ // TIM_IT_CC1
// Clear TIM2 Capture compare interrupt pending bit
TIM_ClearITPendingBit(TIM4, TIM_IT_CC1);
// Get the Input Capture value
O4Flow2_FreqA_IC1Value1 = TIM_GetCapture1(TIM4);
if (O4Flow2_FreqA_IC1Value1 != 0)
{
// Duty cycle computation
//DutyCycle = (TIM_GetCapture1(TIM2) * 100) / IC2Value;
O4Flow2_FreqA_IC1Value1 += 0x10000*O4FLOW2_FreqA_Step_CNT1;
// Frequency computation
O4Flow2_FrequencyA = 36000000000 / O4Flow2_FreqA_IC1Value1;
}
else
{
//DutyCycle = 0;
O4Flow2_FrequencyA = 0;
}
} |
|