|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
ATMEL SAM3X 芯片定时器通道2 通道3怎么设置- r, B. v' X5 m( e4 h
4 U4 ^, `4 m. q# M: Z% z# ^6 `1 ~$ s
各位大神,当我使用atmel的SAM3x8E芯片设置定时器做1s定时实验时 使用TC0通道0时可以实现功能,但使用TC0的其他通道或是使用TC1和TC2两个定时器都无法实现功能是怎么回事?
- r u9 u% @/ P3 {" A' v以下是我写的代码 其中TC0可以实现功能,TC2却无法实现功能
/ {% K! Q& |; h3 ?3 u#include "sam3xa.h"
1 P* ]9 f; A9 s+ _; V$ d#include "header.h"
7 w( b/ N6 j9 b4 lvoid Init_output(Pio *p,uint32_t pio_pin): k4 S. l9 i+ Q" G5 `
{
2 y8 ? B1 E8 Y( W: | g4 U PMC->PMC_PCER0=1<<ID_PIOB;
- e. X9 ?8 h* A
/ K& G" S! t2 m p->PIO_PER=pio_pin;$ q6 t$ C+ D; K3 P
0 G% J0 k Q u" a# D $ w% m/ `5 l7 ]2 Q5 q: m
/ O. v+ J+ C$ v3 J* {0 j p->PIO_OER=pio_pin; 7 M/ e* s e) O6 ~& [/ X: J: u
& h( E+ Q9 |1 c6 u; U& M2 @, q
- e+ V, i- b# t+ B+ p# \
7 s/ L8 h3 `9 l
" I8 w: l/ _0 j) R0 c% _; r
p->PIO_PUER=pio_pin;+ K# E& |2 a/ K6 y
% U3 {. `; a! g5 y0 `) l& H3 c, I
( b, T4 e+ f0 R5 h}) D4 Y! q+ m. h& M+ @
void Init_tc(void)3 f1 h$ y5 k" ]" F
{& `4 }% }' R" e" N# ?- }* m$ k
# S1 M# p$ d/ R1 }+ O. T- q1 T Init_output(PIOB,PIO_PB20);
* O" M% p: ^8 j/ p/ P& Z" z
: D' h. m, i% e! p$ N* r4 e1 N! z/ p. f7 I# d5 P/ L
PMC->PMC_PCER0=(1UL<<ID_TC0);
: S5 W9 d8 p z2 H/ v2 ?& ~ , s/ L/ K2 a* k3 v+ M% [6 S" C
8 ?5 q: Y* i9 x0 K/ ]
TC0->TC_CHANNEL[0].TC_CMR=TC_CMR_WAVE //波形模式5 D+ P( }8 ^% L6 J
|TC_CMR_TCCLKS_tiMER_CLOCK4 //时钟4,:MCK/1283 @/ E/ R n; ~% f C
. Y. @* s2 [ U2 h/ u7 J |TC_CMR_WAVSEL_UP_RC;
9 _4 H. n( i& v9 O4 ~; |
+ y3 r/ S5 f- t0 A TC0->TC_CHANNEL[0].TC_CCR=TC_CCR_CLKEN|TC_CCR_SWTRG;//时钟使能 ,软件控制
( P3 n: @$ p1 \ G
: K$ a) w5 \0 M9 B7 D9 e4 B ) i& \9 w0 d6 y; h: _4 ~
//波形仅上升RC比较时触发
3 h1 h+ ~. W. ?; D7 t) Q /*设置RC产生中断的时间*/
; p0 D+ b6 q* N; U+ P/ n7 q0 N- x, w //TC0->TC_CHANNEL[0].TC_RC=TC_RC_RC(656250);//1s定时
4 Q4 P4 l% U( U6 {* u, Q. t; W6 G
% F: {3 z4 H7 l- H$ m x TC0->TC_CHANNEL[0].TC_RC=TC_RC_RC(600100);//(655360);//定时
6 m: E6 u; `1 _1 { TC0->TC_CHANNEL[0].TC_SR;& `$ Z: }- X0 ~/ q
; |" [1 @6 L2 Z) l
TC0->TC_CHANNEL[0].TC_IER=TC_IER_CPCS;//RC比较时产生中断
7 {- S0 b$ g/ a, n# { # K( I |' ?# w
/*使能TC0中断*/
! x, b$ N7 X1 K& q% Z: o NVIC_DisableIRQ(TC0_IRQn);- W k& s) g6 {
NVIC_ClearPendingIRQ(TC0_IRQn);
3 Z( {$ P* p3 f$ I NVIC_SetPriority(TC0_IRQn,1);
' @. |; j2 j: S5 N //NVIC_EnableIRQ(TC0_IRQn);7 d6 a, g- c& H# |) g8 e% O* C
NVIC->ISER[0]=1<<TC0_IRQn;% J. \; o- n9 u8 K1 T
0 D% ]% \1 g+ a5 p' O$ I. f
- s5 n) h2 d* {( }7 s. Y}7 `1 k7 Q* @) M% d+ R/ T
void TC0_Handler(void)2 G% S6 r( k1 r' a% q# w
{* e+ P3 ?3 N' Q, ]7 J, `" p7 L+ x
uint8_t status = TC0->TC_CHANNEL[0].TC_SR;
: e& ]* y2 O- [/ f2 m# [8 o% w
/ e, H2 T# N6 G. g- m3 } /* 判断中断是否为RC比较触发的 */8 X/ d M! x& g: L7 W. n# |
if (status & TC_SR_CPCS)
1 S" ^3 q3 r% W" \: ^ l: B {
1 b6 D. H1 L" G1 }- K if ((PIOB->PIO_ODSR &PIO_PB20))9 [$ p. D, V& ?6 X' e
{+ {3 l1 @+ `+ t$ `7 g" g% Q
PIOB->PIO_CODR = PIO_PB20;" A q5 R- O, ]: p+ G
8 A/ @) {& N7 ]4 ?
}5 T- u3 P+ q" S
else9 B' j3 o1 p$ ^; _+ [: n. N
{
' o% W* U+ B; t- g; z$ g$ [ PIOB->PIO_SODR = PIO_PB20 ; y/ `, D/ [4 R6 P: n9 a7 t
}
u& Z2 f i- l7 S/ A6 k D }
0 W! v3 A5 e+ ^ ! b: |, r% O" `
}4 A) b2 Z) v- Y/ J, J2 c
* x& X- d& M4 V1 Q4 @% ^; p" S" N8 {
void Init_tc2(void)3 B6 ]' l' m9 i% G7 p L' I
{: c7 G8 t3 w4 u) D
- \9 T1 [; M. @4 S
' {6 D$ A n- `3 y G. h 4 l; N) n$ C | e* m5 K
Init_output(PIOB,PIO_PB18);5 J4 W7 s2 A) d
7 S7 K+ f7 n( H' z
6 S% r& \( H2 e6 l/ F+ ? PMC->PMC_PCER0=(1UL<<ID_TC2);* H0 Q& \$ t' f) b; Z
7 l7 y" L+ s8 L) ] 1 Z8 Z; d4 H8 A% @
TC2->TC_CHANNEL[0].TC_CMR =TC_CMR_WAVE //波形模式4 l _# Y) f- q9 L# m4 P. F; f
|TC_CMR_BURST_NONE
X4 Q9 j2 p& e3 s5 ]$ ] |TC_CMR_TCCLKS_TIMER_CLOCK3 //时钟4,:MCK/128
# i7 l, e- t4 _# D- F u3 z |TC_CMR_WAVSEL_UP_RC; //波形仅上升RC比较时触发
: F) F5 ]5 H% y; d- w
$ C2 { i6 p0 x% v: C6 L. v& W: X
~. e. m6 j* p7 K: Q4 M l TC2->TC_CHANNEL[0].TC_RC=TC_RC_RC(655360);//定时- r" y) ~& E! ?6 S" d4 a3 S7 ~
TC2->TC_CHANNEL[0].TC_IER=TC_IER_CPCS;//RC比较时产生中断0 I5 k- `! G: u( k. S% R) i
TC2->TC_CHANNEL[0].TC_CCR=TC_CCR_CLKEN|TC_CCR_SWTRG;//时钟使能 ,软件控制
7 v% M2 D, `+ m% m$ A7 U: s
2 Y) M1 e% Q3 s$ I/ p - i* W" }5 w0 C& Q: F
/*使能TC2中断*/
# n, ]7 R5 n) L; a6 n9 M, y NVIC_DisableIRQ(TC2_IRQn);
. {0 y/ |$ H' F NVIC_ClearPendingIRQ(TC2_IRQn);
! s$ B. ~" t! Y/ v% ~- z NVIC_SetPriority(TC2_IRQn,0);! ?+ B8 |- J( y7 ~
NVIC_EnableIRQ(TC2_IRQn);
* m2 D1 k6 A: Y/ m // NVIC->ISER[0]=1<<TC2_IRQn;
0 D0 ]# D( n& ?: g# y
, W3 l& s% x" v0 a. O}
+ a2 o8 @ J, g9 ]& m. R//int n=0;
8 W) D" [0 D8 M( ? p3 c! g3 Mvoid TC2_Handler(void)
; H8 v! c- F; i8 N2 M5 J7 J1 M9 m{; M7 E3 R: V/ c) E0 {! U ]! p; L
uint8_t status = TC2->TC_CHANNEL[0].TC_SR;
$ I: ]/ b" G# L8 X( F
. R1 A) v: v8 x }' K& k" M /* 判断中断是否为RC比较触发的 */; |1 i6 k) i' O( @5 ?5 i
if (status & TC_SR_CPCS)
# W0 `/ o S2 c9 H! \, |/ r+ Y {
1 Z2 k( r* A5 ^0 W0 i# d |% S# O# D1 @+ g% I0 ^
, W7 \% ]$ Z$ Z/ e" p" q W
PIOB->PIO_SODR = PIO_PB18;. e2 a1 s1 e, J9 O; b0 N; F
9 \. O4 X. s( [8 }0 K
}- Z7 z! S. [" j: g3 z
PIOB->PIO_SODR = PIO_PB18;5 @" A4 f% J7 F7 j C# L
# M" o7 _# }: P( Q
6 y8 p5 A5 {- J}# f ]# q( X9 S
- I( q4 L; _8 J7 I |
|