miraclexue 发表于 2018-7-4 13:54:46

关于定时器开关操作的一些疑问

我的代码设置如下:
定时器配置为向上计数模式,计数间隔为1us,10us中断一次关闭定时器,在中断中处理完后再打开定时器,再过10us进中断,如此循环下去。
开关定时器方法:
定时器中断函数()
{
   关闭定时器,CEN位=0;----------------此时CNT寄存器有时是0,有时是1,为什么呢?
   执行处理代码;
   打开定时器,CEN位=1;----------------CNT计数起点受制于前面,如果是1,那么下次9us后进入中断,而不是10
}
疑问:
进入中断后,立即关闭定时器时,CNT寄存器停住的值可能每次不一样,导致开启定时器时计数起点不同。难道芯片每次进入中断后运行到关闭定时器的那行代码的时间会变化吗?代码编译完成后执行时间不都是固定的吗?大神能否解释一下?


想到的解决办法:
1、添加对CNT寄存器设置操作
定时器中断函数()
{
   关闭定时器,清除CEN位;
   执行处理代码;
CNT = 0;----------------设置为0,让其每次都从0开始计数
   打开定时器,设置CEN位;
}

2、将定时器设置为单脉冲模式----onePulse,查看参考手册发现设置为单脉冲模式,定时器溢出后自动停止计数器。


以上两种方法是否可行?哪种方法好呢。请大神指点!谢谢!


jakecumt 发表于 2018-7-5 17:14:58

进入中断的 同时你把寄存器的值拷贝出来,看看每次的值是不是一样,进入中断在关闭这段时间,定时器可能会有变化。

miraclexue 发表于 2018-7-5 17:33:49

jakecumt 发表于 2018-7-5 17:14
进入中断的 同时你把寄存器的值拷贝出来,看看每次的值是不是一样,进入中断在关闭这段时间,定时器可能会 ...

对, 进入中断后判断状态寄存器标志位这些操作会占用一定的时间,计数器仍然在计数,请问如果我的设计不变,改成单脉冲方式,会不会解决我的上面的问题?

jakecumt 发表于 2018-7-5 17:36:53

miraclexue 发表于 2018-7-5 17:33
对, 进入中断后判断状态寄存器标志位这些操作会占用一定的时间,计数器仍然在计数,请问如果我的设计不 ...

不好意思 单脉冲的我没有试过

xiaoshen-372360 发表于 2018-8-22 09:29:56

可以直接在中断函数里面处理,进入中断函数则表示计数溢出,此时就关闭中断,如果不想关闭函数,则只需要在加入一个标志位,当标志位为1 的时候才发出脉冲

majianhui 发表于 2018-8-23 16:10:36

10us这么小的中断时间?us应该是处理器指令周期量级了,这样的程序风险很大
页: [1]
查看完整版本: 关于定时器开关操作的一些疑问