情景描述:
外部脉冲接到OKI482的IO口中断,使用IO中断测量脉冲频率(周期)。
配置一个16位的定时器,定时器定时周期为1s,定时器时钟源为32768Hz。
在IO中断中读取定时器计数器的值TM1C和TM0C,脉冲到来的时间为 (TM1D*256 + TM0D + 系统秒*32768),单位为1/32768秒。
在调试中发现程序计算得到的结果(时间值)和TM1D、TM0D的值相差20。程序如下:
1. c = TM1C;
2. c <<= 8;
3. c += TM0C;
4. temp = time1*32768;
5. c += temp;
原因在于程序第三行读取TM0C的值的时候该寄存器的值已经发生了变化。所以应该进入中断后首先读取寄存器的值,然后在进行处理。而且,应该先读取TM0D,后读取TM1D,因为TM0D是计数器的第八位。
代码如下:
1. d = TM0C;
2. c = TM1C;
3. c <<= 8;
4. c += d;
5. temp = time1*32768;
6. c = c + temp;
小结,与使用430硬件捕获的区别。
在使用430硬件捕获的时候,当脉冲上升沿或下降沿来临的时候定时器计数器的值会由硬件拷贝到另一个读取寄存器,进入捕获中断后软件只需要直接读取该寄存器即可。