高手帮忙解释一下定时器的时间怎么算的?!

2019-03-24 15:14发布

比如下面这段代码:
void main(void)
{
WDTCTL = WDTPW + WDTHOLD; //停止看门狗定时器
P1DIR |= 0x01; // 设P1.0为输出
//TA1CTL = RT1SSEL_0 + MC_2 + TAIE; // ACLK, 定时器A计数模式,且开中断功能
TA1CTL=TASSEL_2+ID_3+MC_1; //SMCLK(8KHZ). 8分频。 UP to CCR0 1Us
TA0CCR0 = 2000;
_BIS_SR(LPM3_bits + GIE); //进入LPM3 低功耗模式和开总中断允许
}

#pragma vector=TIMER0_A1_VECTOR
__interrupt void Timer_A(void)
{
     P1OUT ^= BIT0;
}
就是从0开始计数到TA0CCR0(2000)结束吧?
哪计2000下总共用了多长时间呢?就是从下面这句得来的吧?
TA1CTL=TASSEL_2+ID_3+MC_1; //SMCLK(8KHZ). 8分频。 UP to CCR0 1Us
具体怎么算的?辅助时钟+8分频+计数到2000?然后呢?

此帖出自小平头技术问答
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
6条回答
鸵鸟蝈蝈
1楼-- · 2019-03-24 20:08
< TA1CTL=TASSEL_2+ID_3+MC_1; //SMCLK(8KHZ). 8分频。 UP to CCR0 1Us
这句话定义了TimerA的时钟信号、工作模式等等。使用SMCLK作为TImerA的时钟信号,并且8分频。
SMCLK默认是由DCOCLK驱动的,DCOCLK默认的工作频率是1.1MHz(误差较大)左右(因为在你的程序中没有相应的设置所以都是默认设置的)。所以1个TimerA的count的时间是8/1.1*10^(-6) = 7.273 us,计数到2000是14.545ms
鸵鸟蝈蝈
2楼-- · 2019-03-24 21:18
 精彩回答 2  元偷偷看……
wuyanyanke
3楼-- · 2019-03-24 21:22
原帖由 鸵鸟蝈蝈 于 2011-12-12 16:05 发表 另外按照你的程序设计,TimerA的中断没有使能,无法进入中断ISR,改为: TA1CTL=TASSEL_2+ID_3+MC_1+ TAIE;

鸵鸟蝈蝈兄:
“SMCLK默认是由DCOCLK驱动的,DCOCLK默认的工作频率是1.1MHz(误差较大)左右(因为在你的程序中没有相应的设置所以都是默认设置的)”
一般来说做长时间定时的话都是使用哪种时钟源?
如果使用SMCLK源的方式的话要做哪些设置呢!?
这个板子是外带32.768K晶振的,那默认是使用外部晶振还是内部晶振?怎么设置才能使用外部晶振呢!?
非常感谢!
wuyanyanke
4楼-- · 2019-03-25 00:00
TA1CTL=TASSEL_0+ID_3+MC_1+ TAIE;

使用这种方式可以吗?
鸵鸟蝈蝈
5楼-- · 2019-03-25 05:05
 精彩回答 2  元偷偷看……
wuyanyanke
6楼-- · 2019-03-25 10:31
看了两遍!但是一到用的时候就犯迷糊!
在论坛上这样搞两下就清楚多了!

[ 本帖最后由 wuyanyanke 于 2011-12-13 14:00 编辑 ]

一周热门 更多>

相关问题

    相关文章