|
|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
F28335有三种32位的I/O口,依次PORTA(GPIO0-GPIO31), PORTB(GPIO32-GPIO63), PORTC(GPIO64-GPIO87),这些口都可以配置为普通的数字IO口同样也能被配置为外部接口。
' |1 ~" }3 U$ O9 L1 r( ?; X这样涉及到了IO的寄存器,IO口共有三类寄存器:2 e7 O+ i( i e# t
控制寄存器、数据寄存器和中断控制寄存器。8 G* [& [3 V% B$ m% \. p* u: ]
1、 GPIO可以配置为数字I/O或外设I/O口,GPxMUX1(2):‘0’为数字I/O,‘1’为外设I/O口;8 K4 C& s. V4 i4 n4 G. F
2: GPIO可以配置为内部电阻上拉功能,GPxPUD:‘0’为上拉,‘1’为禁止上拉
( m4 P2 R$ h9 s3: GPIO具有数字滤波功能,GPxQSEL1(2):量化输入寄存器,可以确定是3周期采样* w; w( b; a( Z& O$ F4 Z7 B8 _
还是6周期采样或者不用采样;
) y. H/ n, q. a2 P! EGPIO可以配置为内部电阻上拉功能,GPxPUD:‘0’为上拉,‘1’为禁止上拉,9 r/ Y; Z& t' b- {0 g; f" Q
/ }" j4 }# H% g5 y: p3 A' g4、 输入输出可配置,GPxDIR是控制每个引脚的输入或是输出,‘0’是输入,‘1’是输出;
" O0 X; G& |8 ]" ]0 k, ?0 J当GPIO配置为数字I/O时注意:) [* e, \6 v; C( X' k8 ?
1)28335引脚作为输出时,虽然可以通过设置GPADAT或GPBDAT改变输出端口的高低电平,但是单独写某一位时可能会使其它引脚产生误操作。为了避免这种现象的产生,改变输出引脚的高低电平时,应该使用GPIOxSET(置位),GPIOxCLEAR(清零),GPIOxTOGGLE(反向,可以代替去翻操作)寄存器载入输出锁存寄存,GPIOxDIR配置方向,1为输出,0为输入., ` w6 U! h4 X; b" y0 {2 N& w
2)当使用GPADAT的时候,一般是在初始化中,在函数中使用需要添加延时,否则可能达不到预定的输出状态。使用GPIOxSET(置位),GPIOxCLEAR(清零),GPIOxTOGGLE(反向)电平会立即变化,无需添加延时。
3 N+ W, j. U, S; Y" M. n9 d& hGPIOxSET, GPIOxCLEAR, GPIOxTOGGLE仅仅等于1时才有效,等于0无效5 C k. D3 n6 {6 ?
( j! b# C, `# x* q
以下例程是针对野火DSP28335开发板的程序,已经验证。
8 I/ y; c8 _- O- a9 I7 m6 y#include “DSP2833x_Device.h” // DSP2833x HeadeRFile Include File: ^& J+ Z8 d$ r0 B/ T3 v
#include “DSP2833x_Examples.h” // DSP2833x Examples Include File
' h1 {7 L( Z; P% z% W' kvoid Gpio_select(void);* m/ t, J: V! O3 ?4 M
void delay_loop();9 Y: s0 l2 r: ^1 F. C, b3 N0 a
int main(void) {
1 t# @" C% `& r# n" B" qMEMCopy(&RamfuncsLoadStart, &RamfuncsLoadEnd, &RamfuncsRunStart);( `* X, l# u% V0 W
InitFlash();
. t o! E4 ?2 e0 _' ?1 o0 y$ o( _) L# c. l# l
InitSysCtrl();& }1 }7 _. I1 k' z: E
5 n z4 e! F$ n* L1 y* }* x2 QGpio_select();//GPIO 初始化' @. j. Z5 Z" n( q4 o
* x3 H: l" f: y& t// 步骤 3. 清除所有中断初始化中断向量表:
3 L/ Q* }4 V% u& K// 禁止CPU全局中断
4 @/ N+ Y- J" BDINT;* L8 z7 O4 T$ t1 B
// 初始化PIE控制寄存器到他们的默认状态.
/ A; E( r2 K- i/ r% A/ _// 这个默认状态就是禁止PIE中断及清除所有PIE中断标志1 N1 q% Y" g f% a/ t
// 这个函数放在DSP2833x_PieCtrl.c源文件里- j8 H6 u# K. N3 m/ P6 g0 t! U" q
InitPieCtrl();. J) E6 H; Y% [$ n; @; z/ W8 g
// 禁止CPU中断和清除所有CPU中断标志
) L& p- g8 Q, V. r* \IER = 0x0000;
% \& g, N7 \. C9 `2 o. YIFR = 0x0000;1 k6 l5 a& _$ ^$ v5 H& K4 |
+ M2 \$ D* K/ Q% J$ R
//初始化PIE中断向量表,并使其指向中断服务子程序(ISR)9 [" g+ U/ k5 x- Z
// 这些中断服务子程序被放在了DSP280x_DefaultIsr.c源文件中# Q( m) T" v2 C, c+ q! m$ M
// 这个函数放在了DSP2833x_PieVect.c源文件里面.: O, d: I3 k- G3 m
InitPieVectTable();
, J) P" T$ \" q' f- }
' l. Z5 `8 v1 Y) U8 o+ Q1 Z. K3 fGpioDataRegs.GPBDAT.all =0x00000000;//第28、29位为低电平LED灯亮
" p `9 r k. m }GpioDataRegs.GPCDAT.all =0x00000000;//第0 -4位为低电平LED灯亮
0 ?/ `3 b! e. L; vdelay_loop();) g+ S8 K y3 \( h
delay_loop();( x0 z) v! U9 k; j
& b2 |! z5 M5 R// for(;?6 ]! {1 X$ h+ {- L
3 K( w- p" @" h M) h" Swhile(1)" s9 P% Z9 f9 @2 l
{ P! \0 W: B8 j. H+ ] t
delay_loop(); //延时7 O0 l ]# g( u; \, B! G3 P/ y
GpioDataRegs.GPBTOGGLE.all =0x30000000; //电平翻转2 e' o) C& A$ N/ Z1 v
GpioDataRegs.GPCTOGGLE.all =0x0000001F; //电平翻转
( F& C6 z/ u/ c: x$ O- p }1 j) @, h! B0 M2 M/ d# H4 k( V9 h" z; e
& @3 V5 V) P" n* P' `9 l6 _, r4 Z/*
' C7 F5 k: u% P& r; j" lEALLOW;
; D9 H# r' }. v// 把LED灯熄灭
+ C9 G7 C8 P0 e; Q. ~5 v ]GpioDataRegs.GPBSET.bit.GPIO60 =1;
: z$ n4 p2 j0 PGpioDataRegs.GPBSET.bit.GPIO61 =1;* {" w- m$ _2 c- g! z V
GpioDataRegs.GPCSET.bit.GPIO64 =1;3 c0 T/ A0 n: R# m; u
GpioDataRegs.GPCSET.bit.GPIO65 =1;
# G# K% n5 a9 XGpioDataRegs.GPCSET.bit.GPIO66 =1;+ Z | |; [4 n$ r5 B
GpioDataRegs.GPCSET.bit.GPIO67 =1;: _% i0 u. h" j6 n; b/ [" x
GpioDataRegs.GPCSET.bit.GPIO68 =1;5 t. B( b5 G. G- x$ g3 b
EDIS;: |) b) A+ O& D
9 |1 t& T9 z5 Y5 y3 s
delay_loop();
7 y3 [: E P8 b+ Z- u. |& \1
6 v) c; \( ~# L8 G# q) ~7 z4 e) ]/
3 T/ |: G) I- u4 F! Q7 x+ G" W// GpioDataRegs.GPBTOGGLE.all =0x30000000;
s% j, `4 O+ b0 D# z// GpioDataRegs.GPCTOGGLE.all =0x0000001F;+ E! A# i4 z3 |
/ EALLOW;
! ~; H2 d4 ?! F4 V1 Z# F// 打开LED灯7 Z6 ]; g1 h1 ]% p7 p5 t" i
GpioDataRegs.GPBCLEAR.bit.GPIO60 =1;
8 c' S& `& I" L6 l. v+ B' KGpioDataRegs.GPBCLEAR.bit.GPIO61 =1;
, ^; m8 y) J e: U1 q, XGpioDataRegs.GPCCLEAR.bit.GPIO64 =1;
3 {7 g# ^+ |4 G. K- C" v! VGpioDataRegs.GPCCLEAR.bit.GPIO65 =1;
- C0 S2 f* _( f+ {GpioDataRegs.GPCCLEAR.bit.GPIO66 =1;; W- P- @+ l. i0 y4 N' w+ t8 c: p
GpioDataRegs.GPCCLEAR.bit.GPIO67 =1;
( P( ?" Y" E; }) q/ A1 {) L+ E3 e Q1 DGpioDataRegs.GPCCLEAR.bit.GPIO68 =1;2 M7 H0 O; f- i! V+ Z
EDIS;
* l1 s1 i0 i+ W+ x* C8 b*/7 j& F- S) B: e/ D. }
* J4 u3 D, q# L( S; c1 Y) X8 m
return 0;
5 B6 ~, F; S$ o. A! p9 C5 y g1$ S* Z; _; k2 J8 x+ e) W" B: L/ ?
}
+ O0 c0 Y+ F* ]6 \
) @8 M3 u m' R7 F8 x; J1 [* x8 zvoid delay_loop(), [, R; [1 j; h* p0 K
{4 [& L' K4 j/ v/ f% R, _; g
Uint32 i;
$ i& P' d& z/ d9 J6 YUint32 j;
. U$ }8 n I& `! C6 ufor(i=0;i<32;i++)) B4 B9 ~& y0 G5 O4 z
for (j = 0; j < 100000; j++) {}- i- a% G: e& f4 E
}
. m( z+ X: i7 n8 E% _% _, \6 U3 \
9 }' _0 h0 z/ Rvoid Gpio_select(void)/ }) Z7 ?9 I3 c7 s# S2 A4 h: M
{
1 y! w6 b9 P8 ~0 B* T0 A' XEALLOW;' K- O! u: m" p9 x6 a: ^
GpioCtrlRegs.GPAMUX1.all = 0x00000000; // All GPIO
0 @* k: R F1 e) CGpioCtrlRegs.GPAMUX2.all = 0x00000000; // All GPIO9 p& B8 P3 r" J( N3 T+ }. ~
GpioCtrlRegs.GPBMUX1.all = 0x00000000; // All GPIO
' j+ |; e+ z! m( `# w8 e" KGpioCtrlRegs.GPBMUX2.all = 0x00000000; // All GPIO- ` h: W) x8 C& C" M
GpioCtrlRegs.GPCMUX1.all = 0x00000000; // All GPIO6 n8 Z! y* Q* t4 m2 Z
GpioCtrlRegs.GPCMUX2.all = 0x00000000; // All GPIO3 ^+ B! \- E* }6 r# e
2 v! X" C/ E9 M$ c/ r. t7 \
4 h& x7 R9 m& l, v( ?
GpioCtrlRegs.GPADIR.all = 0xFFFFFFFF; // All outputs8 r7 M, L* ?1 q$ G1 h. B: C2 }# C4 h
GpioCtrlRegs.GPBDIR.all = 0xFFFFFFFF; // All outputs6 E+ y9 L0 g8 N1 k
GpioCtrlRegs.GPCDIR.all = 0xFFFFFFFF; // All outputs; ~* f1 t) C5 f6 C/ ]* ^2 M
. x3 y/ e; l1 s/ G, B, b) @! ]
EDIS;
3 U7 W# h- e. n' @9 }2 _2 m
% |5 O% U5 E5 h. v8 u* R; V}
5 u- Y A# d1 v5 a& n' s- `, l/ \. x X& c% \0 M/ G
% f1 Z2 ~7 j# ^; p% a6 m |
|