|
|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
F28335有三种32位的I/O口,依次PORTA(GPIO0-GPIO31), PORTB(GPIO32-GPIO63), PORTC(GPIO64-GPIO87),这些口都可以配置为普通的数字IO口同样也能被配置为外部接口。4 V4 c* G% i( o6 K/ z
这样涉及到了IO的寄存器,IO口共有三类寄存器:: O: K* c* ^( W: z# M) u6 M1 S
控制寄存器、数据寄存器和中断控制寄存器。. J! M1 c1 f; A( o( h
1、 GPIO可以配置为数字I/O或外设I/O口,GPxMUX1(2):‘0’为数字I/O,‘1’为外设I/O口;' w) M( h' |& c! s V7 b A
2: GPIO可以配置为内部电阻上拉功能,GPxPUD:‘0’为上拉,‘1’为禁止上拉
6 F u( G0 @, {1 U/ Z) K, Y3: GPIO具有数字滤波功能,GPxQSEL1(2):量化输入寄存器,可以确定是3周期采样: s! G* P9 x7 t3 q. G
还是6周期采样或者不用采样;
P+ j- z7 S* ^6 P4 Z2 j: }GPIO可以配置为内部电阻上拉功能,GPxPUD:‘0’为上拉,‘1’为禁止上拉,
/ A# h+ }6 _$ X* @/ C- L _/ L: T) r3 s/ J$ ?6 }
4、 输入输出可配置,GPxDIR是控制每个引脚的输入或是输出,‘0’是输入,‘1’是输出;
' f2 O, w: }; H b2 O( q" ~% X当GPIO配置为数字I/O时注意:
% H3 _' Y# u/ ^' G' f1)28335引脚作为输出时,虽然可以通过设置GPADAT或GPBDAT改变输出端口的高低电平,但是单独写某一位时可能会使其它引脚产生误操作。为了避免这种现象的产生,改变输出引脚的高低电平时,应该使用GPIOxSET(置位),GPIOxCLEAR(清零),GPIOxTOGGLE(反向,可以代替去翻操作)寄存器载入输出锁存寄存,GPIOxDIR配置方向,1为输出,0为输入.
0 E9 |1 W% u# a1 g# m4 ]$ E2)当使用GPADAT的时候,一般是在初始化中,在函数中使用需要添加延时,否则可能达不到预定的输出状态。使用GPIOxSET(置位),GPIOxCLEAR(清零),GPIOxTOGGLE(反向)电平会立即变化,无需添加延时。
& |/ F. L3 p* |" I F& _; r) I/ JGPIOxSET, GPIOxCLEAR, GPIOxTOGGLE仅仅等于1时才有效,等于0无效
* J2 H% P9 a9 B6 ~* p
$ o$ O0 I! z: Q/ Z( j' h以下例程是针对野火DSP28335开发板的程序,已经验证。
9 ]+ s5 i2 ]2 ~ ]8 j2 B# m3 y#include “DSP2833x_Device.h” // DSP2833x HeadeRFile Include File: m! V& K, c0 S" l* L0 h7 V% L2 {
#include “DSP2833x_Examples.h” // DSP2833x Examples Include File
' ^! L) F& p1 uvoid Gpio_select(void);
, U6 u- i' u/ B$ v' evoid delay_loop();! y: ^1 `6 E/ f' L- v
int main(void) {
$ N" W- o( _; M, aMEMCopy(&RamfuncsLoadStart, &RamfuncsLoadEnd, &RamfuncsRunStart);
7 O$ C/ S( @- s } d4 PInitFlash();
# q& H" y6 x0 F( v% b$ e. z( P
# m; J4 E1 I1 D ZInitSysCtrl();" X% w. z* r+ j* I% ]4 }$ S7 ^
& ?2 G* o+ |/ b n5 j
Gpio_select();//GPIO 初始化& Q5 u# n, h" d. ] X8 s
0 `7 m) S+ v% c9 v
// 步骤 3. 清除所有中断初始化中断向量表:
* l* O( v# K* D `! w# D- @// 禁止CPU全局中断
8 N X" G! m4 l2 o: V" ^DINT;+ n; O4 Z/ e5 A& L9 M5 r
// 初始化PIE控制寄存器到他们的默认状态., X# w/ ~& H# D6 U3 y8 w1 U
// 这个默认状态就是禁止PIE中断及清除所有PIE中断标志; x% E+ \ a) _3 [- r4 ^' \
// 这个函数放在DSP2833x_PieCtrl.c源文件里
) m' s; t2 N" \9 @3 bInitPieCtrl();/ M4 W ]3 L1 L# ~% m# D$ F
// 禁止CPU中断和清除所有CPU中断标志3 _# @9 G- m$ {- d4 |5 l9 B0 I
IER = 0x0000;
2 c0 C; w) O9 r, sIFR = 0x0000;
% N4 D& T" [! J6 B6 l# f
4 g! N9 {- g- n7 ?0 @5 m* F//初始化PIE中断向量表,并使其指向中断服务子程序(ISR). K! a9 H! a1 F' u8 p* D
// 这些中断服务子程序被放在了DSP280x_DefaultIsr.c源文件中
0 A1 G1 o1 ?; C, i/ a# X7 l, ?// 这个函数放在了DSP2833x_PieVect.c源文件里面.) Y; E% a: G" N8 H) Y
InitPieVectTable();1 ~3 x$ T# j7 `' |
* d# A) [- z6 @( N
GpioDataRegs.GPBDAT.all =0x00000000;//第28、29位为低电平LED灯亮
. }; Q1 _5 \ P# o4 hGpioDataRegs.GPCDAT.all =0x00000000;//第0 -4位为低电平LED灯亮$ I4 e8 Z" y& \
delay_loop();
7 F9 @8 K; s- |5 E5 Tdelay_loop();
& R# S3 e0 m' |2 a! j
, `5 j, V, l0 |! V5 V8 [) }// for(;?
( m6 T' k4 [! i7 A e% h
0 B2 X7 a5 H- Rwhile(1)
. o9 w6 T. l, h7 y k# L7 ] {% n* r6 O }3 r; x3 [
delay_loop(); //延时
- g' l X. }& \) e GpioDataRegs.GPBTOGGLE.all =0x30000000; //电平翻转7 C+ `0 |" h& z/ J: _( L" g3 S# a
GpioDataRegs.GPCTOGGLE.all =0x0000001F; //电平翻转8 [' R, R2 Q! v# A. l% s5 m( f
}3 }9 B7 W! S. ?" A% E
9 z8 x+ `$ }2 y/*2 W* z: w% O* `, c9 N; R) U: ]6 o
EALLOW;9 X2 E) }9 k( I% \. Q# W
// 把LED灯熄灭
) z" c* ^9 F4 UGpioDataRegs.GPBSET.bit.GPIO60 =1;( C6 C F! Y, C9 q& d7 b
GpioDataRegs.GPBSET.bit.GPIO61 =1;; L2 s9 _' M1 t$ u
GpioDataRegs.GPCSET.bit.GPIO64 =1;" |. ]1 M' R7 A6 t$ W& e
GpioDataRegs.GPCSET.bit.GPIO65 =1;$ Z! w: x! d2 z6 w. c. v8 A
GpioDataRegs.GPCSET.bit.GPIO66 =1;
' `1 n6 ^! a# t) YGpioDataRegs.GPCSET.bit.GPIO67 =1;. m% L- M7 C4 d' U1 k9 R6 b
GpioDataRegs.GPCSET.bit.GPIO68 =1;6 v- y3 `% `! w, B4 s6 ]
EDIS;, h$ Y3 C% h: W# k
5 {8 a. ?7 t. `7 B) ?' c delay_loop();" [ K/ r) T. h8 @6 U3 c
1/ W! w) C+ e7 y2 M# | m
/- J/ g7 ~' G( }- ]4 I6 Q+ A7 M: ^
// GpioDataRegs.GPBTOGGLE.all =0x30000000;
4 q* j' y- R6 W, F/ ?) S: [// GpioDataRegs.GPCTOGGLE.all =0x0000001F;
2 M6 @. Z* W; S# l5 S/ EALLOW;! r( C5 C- C! n) h
// 打开LED灯6 c9 S7 V( n j
GpioDataRegs.GPBCLEAR.bit.GPIO60 =1;2 s+ N0 I( y" L+ {1 l
GpioDataRegs.GPBCLEAR.bit.GPIO61 =1;. Z [" V. i. {, G7 I
GpioDataRegs.GPCCLEAR.bit.GPIO64 =1;' w- P1 k1 M" J& Z, B
GpioDataRegs.GPCCLEAR.bit.GPIO65 =1;
* ~ g5 N3 z, `+ x: J+ s5 }% Q$ ^3 TGpioDataRegs.GPCCLEAR.bit.GPIO66 =1;* e% V. y# p1 E; `7 q
GpioDataRegs.GPCCLEAR.bit.GPIO67 =1;# {* u1 a, g }. Q6 Z& q, a4 T- h
GpioDataRegs.GPCCLEAR.bit.GPIO68 =1;
: `2 V) A7 D; H/ M: yEDIS;
8 j) _: o8 S8 W' r*/
& M4 P0 F, \+ j* [0 f
+ R) A9 B3 }& N/ ^& U6 ?return 0;
. C4 h% E* \7 e* M4 M# z0 b1! U; X/ }; S9 S( M! e) X/ m" K
}
0 a. m4 N# {$ p( g. q5 b. b$ d* P7 J9 Y
void delay_loop()5 s; _# H0 a# c
{
: P/ }- q6 R9 k! |) IUint32 i;2 U7 `( c! y9 Y% q- `# ]! a# H
Uint32 j;
; K9 S- ? h. x# G' o9 j0 C3 v z, yfor(i=0;i<32;i++)
0 s" P; s2 B$ |( d( Ffor (j = 0; j < 100000; j++) {}2 _: u( V/ K4 O; F& x+ }
}) a8 W1 H* j+ n1 k1 z/ ~+ z
9 `4 @! r, z8 C
void Gpio_select(void)% u0 _0 Z! d* W" r
{7 H$ E5 a T; D; f! L( q
EALLOW;8 V6 B2 i3 n8 _ c: D
GpioCtrlRegs.GPAMUX1.all = 0x00000000; // All GPIO
1 r ?) R3 |" q4 t- BGpioCtrlRegs.GPAMUX2.all = 0x00000000; // All GPIO) z/ _; Z5 C: ^; E, \8 G
GpioCtrlRegs.GPBMUX1.all = 0x00000000; // All GPIO7 Z- \- M$ J8 t) b
GpioCtrlRegs.GPBMUX2.all = 0x00000000; // All GPIO
4 @$ L! ^" c$ {& m, I3 j* ]GpioCtrlRegs.GPCMUX1.all = 0x00000000; // All GPIO
. k+ l4 }7 v3 H9 K. o5 o1 P3 A1 cGpioCtrlRegs.GPCMUX2.all = 0x00000000; // All GPIO0 K2 Y* F+ q" H- Q5 m; v$ n" H- t
& k: U6 V. U9 p# z+ c
9 E: t) U" U- o- V$ W
GpioCtrlRegs.GPADIR.all = 0xFFFFFFFF; // All outputs
, U2 ^# ^0 g! FGpioCtrlRegs.GPBDIR.all = 0xFFFFFFFF; // All outputs$ U) a" ?. k# j3 @2 K v! E
GpioCtrlRegs.GPCDIR.all = 0xFFFFFFFF; // All outputs" l+ v3 K4 o- k8 A" s" x0 l
2 U$ g$ K! h' {6 ^- Y0 D
EDIS;* \- _/ l# ?% P1 R
+ h( Q; `+ F' v* T N2 G- d
}
$ m* W8 j" d+ H4 c# G% K1 g& M r" g$ F i+ T# @+ K
" Y! ~9 i6 T* R, i8 ?; O3 B
|
|