|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
GPIO通常用来做普通的输入输出,比如按键啊,LED啊,或者芯片的片选段之类的,算是最基本的操作。) J9 r5 `. B$ O* ]. l
话不多说,直接上 代码+注释 记录一下,以备以后使用( X$ f3 P* g+ n3 M, N* X2 D$ L
我用的板子是研旭实用板
, v4 c# |, z, S2 z$ `4 S \! ^) P( V! V" k. g
led.c' b a: s$ v% D9 |/ T. B
#include "led.h"' Y8 }9 q+ N% ^) H) J* M7 r* F
//LED和蜂鸣器初始化
& y& T% N2 Z4 D. N; W: cvoid Led_Gpoi_Init(void)
6 _/ g- M3 j- i5 Q/ z" c: p{
5 B9 ^8 o1 R3 r" c; g) z/ X0 aEALLOW;$ t8 { X" M+ f) a/ T$ ~% p
GpioCtrlRegs.GPAMUX1.bit.GPIO0 = 0; // GPIO0复用为GPIO功能4 e. O5 ^4 ~7 D. |. ]
GpioCtrlRegs.GPADIR.bit.GPIO0 = 1; // GPIO0设置为输出
% u' L% i) d# E; D# \1 v: k9 oGpioCtrlRegs.GPAMUX1.bit.GPIO1 = 0; // GPIO1 = GPIO1: T/ R7 C; k! S0 Z! O$ n D+ z: [
GpioCtrlRegs.GPADIR.bit.GPIO1 = 1; //GPIO0设置为输出' t' z* A' v: M! y" E5 H1 E
GpioCtrlRegs.GPAMUX1.bit.GPIO6 = 0; //配置同上
5 w x0 B l3 f) yGpioCtrlRegs.GPADIR.bit.GPIO6 = 1;
9 K& [9 H* _8 }9 E$ d1 i. LGpioCtrlRegs.GPAMUX1.bit.GPIO7 = 0; //
/ b, K h4 Z$ x9 C9 Z. rGpioCtrlRegs.GPADIR.bit.GPIO7 = 1;
3 C+ D' R+ Z* d* T% z7 ~4 EGpioCtrlRegs.GPBMUX2.bit.GPIO60 = 0; //蜂鸣器GPIO设置,GPIO60复用为GPIO功能1 x+ {( J4 {( i2 I; ^6 U D
GpioCtrlRegs.GPBDIR.bit.GPIO60 = 1; //设置为输出
5 X. _8 C! a% Z6 y: F3 N LED1 = 1; LED2 = 1; LED3 = 1; LED4 = 1;BUZZ_OFF; K% {" Q# M7 v' X/ O% e; {
EDIS;
3 K* E7 @+ h' u}
K/ N# g9 f4 u6 n3 l
/ R3 u1 Q' s. |) ~led.h% X% E/ t0 J* i
#ifndef LED_H_( j/ A r/ b3 `: y, U
#define LED_H_
% C* {! _( U1 [, W ~+ q+ W0 D$ c" k! J! y5 Y7 @
#include "main.h"
& m6 t5 e d H( y# r7 G
% {* @) W& T. D, i//根据原理图,低电平LED亮
+ R7 _/ l0 b2 T2 N: F3 @. a#define LED3 GpioDataRegs.GPADAT.bit.GPIO0 //宏定义LED的数据寄存器! R$ D0 X8 O* u6 m, X
#define LED4 GpioDataRegs.GPADAT.bit.GPIO1( M0 v7 F. |) q1 R2 m/ G
#define LED1 GpioDataRegs.GPADAT.bit.GPIO68 d6 Y7 g8 `9 E# F- M0 a/ `
#define LED2 GpioDataRegs.GPADAT.bit.GPIO7" t, Y& s% u# I! y" A
' g5 b$ ]( M& Y- _% j( `) D
#define BUZZ_OFFGpioDataRegs.GPBSET.bit.GPIO60=1; //蜂鸣器不鸣叫4 ?* r! B) o+ v0 }4 w
#define BUZZ_ONGpioDataRegs.GPBCLEAR.bit.GPIO60=1;//蜂鸣器鸣叫, ~- A" b/ S' D( J7 k+ W9 d. D
b; t6 E2 ~ a% \9 k
void Led_Gpoi_Init(void);
2 M- j% `0 z5 A9 j Y) z" w8 B$ Z2 y2 n( e' R: M3 q
#endif /* LED_H_ */
3 e5 x7 Y& K8 }" i* S4 \$ n5 [4 z- l, Y* q6 ]
key.c( r# n9 I5 I( v5 W% \' i4 H" c8 D% U
#include "key.h": H d* s+ O( \- Z4 ^
//按键IO口初始化% H% b C7 i- s
void Key_Gpoi_Init(void)
% ]: Z0 h) f$ M# V d6 Z% g{1 t) s) d" b# K+ _; h7 v9 L
EALLOW;. J. H/ i8 A% w- t) {
GpioCtrlRegs.GPAMUX1.bit.GPIO13 = 0;//按键GPIO设置,GPIO13复用为GPIO功能
) r8 P4 q& N K o) p+ d5 B8 YGpioCtrlRegs.GPADIR.bit.GPIO13 = 0; //设置为输入) }6 V6 p. z0 T; ]
EDIS;( \2 k$ H- y/ Q2 a& q* X
}4 f8 l" ]9 J/ J
) Z: Y2 z8 l e& e' W4 V
# t9 ]* E8 R% i# J, c6 lu8 KeyScan(void): k6 f* {/ b# o
{
5 U; h0 J- @5 o9 E% u4 f) u2 f) ~static u8 key_up=1;//按键按松开标志# S; V+ E8 ?' u, G$ ^
5 d. F( E/ t2 k. ]4 q8 f
4 T" v" E# s8 u& y% c }, N
if( key_up&&(KEY0==0) ) //有键按下 ||KEY1==0||KEY2==0)
- R/ C5 m) z$ o( Q0 [{
9 _1 x- K. O/ F8 S& B DELAY_US(10000);//去抖动& ^! g) y3 r1 N+ q8 b
key_up=0; //表示按键没松开7 H; @4 y6 `2 `$ r
if(KEY0==0) //按下KEY06 \6 g6 Y/ l' L5 O3 ~( o" w
{+ k7 x! C5 ~, U) V
return 1;! y/ y) x3 V: ^/ Q+ V
}: C- X: s5 {8 T3 b' g9 b
// else if(KEY1==0)& g; ?/ P' H6 q' X1 F
// {return 2;}
# X( D4 C/ w5 P0 V6 K3 L, P2 ?- S// else if(KEY2==1)# l$ r9 T6 ^5 U+ J$ U. r' R
// {return 3;}}! s; `2 h9 R$ \% h
}
4 l, |& L* R2 l' g) r5 M else if(KEY0==1)key_up=1; //&&KEY1==1&&KEY2==1没有键按下# Z. @6 q: z9 \8 i, b/ Y" T
return 0;// 无按键按下
" I1 L$ q" P. A6 j6 M9 @}$ u% Q# {: S. m
& {, }1 B5 n' p9 v$ _* W/ q8 a3 ^( _key.h- p- q- b, v$ ^, ^) {6 v1 M1 H
#ifndef KEY_H_
9 l# m2 e3 |: O& `6 b) j: r#define KEY_H_
s! K- A' x; @# B#define KEY0 GpioDataRegs.GPADAT.bit.GPIO132 s, \! `; o1 }0 U: b4 d( m& ?# t5 R1 E
#include "main.h"# N3 P# y& T T5 j
/ J$ [+ J/ f' z& K( r
void Key_Gpoi_Init(void);
\/ E8 \8 {! w0 s N7 ku8 KeyScan(void);
3 f& u k* l& ` H* X$ E
0 t$ l% c" [+ O0 ~% b#endif /* KEY_H_ */
t; _4 {" ~, l3 ^/ \
# a3 R7 l; y: c% U) IMAIN.C7 S% X3 `0 J* Z8 c0 W& N
void main(void)7 X* R. D& s" e
{* l. u3 P8 D: j) r2 ?
u8 key=0; 1 x0 ^7 _7 c, j* w1 K N S
//初始化
* j& C' @- e- X/ ?1 y InitSysCtrl(); //初始化系统时钟到150M,关看门狗,开启外设时钟3 d7 p4 u' W8 G X& D
InitGpio(); // 初始化GPIO到复位状态/ A; b, G3 e) s
- C3 e* @2 y8 D/ }) ?; o& Z7 S8 | DINT; //关闭CPU中断3 D& J D. A, W1 m( y1 ?
InitPieCtrl();
6 y% K# H2 ~5 @; ^9 t `& m6 \ IER = 0x0000;8 z: F$ ]+ k1 Y Z: N' H
IFR = 0x0000;
+ K; [) Z! I+ }7 \/ u' S InitPieVectTable(); //初始化中断向量表+ N' w( A* C- E0 e- s; q
" t6 @( Z. e _* H
//外设配置9 j* c7 e7 q2 Q5 L" X% I, Q
Led_Gpoi_Init(); //led端口初始化. E- n' D6 a, ? i
Key_Gpoi_Init(); //按键IO初始化
6 G" z4 B4 x+ D7 H; J while(1)/ H% z/ F o7 Y: [# Q* a
{
8 x& \5 @& V+ O" e2 I key = KeyScan() ; //扫描按键/ `! ^1 H+ N& ?. e! x; D% P! [
switch(key) //根据键值来做出不同的相应6 p4 Z* S: G5 K4 {% ^9 Z
{
! `' r. q7 S- Z+ [* P+ o6 f+ ` case 1 ED1=0;break;
: m9 F" ]6 S2 v# D; R0 l case 2:.......
' H R. Z" v) K6 }' ]% d3 t .....
! C1 a7 a' X# ]) y; n( r .......9 R4 b; J0 w8 L0 @
}) f, v: ^6 o q& T& K; P6 @
}
' `! B2 p0 } p. ]}
" Z+ D, C+ g) e
, t+ {; e5 [4 M5 N; H7 S" t3 Emain.h
% a& f6 c8 C* k" ]) j1 C9 B#ifndef _MAIN_H
! C; P" @) e+ a. [3 g5 m! T* z: G#define _MAIN_H" w* ^; n# I: D! L$ L% @
4 u% y; y& [7 [6 {: [2 t' m- P8 s) G
#include "DSP2833x_Device.h" // HeadeRFile Include File
/ F3 }; ]+ d( T! e0 _1 F#include "DSP2833x_Examples.h" // Examples Include File
+ L4 ~7 E7 B' Y; ?& X5 N6 Z- R& A z. t( V# \5 r7 ?1 C
#include "flash_ram.h", x1 G2 m; X* h3 }# E9 A6 y
#include "led.h"
* g5 M4 h6 N2 }- U+ x. W: A! c#include "key.h", y& i( G/ m. b6 y
#include "extint.h"
& T" x- X) w: N0 ]/ Y#include "timer.h"
- K" k" T1 z9 d8 h9 V) F#include "sci.h"
$ Q4 s' b. k8 L0 ^- P6 b4 x J! _8 r#include "pwm.h"/ R, h7 f3 }/ p) R; W9 p* H% N( f
#include "cap.h", ^# z! r9 L; J/ U7 Z
#include "ad.h"
) s8 J$ H3 N! n+ z#include "can.h"6 y$ [% @6 F# n5 N
#include "spi.h"9 S; L5 _+ J" [2 H1 |! s" s
/ r+ E1 S4 b' `* r
#include "NRF2401.h"
% y. e8 H4 r6 I; G+ @; r% E$ [5 @, e% ]9 G5 Q/ k
#endif( y$ O; Z3 d* z3 ~) |3 j U
|
|