找回密码
 注册
关于网站域名变更的通知
查看: 1045|回复: 3
打印 上一主题 下一主题

ATMEL SAM3X 芯片定时器通道2 通道3怎么设置

[复制链接]

该用户从未签到

跳转到指定楼层
1#
发表于 2019-5-5 09:52 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

EDA365欢迎您登录!

您需要 登录 才可以下载或查看,没有帐号?注册

x
ATMEL SAM3X 芯片定时器通道2 通道3怎么设置( V! Z8 n3 o8 H! ]

$ c) Y  @4 Q1 l5 E$ @各位大神,当我使用atmel的SAM3x8E芯片设置定时器做1s定时实验时 使用TC0通道0时可以实现功能,但使用TC0的其他通道或是使用TC1和TC2两个定时器都无法实现功能是怎么回事?
" X* G7 S* G+ J8 h; n3 t7 v, W$ |以下是我写的代码 其中TC0可以实现功能,TC2却无法实现功能* ~( c7 [: e. B. u: ~1 s. R% o- D
#include "sam3xa.h"
2 J: |6 Z" y/ p$ X#include "header.h"- {. a: P. Y# g9 ~7 S2 z3 ^
void Init_output(Pio *p,uint32_t pio_pin)* Q- F% {( g1 r5 `
{+ U; G; ^+ G) j" P3 `% ^
    PMC->PMC_PCER0=1<<ID_PIOB;
) h7 G2 A! T- ?# I8 [" \, n; v  J& `% n) h: l
    p->PIO_PER=pio_pin;# s. d( s! q: f/ j. z$ w$ K
    - H) w/ e  V+ r7 n0 N8 l$ ?4 ]
   
7 B8 @# R% }3 q4 t0 K    8 i. s  d8 z$ _9 n0 C" f! B# k
    p->PIO_OER=pio_pin;  0 C7 p0 I, U. V5 x/ O4 p* _, V. s
   
5 A  u" [3 s4 O4 N& }. v% a
; ^& H! p8 h, f: x5 L1 {6 k   
) }% k- Q, k5 l    ! T+ W* f( L& l: {5 O: B& W. N
    p->PIO_PUER=pio_pin;
8 ~% u+ p0 d# j! f  T6 f2 H2 ~; {. Y/ S% M3 P- n
    ! u7 a: s& h$ X- b( m4 I/ ]
}9 b: f  u2 d- E% h0 h
void Init_tc(void)
, o; _* V3 \, j( @# k# l! ]; L{
/ U- c; k$ b6 T; Z0 H& V4 g6 v; B- g" q    . G# n8 N- o- F$ o, r
        Init_output(PIOB,PIO_PB20);: v2 w; Q, m8 v$ S" c

+ w' s0 z6 O. G4 X: V0 W2 y; |' K& S/ m) C  e# |, T* ^
        PMC->PMC_PCER0=(1UL<<ID_TC0);
5 Q" k! N1 v) G) p       , \' N  ]5 l1 X6 ^! Z5 V! W
        
' T8 S- F4 S7 G( A+ {) f; p9 i    TC0->TC_CHANNEL[0].TC_CMR=TC_CMR_WAVE    //波形模式
$ ?! F" x: ?2 ?; }- d2 S0 |7 W* g8 O                        |TC_CMR_TCCLKS_tiMER_CLOCK4    //时钟4,:MCK/128
) N1 O$ d; Q3 N0 M/ N! E5 \1 N" a                                 
& ^. M4 U3 R0 N! Q* w8 q/ K5 y                  |TC_CMR_WAVSEL_UP_RC;    $ u. [3 x; [6 t8 m: D

3 l; }; L4 C8 p) T+ ^! e% C       TC0->TC_CHANNEL[0].TC_CCR=TC_CCR_CLKEN|TC_CCR_SWTRG;//时钟使能 ,软件控制( Z! f& W6 h% ^& V1 v
    $ g! ~- }" W/ p7 h
        
' ]% {- N* r6 Y5 R4 B& \9 n% L# @1 \    //波形仅上升RC比较时触发7 u  `0 Q5 z0 [4 B) P
    /*设置RC产生中断的时间*/
