|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
F28335有三种32位的I/O口,依次PORTA(GPIO0-GPIO31), PORTB(GPIO32-GPIO63), PORTC(GPIO64-GPIO87),这些口都可以配置为普通的数字IO口同样也能被配置为外部接口。9 |5 k; [3 M' U7 e( m
这样涉及到了IO的寄存器,IO口共有三类寄存器:
* s3 ~% |; W' D ]控制寄存器、数据寄存器和中断控制寄存器。
3 `& K; P! \/ l H; \1、 GPIO可以配置为数字I/O或外设I/O口,GPxMUX1(2):‘0’为数字I/O,‘1’为外设I/O口;/ n) ^( G( e3 X' }( G, w* \
2: GPIO可以配置为内部电阻上拉功能,GPxPUD:‘0’为上拉,‘1’为禁止上拉
1 F2 o0 j9 i) k$ t6 c3 I K3: GPIO具有数字滤波功能,GPxQSEL1(2):量化输入寄存器,可以确定是3周期采样+ p' \( U1 Q3 v( U4 s
还是6周期采样或者不用采样;
& U" m% c4 ~& ~1 h4 e" ?' U2 oGPIO可以配置为内部电阻上拉功能,GPxPUD:‘0’为上拉,‘1’为禁止上拉,
: [/ i7 p0 r( k7 Y% Q" {' g% M4 _; n' R, p, Q3 o9 a
4、 输入输出可配置,GPxDIR是控制每个引脚的输入或是输出,‘0’是输入,‘1’是输出;6 a s+ t; M& Z2 }
当GPIO配置为数字I/O时注意:
( c& q9 |; U2 E$ w0 E+ K# l1)28335引脚作为输出时,虽然可以通过设置GPADAT或GPBDAT改变输出端口的高低电平,但是单独写某一位时可能会使其它引脚产生误操作。为了避免这种现象的产生,改变输出引脚的高低电平时,应该使用GPIOxSET(置位),GPIOxCLEAR(清零),GPIOxTOGGLE(反向,可以代替去翻操作)寄存器载入输出锁存寄存,GPIOxDIR配置方向,1为输出,0为输入.; o) I# ?; G1 r# j' Z; D5 }- P
2)当使用GPADAT的时候,一般是在初始化中,在函数中使用需要添加延时,否则可能达不到预定的输出状态。使用GPIOxSET(置位),GPIOxCLEAR(清零),GPIOxTOGGLE(反向)电平会立即变化,无需添加延时。
' \; s3 _9 m( ^4 [GPIOxSET, GPIOxCLEAR, GPIOxTOGGLE仅仅等于1时才有效,等于0无效
) k, g& J% D8 m1 C& v) N
9 a$ q% y- n$ p. s' O以下例程是针对野火DSP28335开发板的程序,已经验证。% z4 u, `3 t2 n+ i3 x
#include “DSP2833x_Device.h” // DSP2833x HeadeRFile Include File \% a v v2 O& z7 o- `2 \
#include “DSP2833x_Examples.h” // DSP2833x Examples Include File
0 ]2 O. @' o& Zvoid Gpio_select(void);% v7 x" a! b2 x
void delay_loop();
# Q5 j2 g' l. C% pint main(void) { @5 l; ]* n- i
MEMCopy(&RamfuncsLoadStart, &RamfuncsLoadEnd, &RamfuncsRunStart);
' I7 N( ~& e7 P& b- U2 s) rInitFlash();5 U5 k8 a6 z. k9 c7 z/ k* X
" l8 @" s5 f) m( ]1 w6 C; D1 z
InitSysCtrl();7 r; i& p6 C6 D( V0 ^& n
) j% z3 p% W( f8 D7 H- Y: b" l
Gpio_select();//GPIO 初始化
4 f6 g5 a9 o$ e- a# [: I) _# B9 L& J0 S5 T) Y" a4 l2 D/ |) g
// 步骤 3. 清除所有中断初始化中断向量表:
1 @4 U6 v" p. }: b$ N// 禁止CPU全局中断
x$ f- x2 ^' ~( }DINT;% @" Y8 ^" ^( h6 f
// 初始化PIE控制寄存器到他们的默认状态.! W: ]% u! B8 Z, b |1 }3 n0 K3 f
// 这个默认状态就是禁止PIE中断及清除所有PIE中断标志
4 @8 d) Z' Q6 m* T# w// 这个函数放在DSP2833x_PieCtrl.c源文件里
, m2 N+ ^2 |' a# UInitPieCtrl();
1 i8 D4 J1 x9 J/ g' l [// 禁止CPU中断和清除所有CPU中断标志
4 \, X8 j/ ?3 w$ y B$ M' }% aIER = 0x0000;, ^/ O1 c3 ^' [' T
IFR = 0x0000;
# }7 i4 x3 Q0 a. E. k; o5 S8 v( y* x( g; f) U
//初始化PIE中断向量表,并使其指向中断服务子程序(ISR)
6 z( R8 }" P, e$ e D* A// 这些中断服务子程序被放在了DSP280x_DefaultIsr.c源文件中
3 _" q- }" ~& Z3 k: c// 这个函数放在了DSP2833x_PieVect.c源文件里面.& s8 E, F# @' r( Y3 T
InitPieVectTable();
: {; d0 t' \ d" g4 _0 X/ A# t. A- N2 M% S: f2 m: ~' t8 J! `( J: L7 M
GpioDataRegs.GPBDAT.all =0x00000000;//第28、29位为低电平LED灯亮. ]1 S0 o8 \6 B1 X% M2 F/ B8 W
GpioDataRegs.GPCDAT.all =0x00000000;//第0 -4位为低电平LED灯亮' W6 V# A/ {8 H: E- U2 y$ a( j' K
delay_loop();+ ~( p0 L( M4 v6 T+ I! V( F
delay_loop();5 f. L1 @5 y5 J2 \0 K
/ Z0 l7 A9 H1 C ~// for(;?
# @, F# G% ?+ w9 ?) ~/ i. \9 F/ K" l/ _! F
while(1)
& L1 I8 F3 q6 o: E5 R2 `5 _4 X: W {5 n1 l1 l8 Y, O9 X4 E; F+ Z( n9 f
delay_loop(); //延时) M4 n. W) G7 _" Z0 @
GpioDataRegs.GPBTOGGLE.all =0x30000000; //电平翻转
$ \ e9 P% K4 V/ X K# S GpioDataRegs.GPCTOGGLE.all =0x0000001F; //电平翻转
- d$ R8 }; t9 P2 U6 P5 L }* y' x# s: O6 M
$ J$ {7 k" M8 ~5 b7 x
/*( \$ e( g8 ~9 [
EALLOW;
# B* b/ S& w7 C+ G// 把LED灯熄灭% J, d4 l$ I1 Z( J9 z
GpioDataRegs.GPBSET.bit.GPIO60 =1;) ?: \9 w, J% c. A3 l
GpioDataRegs.GPBSET.bit.GPIO61 =1;, F S5 t6 U1 c M" x6 c# U' x
GpioDataRegs.GPCSET.bit.GPIO64 =1;: K( n/ b6 D- M
GpioDataRegs.GPCSET.bit.GPIO65 =1;
7 X7 j) K6 V$ d. g! \0 O) a' LGpioDataRegs.GPCSET.bit.GPIO66 =1;" T; j7 l" g% d7 n3 C
GpioDataRegs.GPCSET.bit.GPIO67 =1;6 M6 {- v3 i$ ?* L* f) z
GpioDataRegs.GPCSET.bit.GPIO68 =1;# q* u' ~/ S) C! x& F$ k$ _
EDIS;
' G: n; T% D7 z/ k1 ~1 j9 B! P7 \- N' r5 g( h9 N L) ?6 L6 p
delay_loop();) k; B* T* t" m& Y# G
12 m w" N5 `) Y+ z
/
Z6 b' K4 T# ~% `// GpioDataRegs.GPBTOGGLE.all =0x30000000;
' f4 l5 j4 z& x) d1 N& a$ Y0 l// GpioDataRegs.GPCTOGGLE.all =0x0000001F;
2 C0 y, N, \! F7 v/ EALLOW;4 D# I! k# Q/ Y2 R6 M$ ?' T |. a
// 打开LED灯
8 @/ l$ b+ s. s2 D# }' JGpioDataRegs.GPBCLEAR.bit.GPIO60 =1;
- t) D9 t6 e+ b7 R" v& ^GpioDataRegs.GPBCLEAR.bit.GPIO61 =1;
+ m6 e/ c6 d( _" m/ r5 ]GpioDataRegs.GPCCLEAR.bit.GPIO64 =1;
6 b! h$ {# f2 GGpioDataRegs.GPCCLEAR.bit.GPIO65 =1;( C( f3 h7 D' Y" p: d5 I
GpioDataRegs.GPCCLEAR.bit.GPIO66 =1;- Y; h! Z* m& J+ W, S1 x
GpioDataRegs.GPCCLEAR.bit.GPIO67 =1;3 T5 x# g9 j8 X; p3 E7 ]
GpioDataRegs.GPCCLEAR.bit.GPIO68 =1;+ L& s* i6 `& M+ X
EDIS;
" i) T6 ^3 Z- r& ?*/
$ {# O4 q% S# d, d9 i
]9 u+ H3 p5 }return 0;, O$ B' D: R7 |
1* h8 v! o( L" W5 Q* }$ t
}8 Z* t) {& J5 W* t" n
/ [1 I/ f/ j. C6 W5 ~* y$ B; T
void delay_loop()
" H" _( S4 `. c9 N! e{3 A' o# C4 S/ R/ X! ^( `
Uint32 i;
8 }* b' j8 F- |, B3 wUint32 j;2 @3 L" e: q' o5 {* c: \( z
for(i=0;i<32;i++)) M5 X- J% m5 i, |2 Z2 q
for (j = 0; j < 100000; j++) {}
6 x+ f1 e5 t- L* A: d}
: O0 t: } a0 o$ k6 L1 v9 ~( q w0 i/ T% q/ W5 \7 ?
void Gpio_select(void)
/ Y( Y3 [ e& O$ @# n; q{
4 i5 H! _" Y$ d/ c9 YEALLOW;
4 l+ j2 m8 M/ q# \' N5 `4 bGpioCtrlRegs.GPAMUX1.all = 0x00000000; // All GPIO9 a1 C2 z6 h) O* j
GpioCtrlRegs.GPAMUX2.all = 0x00000000; // All GPIO
3 d5 p/ M# {' k8 sGpioCtrlRegs.GPBMUX1.all = 0x00000000; // All GPIO
- i' x1 A. v- z4 F5 YGpioCtrlRegs.GPBMUX2.all = 0x00000000; // All GPIO
4 j) t2 H" W" ]+ V$ K5 `8 ~GpioCtrlRegs.GPCMUX1.all = 0x00000000; // All GPIO; b0 k4 B/ r5 }. N4 f3 _
GpioCtrlRegs.GPCMUX2.all = 0x00000000; // All GPIO
# l( ^. u z d6 r0 p! [1 ^7 p) ]8 v! ^( S8 m* ? c2 p2 }
' d3 K& B+ _' FGpioCtrlRegs.GPADIR.all = 0xFFFFFFFF; // All outputs
1 D2 D7 }' ~, x6 @8 |GpioCtrlRegs.GPBDIR.all = 0xFFFFFFFF; // All outputs/ H3 y) _5 ?+ _* r9 U/ z2 I
GpioCtrlRegs.GPCDIR.all = 0xFFFFFFFF; // All outputs
4 X1 D- V p3 n$ @: Y" g$ _$ z% L3 s) i/ O6 ~
EDIS;, `& |/ ?- R$ m9 G8 ]
$ A$ X7 d! f' j3 J9 L" l) L( o}2 K7 n6 C, x- l& z9 [+ m8 ^
+ }. T& O: r* U! b" o7 x5 @2 [( F, [! m9 k1 Z7 m' `' c
|
|