你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

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

[复制链接]
miraclexue 提问时间:2018-7-4 13:54 /
我的代码设置如下:
定时器配置为向上计数模式,计数间隔为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,查看参考手册发现设置为单脉冲模式,定时器溢出后自动停止计数器。


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


收藏 评论5 发布时间:2018-7-4 13:54

举报

5个回答
jakecumt 回答时间:2018-7-5 17:14:58
进入中断的 同时你把寄存器的值拷贝出来,看看每次的值是不是一样,进入中断在关闭这段时间,定时器可能会有变化。

评分

参与人数 1蝴蝶豆 +3 收起 理由
zero99 + 3

查看全部评分

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
对, 进入中断后判断状态寄存器标志位这些操作会占用一定的时间,计数器仍然在计数,请问如果我的设计不 ...

不好意思 单脉冲的我没有试过
shenxiaolin_mai 回答时间:2018-8-22 09:29:56
可以直接在中断函数里面处理,进入中断函数则表示计数溢出,此时就关闭中断,如果不想关闭函数,则只需要在加入一个标志位,当标志位为1 的时候才发出脉冲

评分

参与人数 1蝴蝶豆 +2 收起 理由
zero99 + 2

查看全部评分

majianhui 回答时间:2018-8-23 16:10:36
10us这么小的中断时间?us应该是处理器指令周期量级了,这样的程序风险很大

评分

参与人数 1蝴蝶豆 +2 收起 理由
zero99 + 2

查看全部评分

所属标签

相似问题

关于意法半导体
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
招聘信息
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版