跪求高手指教(2812定时器0) - 一起学2812专区- likyo的专栏- DSP交流 ...
likyo 你好,书上关于DSP2812定时器CPUTIMO,我感觉说的很模糊,你能详细点给我说明下啊,尤其是CpuTimer0Regs.PRD.,CpuTimer0Regs.TPR.all ,CpuTimer0Regs.TPR.all 这几个寄存器能详细说明点吗,针对以下指令你能告诉我定时器的定时时间与CpuTimer0Regs.PRD.all = 0x249;CpuTimer0Regs.TPR.all = 0xFFFF;CpuTimer0Regs.TPR.all  = 0;有说明关系吗?他们之间应该怎么换算
0 i. n. H/ Q' D/ b: c
$ g% D9 ~. k7 k8 ~指令:
9 g0 Z) I1 p! X! W& R5 uCpuTimer0Regs.PRD.all = 0x249;//周期寄存器2 Z# Q$ r0 C( m& Q* m6 W5 M% {
6 C: H; L& D' n1 E! @& J9 @" }! q/ x
        CpuTimer0Regs.TPR.all = 0xFFFF;//预定标寄存器
0 D1 l" ]) Z/ y% oDSP交流网  DSP学习{dy}论坛 DSP技术应用与推广平台 DSP开发服务平台         CpuTimer0Regs.TPR.all  = 0;
楼主的问题解说起来确实不容易,呵呵,首先,我想楼主的程序是不是有问题的。
* C3 B; Z$ j/ y+ a$ z. a# i) H) BDSP交流网  DSP学习{dy}论坛 DSP技术应用与推广平台 DSP开发服务平台 CpuTimer0Regs.TPR.all = 0xFFFF;//预定标寄存器; b; b  i( K% y( @7 M* C' k9 t
CpuTimer0Regs.TPR.all  = 0;
# T& s% t; W! m" m这两句话其实是给一样的寄存器来赋值的,因为CPU定时器0的预定标计数器的寄存器是由两个构成的,一个是TPRH,一个是TPR,所以上述的两个语句中是否有一个是TPRH。好,抛开这个问题不谈,我们来简单谈一下CPU定时器0各个寄存器之间的关系。
( v2 l3 [3 G" r5 @9 ^1 Z# D! a, N+ V+ x! n4 a0 Z
CPU定时器有寄存器:计数器寄存器TIMH:TIM,周期寄存器PRDH:PRD,控制寄存器TCR,预定标计数器TPRH:TPR。这里,AH:A的形式表示是一个32位的寄存器是由两个16位的寄存器构成的,AH是高16位,A是低16位。
: o( D% m% w& S6 j: [/ {  x0 M1 A  a  Y. E4 Q% M
CPU定时器计数方式是复位时,计数器寄存器TIMH:TIM内装载周期寄存器PRDH:PRD的值,经历一个计数器时钟时,TIMH:TIM内的值就减1,一直减到0,这时产生定时器周期中断事件,并重新装载PRDH:PRD的值,开始计数。这里就讲到了,计数器寄存器在一个计数器时钟时减1,那么计数器时钟是多少呢?或者说是每隔多少时间,定时器的计数器才会减1呢?这个就由预定标寄存器TPRH:TPR来决定了。7 d$ r  Q( d5 V2 o! w

' Q3 d( g0 b9 p  s- i0 _先来了解一下预定标寄存器的结构了,TPRH和TPR这两个寄存器都由两部分构成,高8位为定时器预定标计数器PSC,低8位是定时器分频TDDR。也就是说,TPRH是由PSCH和TDDRH构成,而TPR是由PSC和TDDR构成的。这个工作的原理其实和前面的定时器计数类似的,复位时,PSCH:PSC重新装载TDDRH:TDDR的值,然后经历一个CPU时钟时,PSCH:PSC就减1,PSCH:PSC的值减为0时,重新装载TDDRH:TDDR的值,并且产生一个计数器时钟,TIMH:TIM的值减1。
% i  Q+ o' I% o* o+ Q' ~# ^( q8 B  o) D+ [
上面的解释不知楼主能明白没?
回复 likyo 7 A& i0 ?3 q5 E. @& e3 m
' h5 V# b4 h$ _: I
DSP交流网  DSP学习{dy}论坛 DSP技术应用与推广平台 DSP开发服务平台 1 m! V4 }4 g" r
    谢谢版主的解答,以上问题我以弄懂,但还是有疑问,我看书上介绍没有写到,如果CpuTimer0Regs.TPR.all  = 0,CpuTimer0Regs.TPR.all = 0;怎么办,还能减1吗,我想是不能的,你在用定时器时,经常能看到InitCpuTimers();和ConfigCpuTimer(&CpuTimer0, 150, 1000000);同时出现,而InitCpuTimers();函数的内容为void InitCpuTimers(void)
0 t2 `, ^$ H% ?% @5 W, X{$ ]/ J& J4 [7 L9 S. y
    // CPU Timer 0. ~$ Z8 P9 W/ n. p7 P8 J
        // Initialize address pointers to respective timer registers:www.hellodsp.com7 {3 C+ X  G2 ~2 P
        CpuTimer0.RegsAddr = &CpuTimer0Regs;
9 G- L0 \0 y9 o( ~DSP交流网  DSP学习{dy}论坛 DSP技术应用与推广平台 DSP开发服务平台         // Initialize timer period to maximum:        , _# s: R3 r" o3 m4 g: _# s
        CpuTimer0Regs.PRD.all  = 0xFFFFFFFF;
0 X: A& S; ?' q  {: ^6 qDSP交流网  DSP学习{dy}论坛 DSP技术应用与推广平台 DSP开发服务平台         // Initialize pre-scale counter to divide by 1 (SYSCLKOUT):        www.hellodsp.com. G6 s5 Z( o" [" `# _4 ~
        CpuTimer0Regs.TPR.all  = 0;
0 e* \  w5 p% U* P* i' I        CpuTimer0Regs.TPRH.all = 0;
        // Make sure timer is stopped:
$ @3 [8 U1 r6 I" w6 W, M8 @! ~        CpuTimer0Regs.TCR.bit.TSS = 1;8 s8 O' s; G/ n
        // Reload all counter register with period value:
# ?" w/ m$ f5 s; R. n3 I7 _$ K4 pwww.hellodsp.com        CpuTimer0Regs.TCR.bit.TRB = 1;        // Reset interrupt counters:( a  U0 |, t$ F/ ~
        CpuTimer0.InterruptCount = 0;        ' W& z6 }- L$ b& [$ r# ?
其中        CpuTimer0Regs.TPR.all  = 0;
4 x* N  E  g% f+ O; J9 cwww.hellodsp.com        CpuTimer0Regs.TPRH.all = 0; 这两两条语句有用吗,还有CpuTimer0Regs.PRD.all  = 0xFFFFFFFF;写成CpuTimer0Regs.PRD.all  = 0x00000000;不行吗,还有这个ConfigCpuTimer(&CpuTimer0, 150, 1000000);函数,内容为:oid ConfigCpuTimer(struct CPUTIMER_VARS *Timer, float Freq, float Period)" R# h5 S7 ^" M
{DSP交流网  DSP学习{dy}论坛 DSP技术应用与推广平台 DSP开发服务平台 ) C0 K" m5 T/ z8 W& c6 B$ d' w! P
        Uint32         temp;
$ z4 R7 ?$ e/ g% p. {# p        www.hellodsp.com  u$ x7 f) G$ u  P$ D, M
        // Initialize timer period:        DSP交流网  DSP学习{dy}论坛 DSP技术应用与推广平台 DSP开发服务平台 : a0 z- x9 b5 P
        Timer->CPUFreqInMHz = Freq;
$ J6 f6 h; [5 k* |% O        Timer->PeriodInUSec = Period;
4 I) I; r& c& Q8 O; A( w/ y7 K        temp = (long) (Freq * Period);
0 f( R" g" b% q# n1 hwww.hellodsp.com        Timer->RegsAddr->PRD.all = temp;
3 H1 {7 \3 M; C6 C7 S- i
# @6 z- ?0 j! `7 y: q. {6 p0 H        // Set pre-scale counter to divide by 1 (SYSCLKOUT):        + T- f, h. j; [; K# t# M! k4 T
        Timer->RegsAddr->TPR.all  = 0;5 G; n( _4 G+ e" J; f
        Timer->RegsAddr->TPRH.all  = 0;
& L) o9 ^; B4 o* D3 ?www.hellodsp.com        www.hellodsp.com0 s' N+ u5 Q0 K6 K0 L
        // Initialize timer control register:
* l# G! m7 q2 z5 h( Y        Timer->RegsAddr->TCR.bit.TSS = 1;      // 1 = Stop timer, 0 = Start/Restart Timer
& M3 y7 ?" ?5 I4 `+ N        Timer->RegsAddr->TCR.bit.TRB = 1;      // 1 = reload timer0 i! h  \1 F5 M' c* w+ C1 w
        Timer->RegsAddr->TCR.bit.SOFT = 1;DSP交流网  DSP学习{dy}论坛 DSP技术应用与推广平台 DSP开发服务平台 ! \6 @) h$ v7 Y1 [
        Timer->RegsAddr->TCR.bit.FREE = 1;     // Timer Free Run
% ?1 N6 v5 t8 o$ \) t7 i        Timer->RegsAddr->TCR.bit.TIE = 1;      // 0 = Disable/ 1 = Enable Timer Interrupt
. s! r/ e, d; c/ z/ ?: s       
! {; z' g: {% ^& G% k        // Reset interrupt counter:3 K2 W+ O7 V. g4 T/ h
        Timer->InterruptCount = 0;www.hellodsp.com; k. U9 |: F5 s1 O* n
},你看这两个函数是否涉及重复定义啊
郑重声明:资讯 【跪求高手指教(2812定时器0) - 一起学2812专区- likyo的专栏- DSP交流 ...】由 发布,版权归原作者及其所在单位,其原创性以及文中陈述文字和内容未经(企业库qiyeku.com)证实,请读者仅作参考,并请自行核实相关内容。若本文有侵犯到您的版权, 请你提供相关证明及申请并与我们联系(qiyeku # qq.com)或【在线投诉】,我们审核后将会尽快处理。
—— 相关资讯 ——