|
|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
F28335有三种32位的I/O口,依次PORTA(GPIO0-GPIO31), PORTB(GPIO32-GPIO63), PORTC(GPIO64-GPIO87),这些口都可以配置为普通的数字IO口同样也能被配置为外部接口。
3 g# X2 j$ X0 m' }8 d. c4 v: n这样涉及到了IO的寄存器,IO口共有三类寄存器:3 Y( ?" J' ?9 F! x6 w
控制寄存器、数据寄存器和中断控制寄存器。
5 u _! |2 M) B2 _' [" I7 ~1、 GPIO可以配置为数字I/O或外设I/O口,GPxMUX1(2):‘0’为数字I/O,‘1’为外设I/O口;
" H( Q' U+ i% H3 J# r2: GPIO可以配置为内部电阻上拉功能,GPxPUD:‘0’为上拉,‘1’为禁止上拉
" r6 i+ C3 N& @" c M3: GPIO具有数字滤波功能,GPxQSEL1(2):量化输入寄存器,可以确定是3周期采样! [; @7 J. t& N( l% R1 T
还是6周期采样或者不用采样;" J8 q* |8 N6 y6 P
GPIO可以配置为内部电阻上拉功能,GPxPUD:‘0’为上拉,‘1’为禁止上拉,8 Z6 p/ e- X8 [. E
/ }+ F, f6 y1 \1 W& q
4、 输入输出可配置,GPxDIR是控制每个引脚的输入或是输出,‘0’是输入,‘1’是输出;/ b/ T( n f: b* r A: d% i2 o
当GPIO配置为数字I/O时注意:% `% S0 {$ B1 Q
1)28335引脚作为输出时,虽然可以通过设置GPADAT或GPBDAT改变输出端口的高低电平,但是单独写某一位时可能会使其它引脚产生误操作。为了避免这种现象的产生,改变输出引脚的高低电平时,应该使用GPIOxSET(置位),GPIOxCLEAR(清零),GPIOxTOGGLE(反向,可以代替去翻操作)寄存器载入输出锁存寄存,GPIOxDIR配置方向,1为输出,0为输入.
7 w9 W0 U0 F$ E( ^8 G, x+ @2)当使用GPADAT的时候,一般是在初始化中,在函数中使用需要添加延时,否则可能达不到预定的输出状态。使用GPIOxSET(置位),GPIOxCLEAR(清零),GPIOxTOGGLE(反向)电平会立即变化,无需添加延时。# I- E" h" V H9 Z/ v) Q6 b8 C$ [
GPIOxSET, GPIOxCLEAR, GPIOxTOGGLE仅仅等于1时才有效,等于0无效
* a: G; x7 b; }2 k- @2 e7 T; j* d4 o- ^8 h% d; y: F7 d6 M9 U; I
以下例程是针对野火DSP28335开发板的程序,已经验证。
# C4 c- N, C( q- J; Q$ m#include “DSP2833x_Device.h” // DSP2833x HeadeRFile Include File% k8 ]( `+ F' C- B% k$ L* R
#include “DSP2833x_Examples.h” // DSP2833x Examples Include File
: }6 o. E' z$ t4 U9 V2 L* |0 ]void Gpio_select(void);
; m6 |* g; e; ^void delay_loop();
% E- d) r$ a5 h- O+ B1 M: {int main(void) {
& o( N- C \& V# mMEMCopy(&RamfuncsLoadStart, &RamfuncsLoadEnd, &RamfuncsRunStart);
8 p! N, m$ L: Y; L2 Y) oInitFlash();
, I$ F7 Q4 x' Y' f* @' W( v0 l9 m' S& y0 }0 _; y* H
InitSysCtrl();
4 |" ]1 \6 S) b8 b
- o! s5 t; V& J; T# g1 } O- @Gpio_select();//GPIO 初始化
d& U7 y# S0 C3 r2 y/ x
* k0 H1 Q( M3 f4 }0 R// 步骤 3. 清除所有中断初始化中断向量表:
" E" ?7 X1 x5 S- _% t// 禁止CPU全局中断0 M& V% z+ n- k& Y/ z( `% T) j
DINT;
- g3 _; t5 `* r0 K// 初始化PIE控制寄存器到他们的默认状态.
$ p) K* J4 z, \8 e; W// 这个默认状态就是禁止PIE中断及清除所有PIE中断标志
; E4 J0 j `& h5 q, T+ b// 这个函数放在DSP2833x_PieCtrl.c源文件里, m$ Y' b# }5 h+ V0 a- S( {
InitPieCtrl();; q" ?% s" f# c6 G
// 禁止CPU中断和清除所有CPU中断标志
m+ J8 M+ T8 M+ ~7 YIER = 0x0000;% b i3 M" o4 C- F; K. K% A( [
IFR = 0x0000;9 r( x" C0 p3 W, B
! `: }6 |/ h$ t+ z# |: b//初始化PIE中断向量表,并使其指向中断服务子程序(ISR)
1 B! t; T5 S& Q/ u5 P' m// 这些中断服务子程序被放在了DSP280x_DefaultIsr.c源文件中/ _' V7 y3 \; A# S4 c
// 这个函数放在了DSP2833x_PieVect.c源文件里面.$ @( p/ K6 E; d! ?/ R' j
InitPieVectTable();9 p; A: f8 h1 F0 ~
" O0 ?$ e: T: U5 p5 H) X: [* R& Z
GpioDataRegs.GPBDAT.all =0x00000000;//第28、29位为低电平LED灯亮
( C0 c* m( W; E& P* MGpioDataRegs.GPCDAT.all =0x00000000;//第0 -4位为低电平LED灯亮
/ l! O' P; H8 O2 idelay_loop();
5 h' ^) y- @1 @+ a6 X9 N/ J" Mdelay_loop(); z' A6 Y8 C8 a: ~2 y
5 S9 N, w7 T& y// for(;?
" R4 y; t$ z9 P8 {' u1 i
# q0 w" i; j% _! ] f/ twhile(1)
1 r; E X6 H, ]. I: {/ I {! ?% R+ d1 M+ D/ B# p
delay_loop(); //延时
8 I2 [8 ?" W; A2 b4 O9 E GpioDataRegs.GPBTOGGLE.all =0x30000000; //电平翻转( l, r! v: }3 c4 [5 S* S
GpioDataRegs.GPCTOGGLE.all =0x0000001F; //电平翻转: [* M- [1 m4 A6 w
}
. u+ q" [2 ?9 m* @8 p3 B! { Z$ O2 z: W7 T
/** ^9 {) B5 B0 \3 s& d; [
EALLOW;0 g! S W* O8 u) I7 \6 ]
// 把LED灯熄灭1 n1 L4 U& L% i6 M6 z, j9 s! @
GpioDataRegs.GPBSET.bit.GPIO60 =1;. L2 t$ ^3 Q: k) L+ _
GpioDataRegs.GPBSET.bit.GPIO61 =1;2 A& T! d: }; E( E$ ]: f
GpioDataRegs.GPCSET.bit.GPIO64 =1;- V A. U7 y8 O, o' M% E6 K
GpioDataRegs.GPCSET.bit.GPIO65 =1;# Q& C9 ~! i$ k, G) |& _% z) I/ `
GpioDataRegs.GPCSET.bit.GPIO66 =1;/ k6 e. Z# V4 R) Z
GpioDataRegs.GPCSET.bit.GPIO67 =1;% Y/ ~5 |, O. L5 n0 ^
GpioDataRegs.GPCSET.bit.GPIO68 =1;! z! C8 P+ a8 h _: l9 v" \/ e
EDIS;
2 I. L9 c9 Z9 s0 ?% |( e' I% @+ s3 C7 i5 B t
delay_loop();
: g9 Y3 K! R% F/ j; r1
( u3 X% e K" K! P/1 ?. Q7 g k. q4 U
// GpioDataRegs.GPBTOGGLE.all =0x30000000;
8 v- S% W/ S0 S) n- ^! y* s7 |/ y8 h// GpioDataRegs.GPCTOGGLE.all =0x0000001F;# b: j/ \) A9 c0 ~* {) h+ d' r
/ EALLOW;
3 A' i% A( T# b1 Y, N' J// 打开LED灯0 W4 v& a6 C3 N& a: I& `% C5 u
GpioDataRegs.GPBCLEAR.bit.GPIO60 =1;4 f, R* x( }% Q3 Y" t
GpioDataRegs.GPBCLEAR.bit.GPIO61 =1;5 @' c8 _/ M: ^& R, |9 ~
GpioDataRegs.GPCCLEAR.bit.GPIO64 =1;
# d# v4 ]! h# X6 r$ F+ D9 t. PGpioDataRegs.GPCCLEAR.bit.GPIO65 =1;: d( E8 e' |6 Q; b, F7 A$ X" k
GpioDataRegs.GPCCLEAR.bit.GPIO66 =1;- l! ~+ L6 R; x9 \# ~
GpioDataRegs.GPCCLEAR.bit.GPIO67 =1;0 o( [0 m# F' L% J
GpioDataRegs.GPCCLEAR.bit.GPIO68 =1;( O0 U% `" y- Q
EDIS;* S. f8 j; I+ v. N
*/
+ F: O. X3 U. s5 ~5 T4 s, W
0 ?+ `8 m6 v' X3 ~3 V1 _return 0;
. i* b- T5 P. r9 q2 `, w1
6 {1 g- ]3 @" A5 ~: |; @}+ q/ J5 Y8 v8 z6 V+ |/ g; w% ^
# @: E/ N8 {( d9 S" Hvoid delay_loop()
0 Q; A3 d }$ ~$ i{$ F& E$ R9 R( M9 A! X8 \
Uint32 i;
2 s6 r# l5 m Y" H7 ?( f( VUint32 j;
8 G7 E0 W5 h! n8 [1 b0 {$ f* `0 nfor(i=0;i<32;i++)5 R! n- \6 d& l6 n9 @7 z
for (j = 0; j < 100000; j++) {}0 F: X; Y7 c, d3 I0 y8 L: e
}+ K& w& q& `0 H% f
0 ]' l* L0 z9 d4 e2 H! X$ d
void Gpio_select(void)0 B- |! G; V5 I
{3 ]5 `/ q3 W J* A8 c% ? w! t7 x5 G7 h
EALLOW;; S& `2 x% D+ u( N8 m. G
GpioCtrlRegs.GPAMUX1.all = 0x00000000; // All GPIO
/ I9 v. n0 T* s0 j; {8 xGpioCtrlRegs.GPAMUX2.all = 0x00000000; // All GPIO7 W% }+ I( i+ _+ {( r* d
GpioCtrlRegs.GPBMUX1.all = 0x00000000; // All GPIO/ ~1 u# u9 S( e% {
GpioCtrlRegs.GPBMUX2.all = 0x00000000; // All GPIO( }( q& V: P5 ^' R2 @4 q# S
GpioCtrlRegs.GPCMUX1.all = 0x00000000; // All GPIO
: A; Q0 Q' C( w) N; DGpioCtrlRegs.GPCMUX2.all = 0x00000000; // All GPIO
& J/ c$ c/ } e& O
' R0 }: h G5 _+ f6 `$ L
( [/ Z8 D3 n) M4 q9 {3 PGpioCtrlRegs.GPADIR.all = 0xFFFFFFFF; // All outputs7 R4 f! w; q+ X- v- ^( K
GpioCtrlRegs.GPBDIR.all = 0xFFFFFFFF; // All outputs
! H5 T: R) P, {" _' `6 k" WGpioCtrlRegs.GPCDIR.all = 0xFFFFFFFF; // All outputs
+ u* c* b5 A7 X$ \+ u( C; u5 A
; _- s7 B2 V1 n; PEDIS;
" C }6 `! t+ w" ?% y6 `9 W! {
' i6 ~' c7 {- v @9 M}
6 K* p' X* C5 T1 H, M0 z+ A3 q1 D& F9 s9 B A# j. k
" C1 u' U! b; t* `7 h |
|