( U8 h( b! F* `9 a5 S; N! V3 F  q    //TC0->TC_CHANNEL[0].TC_RC=TC_RC_RC(656250);//1s定时
4 v5 y" h3 M% }- v        
8 f# K# s4 w; ~        TC0->TC_CHANNEL[0].TC_RC=TC_RC_RC(600100);//(655360);//定时
/ _* p* L5 x  V, ^2 \( C2 Q        TC0->TC_CHANNEL[0].TC_SR;
7 j$ B  M, V# K5 j' c        
& ~2 q, q4 J4 z% ~    TC0->TC_CHANNEL[0].TC_IER=TC_IER_CPCS;//RC比较时产生中断
# A; V: f, |' S) j$ Y) z6 d% O" h   
2 U- M& B4 e, P6 D- O    /*使能TC0中断*/# q/ a! n* Y8 \$ Y
    NVIC_DisableIRQ(TC0_IRQn);1 I( Z" T, O* T) F2 s" L8 [( [
    NVIC_ClearPendingIRQ(TC0_IRQn);0 t* f! \0 q5 F0 ]# q- i
    NVIC_SetPriority(TC0_IRQn,1);
* D  L: [9 [6 e  W* {    //NVIC_EnableIRQ(TC0_IRQn);
$ \' F! N2 b1 N; M/ J0 x2 W3 x& d    NVIC->ISER[0]=1<<TC0_IRQn;$ O2 r. m7 \" E, k
   
& L  C- a* q% c: \   
. l) r& K# r% {4 D* s/ e}
" g* }( L2 l7 fvoid TC0_Handler(void)5 A( x. ]6 u" P" @" q) U
{0 r" [, o2 n% o* I
  uint8_t status = TC0->TC_CHANNEL[0].TC_SR;% V+ G) E' u6 N5 O! D" ^- w

: X6 O9 }7 \  g1 {% X) z! m  ]    /* 判断中断是否为RC比较触发的 */
% `: ~/ a* Z6 o8 M    if (status & TC_SR_CPCS)
2 h! W2 Z- G' s$ A0 N6 Z6 H6 |3 A        {! G; R- Z3 \6 j! n
          if ((PIOB->PIO_ODSR &PIO_PB20))
9 P! Q* z& r+ B0 {1 D. ?        {
7 Q3 r# j/ T% h            PIOB->PIO_CODR = PIO_PB20;
* W: C6 F9 W7 b                        * S1 o# E9 D0 {
        }
8 h! ]! I/ u# v# I; Y2 h        else
+ H- I6 _: B6 e3 u, ^) c        {( n( i$ d$ J! h% w4 Y" M: e3 K& b
            PIOB->PIO_SODR = PIO_PB20 ;3 K5 z+ |8 E: _5 m$ ?
        }, _  R, W0 }& A; \7 v) P/ z0 O
        }+ I/ m0 i: j. K
        $ w6 J7 O+ h1 C/ t! P9 P8 c0 @7 z; n. c
}
: y; \4 v; [- U6 O+ m, U
* x2 }3 V4 N+ ^# t! ^  Uvoid Init_tc2(void)
, v3 Y* S, @9 i% _" \{
" u# O  G. B" ]0 P+ ^9 w( F/ s   
0 _: `( F. ^' g" t; L" \; I1 i: j: h6 x0 C
        
3 U) P; a  w1 B" H3 {) j        Init_output(PIOB,PIO_PB18);+ O6 n1 v4 U6 G0 |; R- w
  
- l9 U& R. y8 G3 K, N5 }: J9 h" E" B6 i6 e( B
        PMC->PMC_PCER0=(1UL<<ID_TC2);5 s+ j6 U4 S- |0 ]( f
        0 g# `! {. j! H1 `
        
9 L; S. y8 S, X2 `    TC2->TC_CHANNEL[0].TC_CMR =TC_CMR_WAVE    //波形模式; {4 ^8 v  X, m' ]  P9 |
                                  |TC_CMR_BURST_NONE
6 w7 `/ ~- h* v6 t0 Y                        |TC_CMR_TCCLKS_TIMER_CLOCK3    //时钟4,:MCK/128! k& ?- k. F# E* b) M* v, i
                  |TC_CMR_WAVSEL_UP_RC;    //波形仅上升RC比较时触发) q# C& y2 ~" K5 ?7 h1 t

( n- e' c4 l9 A            5 R) }% [! T1 z
        TC2->TC_CHANNEL[0].TC_RC=TC_RC_RC(655360);//定时- t8 \3 E0 ^8 X1 M
    TC2->TC_CHANNEL[0].TC_IER=TC_IER_CPCS;//RC比较时产生中断1 J/ x5 Y7 T5 g; m3 O+ J
    TC2->TC_CHANNEL[0].TC_CCR=TC_CCR_CLKEN|TC_CCR_SWTRG;//时钟使能 ,软件控制
' ]4 P& d, o3 ^1 {0 u* M7 o& X5 K' N
   
, G. U. q6 a6 `$ n5 q    /*使能TC2中断*/' i4 e3 B" S5 Y3 n
    NVIC_DisableIRQ(TC2_IRQn);
) D' b) B$ y8 d- j    NVIC_ClearPendingIRQ(TC2_IRQn);
! K2 b' ?. P# C. U7 \    NVIC_SetPriority(TC2_IRQn,0);
- F/ z, @9 [. }) B4 n- Y    NVIC_EnableIRQ(TC2_IRQn);
9 Q1 u) a+ C* u; }       // NVIC->ISER[0]=1<<TC2_IRQn;9 `' T# W& M. K/ n5 s
    7 Q7 v. l6 k+ ~! K- d; i
}4 r/ s" m; F) q8 z
//int n=0;
; A( w" p5 V& \# n: [' K, N/ z8 cvoid TC2_Handler(void)
2 _. p9 k' L; K; U, \0 _{
8 K, U9 a& _# c: Y8 n- s    uint8_t status = TC2->TC_CHANNEL[0].TC_SR;
3 O  {- S. u" f# U9 ~6 `% L4 S" R1 s3 r2 C6 G6 ^3 q6 B
    /* 判断中断是否为RC比较触发的 */# q5 z( N0 N, J* ~$ ?
    if (status & TC_SR_CPCS)
6 l0 o% C: d2 u- \4 Y  z) L. [    {
* o- X* G& l9 Q6 W$ v" I: b+ Q$ f8 h/ y6 q( z7 M
               
4 B8 @" F6 T* o9 ]5 e( u  z2 ^6 h            PIOB->PIO_SODR = PIO_PB18;
8 l8 t2 W' e. I3 f7 g        2 S: }, A' C: G% [: j
    }6 Y3 H; Y: P- N0 N# A9 @
        PIOB->PIO_SODR = PIO_PB18;
: P* I7 X6 F& W! M* T9 L, h& y1 N       / K1 E1 |# U( I$ |
        
4 u  h$ Y; u2 d: s}
/ i! ?" z1 n  }# {
1 O- O- R- t6 C: B: ^

该用户从未签到

2#
发表于 2019-5-5 10:00 | 只看该作者
没玩过这个片子,我用的sam4s,给你我的rtt,参考一下,中间用的几个函数,你看看官方的库函数吧
, m* {, X# m$ yvoid configure_rtt(uint32_t u32_mdata)
! ^1 r7 J4 c' ]0 |{8 L2 c# z( R3 K3 e7 C! P
        uint32_t ul_previous_time,u32msdata;
2 J9 Y4 c7 a4 g7 @, A        u32msdata = (uint32_t)(u32_mdata * 32.768);
2 j8 T- ~2 k( }/ q# P- H        /* Configure RTT for a 1 second tick interrupt */$ |" `$ B0 f  \  ]* e- l
        rtt_init(RTT, u32msdata);
! g+ u! L  j" ?* x% P        ul_previous_time = rtt_read_timer_value(RTT);: Z( z  y( }0 _9 r+ M* H9 Z
        while (ul_previous_time == rtt_read_timer_value(RTT));  g+ y4 y) B8 F5 `6 f% k, r
+ F& {$ j7 k0 q8 R& ?! T& R  Q
        /* Enable RTT interrupt */+ w  f1 x* `- J3 l
        NVIC_DisableIRQ(RTT_IRQn);
0 w9 T+ |: V7 p7 H" W# R0 J' P  F* B        NVIC_ClearPendingIRQ(RTT_IRQn);# U4 B5 y. F8 h( ?
        NVIC_SetPriority(RTT_IRQn, 0);6 u7 c& T2 I% q7 t6 s) X
        NVIC_EnableIRQ(RTT_IRQn);% x: G- ?% h8 E% ^& q6 U
        rtt_enable_interrupt(RTT, RTT_MR_RTTINCIEN);
4 j4 o* r# v+ I  ?}

点评

好的谢谢 已经解决。  详情 回复 发表于 2019-5-5 10:18

该用户从未签到

3#
 楼主| 发表于 2019-5-5 10:18 | 只看该作者
helendcany 发表于 2019-5-5 10:00% @2 J6 G; Y# T4 h0 s* C
没玩过这个片子,我用的sam4s,给你我的rtt,参考一下,中间用的几个函数,你看看官方的库函数吧
" p& t; s) J0 g/ [8 k; ivoid con ...
8 N" y6 n2 W- c7 ^" x3 J4 L
好的谢谢 已经解决。7 {) v6 v: V, \# X# T. _

点评

解决就好,有时间一起讨论  详情 回复 发表于 2019-5-5 10:23

该用户从未签到

4#
发表于 2019-5-5 10:23 | 只看该作者
artic 发表于 2019-5-5 10:18# N' X/ l* k/ r) ^6 ^% ]+ h: ]
好的谢谢 已经解决。
5 b1 S! S3 s9 s. l
解决就好,有时间一起讨论
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

推荐内容上一条 /1 下一条

EDA365公众号

关于我们|手机版|EDA365电子论坛网 ( 粤ICP备18020198号-1 )

GMT+8, 2025-8-12 15:32 , Processed in 0.125000 second(s), 28 queries , Gzip On.

深圳市墨知创新科技有限公司

地址:深圳市南山区科技生态园2栋A座805 电话:19926409050

快速回复 返回顶部 返回列表