EDA365电子论坛网

标题: 28335的GPIO的引脚配置 [打印本页]

作者: kiygb    时间: 2021-12-15 13:37
标题: 28335的GPIO的引脚配置
F28335有三种32位的I/O口,依次PORTA(GPIO0-GPIO31), PORTB(GPIO32-GPIO63), PORTC(GPIO64-GPIO87),这些口都可以配置为普通的数字IO口同样也能被配置为外部接口。
6 b9 f, p+ a8 [/ z这样涉及到了IO的寄存器,IO口共有三类寄存器:
% H3 ?6 N( ^& b3 G$ H' E控制寄存器、数据寄存器和中断控制寄存器。9 M) }3 z" ^5 V& [$ w  h" o. j
1、 GPIO可以配置为数字I/O或外设I/O口,GPxMUX1(2):‘0’为数字I/O,‘1’为外设I/O口;' T# [2 U7 v$ I, E' Q" L
2: GPIO可以配置为内部电阻上拉功能,GPxPUD:‘0’为上拉,‘1’为禁止上拉
+ n! z: b$ t3 s/ i# V3: GPIO具有数字滤波功能,GPxQSEL1(2):量化输入寄存器,可以确定是3周期采样
, ~3 D, ?* k. z9 O5 [9 s还是6周期采样或者不用采样;
+ [" x& N" c3 Q/ kGPIO可以配置为内部电阻上拉功能,GPxPUD:‘0’为上拉,‘1’为禁止上拉,
5 ]9 v1 p2 D+ I; U& ?2 g
( \) q9 X& t) x8 j  r' a, ^0 N# b4、 输入输出可配置,GPxDIR是控制每个引脚的输入或是输出,‘0’是输入,‘1’是输出;
. A9 r! f+ m7 o" F' x# x) S; a当GPIO配置为数字I/O时注意:
* ]* [$ C5 W: S( ^1)28335引脚作为输出时,虽然可以通过设置GPADAT或GPBDAT改变输出端口的高低电平,但是单独写某一位时可能会使其它引脚产生误操作。为了避免这种现象的产生,改变输出引脚的高低电平时,应该使用GPIOxSET(置位),GPIOxCLEAR(清零),GPIOxTOGGLE(反向,可以代替去翻操作)寄存器载入输出锁存寄存,GPIOxDIR配置方向,1为输出,0为输入.
: [# D) a. P' K) {$ J/ U7 v0 h2)当使用GPADAT的时候,一般是在初始化中,在函数中使用需要添加延时,否则可能达不到预定的输出状态。使用GPIOxSET(置位),GPIOxCLEAR(清零),GPIOxTOGGLE(反向)电平会立即变化,无需添加延时。/ P* ^5 u+ t' W! r. ]7 P
GPIOxSET, GPIOxCLEAR, GPIOxTOGGLE仅仅等于1时才有效,等于0无效
. l4 w$ ]4 f/ ]1 l. e8 Q
% o1 M# q: [! F8 ^以下例程是针对野火DSP28335开发板的程序,已经验证。  L' Q8 z& ?/ t; u+ Y
#include “DSP2833x_Device.h” // DSP2833x Headerfile Include File
" d- k" d- x# U! K; a/ k$ H0 f#include “DSP2833x_Examples.h” // DSP2833x Examples Include File8 r2 Z0 H! ]6 ~" V& d! c3 J
void Gpio_select(void);
. Q) {" U/ \3 F7 rvoid delay_loop();
" m# W+ [, |& G# U  tint main(void) {4 y; ]7 V) `1 H8 u% s: G% E
MemCopy(&RamfuncsLoadStart, &RamfuncsLoadEnd, &RamfuncsRunStart);# ?" w) _6 G- N6 }. O
InitFlash();* }, x3 G) q9 \7 U+ z
/ N+ }- c4 |$ s7 r2 g: w/ Q! e4 ]' G
InitSysCtrl();
6 y6 }4 E  p. Z+ q! y+ j- v" D; T! T& ^5 ^5 x# v0 V
Gpio_select();//GPIO 初始化" a2 d: ^$ e4 }- r" f
9 T% C* h* o6 r% l# r2 i$ U9 g8 t
// 步骤 3. 清除所有中断初始化中断向量表:
* n+ v' O  f; W$ t$ ^// 禁止CPU全局中断2 B- B+ ?! Y  R- f
DINT;
, n1 A! Z8 m  m( d// 初始化PIE控制寄存器到他们的默认状态.
5 r" e3 \8 [$ p// 这个默认状态就是禁止PIE中断及清除所有PIE中断标志
8 g% [% _) f. _9 ?! i5 D0 j3 j// 这个函数放在DSP2833x_PieCtrl.c源文件里
( q/ p8 I8 f# C/ ZInitPieCtrl();+ C* t1 b: M4 L; e- C: ]- h. _
// 禁止CPU中断和清除所有CPU中断标志# S& A: [) W# _3 a; d( p
IER = 0x0000;, t3 s( C2 G, r! U- Z, u
IFR = 0x0000;1 U$ M3 E* g5 M% p; Z" v# z, l% c

, `8 q  j  M$ T//初始化PIE中断向量表,并使其指向中断服务子程序(ISR)0 }9 |: l: V9 ]7 n+ r
// 这些中断服务子程序被放在了DSP280x_DefaultIsr.c源文件中( g/ `, H5 C* V# r( l8 q8 D
// 这个函数放在了DSP2833x_PieVect.c源文件里面.( \8 k' P6 P* x- l( Y
InitPieVectTable();
3 \: a+ Q  ]& s
. d1 J0 x  @; g' g* BGpioDataRegs.GPBDAT.all    =0x00000000;//第28、29位为低电平LED灯亮
# j9 a5 g9 _, j. L3 R. [GpioDataRegs.GPCDAT.all    =0x00000000;//第0 -4位为低电平LED灯亮1 M6 Z9 g4 B) f4 l( V
delay_loop();  g# L& j. R0 J: {0 m* P# ?7 @
delay_loop();* B1 ~! W7 i$ I: B. O9 O6 h

) j! H3 Y6 ~, f1 l+ \// for(;?$ i6 ~. L7 u* r8 W/ O# e1 X& }0 k( b: y

9 J5 r4 K$ S; D) D4 d6 q' ?while(1)
& d+ N8 }. S" W3 s3 K0 F0 A/ l- Z    {
9 i! U0 N0 W. p( b" Y# ^/ z/ u+ e       delay_loop();  //延时
# l' ~& y, _  P( d" w0 x       GpioDataRegs.GPBTOGGLE.all =0x30000000;  //电平翻转
+ y& p! s+ S% L& n       GpioDataRegs.GPCTOGGLE.all =0x0000001F;  //电平翻转
; v% X7 l1 a: A5 J  _- g# }    }! ~0 U' r* z! H5 n

! g/ b! T0 T, _. w3 o, ^  ^: }2 q/*; l( {% |" h' z, L$ O0 H, R
EALLOW;
# D8 v* r: I5 Z, ?// 把LED灯熄灭( Q+ l+ G) s. f8 C" O
GpioDataRegs.GPBSET.bit.GPIO60 =1;
+ g, \/ o0 @" {, g$ m8 X+ vGpioDataRegs.GPBSET.bit.GPIO61 =1;3 `3 |- k  }7 [$ d8 H+ _
GpioDataRegs.GPCSET.bit.GPIO64 =1;
6 w! w$ a0 }" h! JGpioDataRegs.GPCSET.bit.GPIO65 =1;, c  G4 x3 s- _+ J% V
GpioDataRegs.GPCSET.bit.GPIO66 =1;) H& j3 P  g5 b9 E
GpioDataRegs.GPCSET.bit.GPIO67 =1;) @- e5 _7 N2 v7 s  @) X
GpioDataRegs.GPCSET.bit.GPIO68 =1;
* V1 R; G+ K) `. _4 f8 qEDIS;
1 i. O4 R5 |: ^+ }* R/ ~
' A+ `& o; O+ s5 z: w9 V   delay_loop();' E/ ]; t. B4 }' Q) N9 A/ Q5 w1 O& i
16 Q1 ]3 X" ~$ i5 j/ v
/
4 c+ N( d. @  Q// GpioDataRegs.GPBTOGGLE.all =0x30000000;
7 \  B( ^$ D3 h- u// GpioDataRegs.GPCTOGGLE.all =0x0000001F;
9 a& ?8 o6 V! O. S) P5 |5 h) o1 q/ EALLOW;
* d2 i' E1 Z0 a7 I) d6 w5 o// 打开LED灯# \& F  z3 i( G& k  ?
GpioDataRegs.GPBCLEAR.bit.GPIO60 =1;* P/ V& `* f% F( p# k% d
GpioDataRegs.GPBCLEAR.bit.GPIO61 =1;- J: W: U1 ~2 b$ v8 b
GpioDataRegs.GPCCLEAR.bit.GPIO64 =1;1 w4 A5 |, F+ \0 h  L
GpioDataRegs.GPCCLEAR.bit.GPIO65 =1;
1 E8 \' p' C1 m0 U6 _5 P- fGpioDataRegs.GPCCLEAR.bit.GPIO66 =1;
( w! l0 `$ N. yGpioDataRegs.GPCCLEAR.bit.GPIO67 =1;/ E6 Z& u( s9 ]8 m5 Y
GpioDataRegs.GPCCLEAR.bit.GPIO68 =1;
2 W( O. i: }) K  y, EEDIS;& a( [, `6 @7 E" a
*/4 X. f5 x- T$ N* L. a0 l" E
: m+ t) {. O  y; z
return 0;
0 q4 g; h5 a/ }: u1: N% ^( m7 d6 K* G# Q& c0 N  I
}
; D  Y8 H4 {5 c( T, p9 K; |( U- \; k; G# J! q; q* ?
void delay_loop()
& }+ S4 I: B! t- k) e5 z- f{
( H; y9 [9 i) O/ W- \& @5 c" ^* dUint32 i;
* K  r8 V- D+ e+ tUint32 j;) f8 `( t9 m) `& \0 i4 e$ a5 {( g
for(i=0;i<32;i++)
+ C: h+ }: N. |for (j = 0; j < 100000; j++) {}
8 K8 P3 W$ F( a) j3 w: j}
; J1 _+ T) F* }& _+ l8 \1 O2 G! ?1 K+ f
void Gpio_select(void)
# c. m( J# H/ Z& w3 z{+ K: U8 m! y5 A
EALLOW;
6 a9 R. F7 V/ ]/ `) E+ d! U( _GpioCtrlRegs.GPAMUX1.all = 0x00000000;  // All GPIO
3 I) \1 h6 e9 v' j* b$ oGpioCtrlRegs.GPAMUX2.all = 0x00000000;  // All GPIO
6 c& d! s" v/ E1 I3 e4 {GpioCtrlRegs.GPBMUX1.all = 0x00000000;  // All GPIO4 f+ ~* s4 D- k$ E7 ?
GpioCtrlRegs.GPBMUX2.all = 0x00000000;  // All GPIO
) Z' q1 B) a# c, {. M/ zGpioCtrlRegs.GPCMUX1.all = 0x00000000;  // All GPIO& O/ w. r, i7 }% g- R* G8 F
GpioCtrlRegs.GPCMUX2.all = 0x00000000;  // All GPIO, g, |1 |4 j6 z2 v3 Z, j/ m6 ~3 y
% L: w* }+ f( W0 m

; l2 D& i% N) EGpioCtrlRegs.GPADIR.all = 0xFFFFFFFF;   // All outputs
2 H* M3 D3 y4 q% gGpioCtrlRegs.GPBDIR.all = 0xFFFFFFFF;   // All outputs
1 }8 x1 C% g. q1 ]/ |  R% ?GpioCtrlRegs.GPCDIR.all = 0xFFFFFFFF;   // All outputs7 V7 F- |2 t0 s

* J! t0 i7 r) U& {: |EDIS;: {! d# z: K# u4 {+ |/ ?
# G6 J: r0 a1 {/ {
}) ]: [7 E% U6 r+ M. S
, x( w1 B2 a$ V6 U  o1 e0 t/ m

6 I  p+ F( p0 R- z0 N# z, o. a
作者: sdsdwwwe22    时间: 2021-12-15 16:06
28335引脚作为输出时,单独写某一位时可能会使其它引脚产生误操作
作者: nuiga    时间: 2021-12-15 16:07
利用GPIO的数字滤波功能,确定采样周期
作者: grand    时间: 2021-12-15 16:08
  GPIO可以配置为内部电阻上拉




欢迎光临 EDA365电子论坛网 (https://bbs.eda365.com/) Powered by Discuz! X3.2