|
直接使用软件延时效果不是很好,听网上大神的意见:小弟想使用定时器中断来做
——你需要多精确的延时呀?说的是我之前写的那个小范例吗?
从你上一个帖子内容看,你只是想做一个按键消抖,对于这个应用而言,延时1毫秒和1.5毫秒的相差其实不大,如果需要更精确,可以将中断周期调小一些,然后通过计数的办法来实现更为精确的延时操作,这样误差最大也就一个中断周期。
举个例子来说,将定时器中断设置为10微秒,100个周期之后是1毫秒,假如在设定延时100个整数周期,那么实际延时周期就是990微秒到1000微秒之间,这个误差对于你的消抖来说是完全可以忍受的。
于是,关键来了:定时器中断可以让它一直跑着,作为一个延时的基础外设来使用,根本就没有必要去关掉它。中断设置固定周期,中断服务函数里就是if(XXX>0)XXX--;那么在不需要中断来延时的时候,让XXX=0即可,中断服务执行条件就不成立,中断服务相当于在空跑。
需要用到中断延时的时候,直接对XXX赋值,那么就会延时XXX个周期。
如果阻塞性延时语句,那么还可以在对XXX赋值之后进入休眠模式,然后在中断服务里再加一条语句:
if(Wakeup_Flag&&XXX==0)EXIT_LPMX;
在Wakeup_Flag为真的情况下,定时周期到了之后唤醒单片机执行后续的程序。
这是两种不同的延时风格,一种是后台延时,在延时周期里某个变量大于0,周期性检测,在这个变量大于0的情况下不执行某条语句从而实现延时,适合多线程的程序架构。
第二种延时风格就是延时期间不执行任何语句,属于阻塞性的延时。在MSP430里,一般将CPU关断进入低功耗模式,在定时周期到了之后再唤醒单片机执行后续的操作。 |
赞赏
-
1
查看全部赞赏
-
|