|
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: ^ |
|