|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
GPIO通常用来做普通的输入输出,比如按键啊,LED啊,或者芯片的片选段之类的,算是最基本的操作。7 d8 Z+ O; b4 ]' A: W' p @, e5 d
话不多说,直接上 代码+注释 记录一下,以备以后使用+ m$ x9 a" K7 |6 g
我用的板子是研旭实用板
3 S9 P0 N# [# {/ _* {) H' Z# W) `8 `9 x$ P; D
led.c) }1 ] ?# K9 }$ D# \' s2 p; y' r
#include "led.h"! w, l/ @; K9 S" U+ x; W
//LED和蜂鸣器初始化+ Y" @7 [, V7 N6 ^. ~# j' k
void Led_Gpoi_Init(void); A# q7 E! c$ n- P8 O4 M. d3 h) Y
{9 _) X6 H# ]9 o' x' D7 S
EALLOW;
, ~7 B( x0 s6 [GpioCtrlRegs.GPAMUX1.bit.GPIO0 = 0; // GPIO0复用为GPIO功能
+ D, f& R3 n9 t1 W2 n5 m8 kGpioCtrlRegs.GPADIR.bit.GPIO0 = 1; // GPIO0设置为输出
B/ B1 y9 k, D2 x" x' D) b4 {8 |( VGpioCtrlRegs.GPAMUX1.bit.GPIO1 = 0; // GPIO1 = GPIO1
$ J3 h- \% q+ b8 a; S1 a4 y/ K1 \GpioCtrlRegs.GPADIR.bit.GPIO1 = 1; //GPIO0设置为输出0 U# ]. A; X( d# O. |
GpioCtrlRegs.GPAMUX1.bit.GPIO6 = 0; //配置同上
+ l8 }4 u: E6 A+ aGpioCtrlRegs.GPADIR.bit.GPIO6 = 1;
2 _2 b9 G1 n$ p J3 s5 O& J9 TGpioCtrlRegs.GPAMUX1.bit.GPIO7 = 0; //- x. f% P3 M! q. O
GpioCtrlRegs.GPADIR.bit.GPIO7 = 1;
8 ~, {- I, A5 @& nGpioCtrlRegs.GPBMUX2.bit.GPIO60 = 0; //蜂鸣器GPIO设置,GPIO60复用为GPIO功能
$ \& u" _* w: e: F) G& o; |, H) i GpioCtrlRegs.GPBDIR.bit.GPIO60 = 1; //设置为输出" m7 r8 Y0 Y% b2 p, o3 O3 ], d
LED1 = 1; LED2 = 1; LED3 = 1; LED4 = 1;BUZZ_OFF8 E, ]3 G4 U8 U2 |) W- d
EDIS;
& [5 A, a; h. L7 m3 m+ j}
1 O$ ~: l3 ~/ `9 \" K1 e" ~; z5 _! d
led.h
! A+ v7 f7 Y9 C2 n) G& o( B% X#ifndef LED_H_
d( H8 a9 ] o4 Z$ _#define LED_H_
* Y1 A2 j# J3 `, Y% S: [/ X* S( k$ p. J
#include "main.h"- F* C9 a! U. R3 @6 {* W0 `
, F) W8 R- n0 j- t+ v6 q2 e; u1 U. t
//根据原理图,低电平LED亮# @) d) I3 j: J/ k1 f, J
#define LED3 GpioDataRegs.GPADAT.bit.GPIO0 //宏定义LED的数据寄存器
5 l) u0 N1 x; n- W" H#define LED4 GpioDataRegs.GPADAT.bit.GPIO1
, m7 X$ p) D. M4 g7 \#define LED1 GpioDataRegs.GPADAT.bit.GPIO65 r, d% g% b7 U9 @* r8 z: p2 w8 I" D
#define LED2 GpioDataRegs.GPADAT.bit.GPIO7) Y8 Q- W' e0 C9 o
9 m6 \: K# F2 p4 i8 w! b2 \#define BUZZ_OFFGpioDataRegs.GPBSET.bit.GPIO60=1; //蜂鸣器不鸣叫
: T! u9 G6 g- M#define BUZZ_ONGpioDataRegs.GPBCLEAR.bit.GPIO60=1;//蜂鸣器鸣叫1 m- e( b7 j0 S$ `7 i
6 B, F" M) y! l; }% ]& u. h" W! dvoid Led_Gpoi_Init(void);
! K d" c- h9 r b& f
- k/ ~! N8 j" [9 N4 `9 ~' h#endif /* LED_H_ */* s: ]) D" T: E4 z/ `& e( W
8 Z4 U3 p+ ^( X0 M- H) g) l
key.c; |0 A$ ?+ A. r8 a& {
#include "key.h") { w' b- o! J T- S/ G$ Z
//按键IO口初始化" B/ f5 h, u, ], H; l
void Key_Gpoi_Init(void)7 ?4 `+ |" R" F5 V; ?0 y) t( p. y
{3 p$ C' s5 m7 q3 N* v# d Y
EALLOW;
" K+ D9 u. I+ P' x; F0 GGpioCtrlRegs.GPAMUX1.bit.GPIO13 = 0;//按键GPIO设置,GPIO13复用为GPIO功能
# d. V7 X" ?" a2 v# PGpioCtrlRegs.GPADIR.bit.GPIO13 = 0; //设置为输入* J/ v4 Q) L( t- P) p: U1 V
EDIS;; r' g$ |! m8 q& C }
}( R% n2 c" b: g8 R7 W
7 ]. Y/ {5 R8 {8 t. s3 e6 T$ f
0 R9 R0 K) q6 Y4 ^u8 KeyScan(void)3 c, S: W: W; y) C9 j l* T- H
{
/ A2 x5 a& O$ f f% g# kstatic u8 key_up=1;//按键按松开标志
' }5 X3 w6 o- j; Z4 d+ N" x
" q/ \& L* V) H$ M7 W3 U9 n2 g' B4 r8 B& g
if( key_up&&(KEY0==0) ) //有键按下 ||KEY1==0||KEY2==0)
* z+ a# }% n# F4 Z{9 E! {8 x5 Q; L- h. F
DELAY_US(10000);//去抖动
8 e! @% {* j$ E: @7 g. J key_up=0; //表示按键没松开
# F! N: \$ P1 V' { if(KEY0==0) //按下KEY00 Y* R$ t& i% p4 K
{
8 ~8 |$ v- @1 k0 Q7 ?, z: \( j, Y return 1;
- ]' e; Z+ P; ^$ B% ? }
! I# D! Z0 M0 P% F5 c$ a// else if(KEY1==0)7 A; E& [* w( x% w: s
// {return 2;}
) t r8 A" k. e$ a) [// else if(KEY2==1)! @+ S4 |- E. q7 N7 b
// {return 3;}}
* L) |( G- @. k# y# q7 }& x}# ?# ~# U" \& E" b1 k
else if(KEY0==1)key_up=1; //&&KEY1==1&&KEY2==1没有键按下, W& {9 R) t: A9 ^
return 0;// 无按键按下
, z {* K1 n% E. u}9 v5 [+ n, E0 R: ]
. S: ]) D* @/ A8 o3 e- @+ ?key.h0 U1 Y" {1 U6 Y
#ifndef KEY_H_
) j% \3 d x! x+ ~#define KEY_H_" {7 s- `6 S) w5 k, |4 I0 `
#define KEY0 GpioDataRegs.GPADAT.bit.GPIO13( Y1 A! i$ q! C4 N! I5 Y. ~
#include "main.h"3 c- E9 B6 S' q; Q3 Q, E
( d0 J. R. Z A Vvoid Key_Gpoi_Init(void);
& S' a% B2 z1 D" G9 |u8 KeyScan(void);! l6 `1 |# O1 F# }6 R3 d @# F
: Q9 Y {' R! P. v+ V+ I#endif /* KEY_H_ */. b! P9 M3 C0 p& t# p
' e0 ?& N( m4 _+ I0 R4 |
MAIN.C
2 U# B% Q$ ]& `$ A% }' Q. |void main(void)# K& W3 N7 q* p5 b+ Y. c; R
{) u9 o8 }% Y+ G, O2 z
u8 key=0;
/ _- P5 T: R: w//初始化1 j9 w! E0 S! ]2 }( r
InitSysCtrl(); //初始化系统时钟到150M,关看门狗,开启外设时钟1 | S3 }4 ~4 u3 r
InitGpio(); // 初始化GPIO到复位状态1 @! q1 a4 {+ K Z+ k* R! G
4 o# H( g" H: H/ p( W) x: `! L( ^
DINT; //关闭CPU中断
0 v' Y- p3 _+ q. ^$ M! `* p InitPieCtrl();
4 t) @) o: T4 R3 F, B8 y IER = 0x0000;; I) R" t+ f3 |/ ^1 I+ I h
IFR = 0x0000;
8 D7 S9 v+ Y% f0 [6 [( q0 G6 O4 N InitPieVectTable(); //初始化中断向量表
5 G5 e V& z+ D) [) O# i7 k
2 u2 S `+ m, N# H3 C0 L //外设配置
) g. F" j7 q ^! j1 R Led_Gpoi_Init(); //led端口初始化
1 }9 b9 `! ~5 Z: h: k# Q Key_Gpoi_Init(); //按键IO初始化
( _/ z; H; o$ L; t1 A4 ^2 F) m while(1)
" p9 ?/ W0 f" M8 t- s3 f( U6 t {
* i0 M7 T& T1 h' p: R2 c key = KeyScan() ; //扫描按键 N7 C% S! Y, k& e+ @( U
switch(key) //根据键值来做出不同的相应
I0 M5 n. N5 t% { {
6 t& W! |3 l5 ?. @0 a- V case 1 ED1=0;break;- O1 q: w7 W7 I# m: ?! X1 V
case 2:.......; D1 y6 v: h. r
.....
7 A1 p6 v, r! s .......2 D; r9 M( s" J7 I7 y; E6 w
}
+ @. c/ r3 E& O9 ` s) p6 x }
% @0 K$ ^3 ^6 t}
. s1 w! Z+ J% c* w5 }+ _0 A$ Z9 P ~
main.h
; | X6 ^+ N `7 X0 P+ `2 ?#ifndef _MAIN_H
1 ]3 j! R: k) R; o& W( q#define _MAIN_H
( G6 ^/ i! {$ u7 R" N% a j
# w: n4 l0 j: Z+ }$ U#include "DSP2833x_Device.h" // HeadeRFile Include File
9 l1 M" | B4 \" f1 l! V/ W1 A#include "DSP2833x_Examples.h" // Examples Include File4 \- ^7 U* o2 n1 u( P% B7 z
! n; e7 A/ g1 m1 D( _7 O6 M
#include "flash_ram.h"
5 \4 j# n( ~0 f Q#include "led.h". h/ X) s8 p/ D- |$ g( g
#include "key.h"+ L. U2 G3 {) n Z
#include "extint.h"0 p3 f; B/ M2 _& \- ~6 e3 E8 z
#include "timer.h", L; |* O/ k0 i$ i
#include "sci.h"
: Z1 R! X$ D- }- B8 f3 [#include "pwm.h"
* z& U5 W2 [) I/ L) X#include "cap.h"
3 U! g) G( J$ x#include "ad.h"! Y) f$ }/ f/ C' Y7 F
#include "can.h"
/ u7 W! D3 m$ k$ p#include "spi.h"
5 N: j! M% K& T' W
/ e4 x$ Q9 J* f- T1 n: o& F#include "NRF2401.h") s% T' x; M8 B* ?" P/ ]
+ Y9 A3 `4 ~% y+ o1 V) z+ _4 j#endif5 Q1 n5 M, K0 E. n
|
|