Linchpin 发表于 2014-6-16 12:41
再往下0.1HZ,再往上1MHZ好像也可以做到,但是代码中还有些bug,有时候会测不准。
因为给的题目中要求比 ...
中断服务函数里头的变量不能这么声明~ .~... (这样的话进不了中断,觉得应该作全局变量声明)。其他的我跑了一下,没啥大问题(删了一些冗余的东西,然后取了个平均,用生成的方波试了一下,精度在+-1这样,上限还没试验),蛮好的,学习了~
我稍微读了一下代码,感觉这个测频的思路应该是利用两次中断来获取两次上升沿的时间差(这样频率的最后一位各种乱跳,我就取了1000次平均,还算消停了点~),然后用系统频率除掉这个时间得到频率,我看了半天那个flag==3是啥玩意~ .~... 真不懂,我觉得用i就可以判断了。
后来我将中断服务函数改成了下面的代码(将TimerIntClear函数放在了最后)。
void WTimer0AIntHandler(void)
{
t = TimerValueGet64(WTIMER0_BASE); // 分两次获取WTimer0的值,存入t[0]和t[1]中
i += 1;
if (i == 2) // t[0]和t[1]都获取完成
{
time = t[1] - t[0];
freq = SysCtlClockGet() / time;
sumFreq += freq;
sampleTimes += 1;
if (sampleTimes == 1000) // 取1000次平均
{
_disp(sumFreq / 1000);
Disp_Str(1, 0, Data);
sampleTimes = 0;
sumFreq = 0;
}
i = 0;
}
TimerIntClear(WTIMER0_BASE, TIMER_CAPA_EVENT); // 清除WTimer0捕获器A的中断标志位
}
所以我觉得你删掉那个flag,说不定就行了{:1_103:}~