|
|
您好。使用GPIO中断时,中断能进入ISR,但是不能区分具体的GPIO端口。程序如下:7 ^1 b( L0 n% F
#define AD7606_PAR_BUSY_GPIO_BANK 5/ s+ M. }! ~1 c
#define AD7606_PAR_BUSY_GPIO_BANK_INT SYS_INT_GPIO_B5INT' L9 V0 \" D: c
8 C' B! w2 `4 U4 B u#define AD7606_PAR_BUSY_V1 GPIO_TO_PIN(5, 11) //BANK5的中断口5.11# X; W' E% G& i! u4 l. l
#define AD7606_PAR_BUSY_V2 GPIO_TO_PIN(5, 9) //BANK5的中断口5.9
! r8 ]- t3 Q9 l7 r& F#define AD7606_PAR_BUSY_C GPIO_TO_PIN(5, 5) //BANK5的中断口5.5
2 |* u0 \! h9 P1 ?#define AD7606_PAR_BUSY GPIO_TO_PIN(5, 4)
$ v0 v. }- w- ], k" U. o
+ Z* V/ J* P3 W! G# e; |! G( g' R#define AD7606_PAR_CONVST GPIO_TO_PIN(5, 1)
" T2 g0 F3 R7 B, P4 N#define AD7606_PAR_RD GPIO_TO_PIN(5, 2)4 b- o" ]+ B3 I" {" n
#define AD7606_PAR_RESET GPIO_TO_PIN(5, 0)0 u# o# t) r* y" A& m. D' z
! F, K4 y8 Y1 e! i
$ u0 y, k3 b$ c; ~
. ^3 k2 }% Q) N' E! I
static void ad7606_irq_setup(ad7606 *ad) {' N# p+ O0 w9 |' t
Hwi_Params hwiParams;" R7 c) c- ]* @/ t. O* o+ A( |. @/ S
Hwi_Handle myHwi;+ n$ P" P! e h% t: j
Error_Block eb;
) w; I. [4 o5 Y5 d. _0 D' |3 y- P6 X
Error_init(&eb);
: F5 |% w0 M4 i M Hwi_Params_init(&hwiParams);" {3 B* c) q% ~, T, f% d6 P/ P% w
hwiParams.arg = (unsigned int)ad;9 ~5 S$ |8 ]$ y/ f/ [' b) C
hwiParams.enableInt = FALSE;8 D5 o+ ^$ b! h* i* [+ P! a' C3 C
hwiParams.eventId = SYS_INT_GPIO_B5INT;
/ I) X+ O# i. W0 T hwiParams.priority = 4;
2 g+ M! t* b3 Z/ g/ L) M/ m0 P myHwi = Hwi_create(8, ad7606_busy_hwi, &hwiParams, &eb); //注册BANK5中断处理函数/ I7 H _& _/ {1 H6 q
if (myHwi == NULL) ; ^, X; O5 ^( k( D( Q* t
LOG_FATAL("failed to create hwi");
! G4 w2 b3 A. S W
" o( \, X- s- u4 \* _ p P /* enable both interrupts */
' F( m3 s, k2 e( t8 @/ ^/ h0 X Hwi_enableInterrupt(ad->irq_event);
! ?, |2 D: Q$ o' U* x0 ?5 v: P}
- W1 J. s3 P6 D A* M
. M$ a: o/ v; n* s; _& A8 \4 F4 d
. z7 C. c! C0 a: Z8 Lstatic void ad7606_gpio_pinmux_setup(ad7606 *ad) {
/ Z2 ]; w1 x4 o! I volatile unsigned int savePinMux = 0;
/ p6 j& O B }1 n w //初始化5.11、5.9 、 5.5为GPIO口
. G0 c$ M5 ?' T. p% v9 Q# A5 x savePinMux = HWREG(SOC_SYSCFG_0_REGS + SYSCFG0_PINMUX(11)) & (~(SYSCFG_PINMUX11_PINMUX11_27_24 | SYSCFG_PINMUX11_PINMUX11_19_16));4 _9 n7 B0 k: s) X" R( Q
/ l N" L! q/ S u1 n z8 [. ^- ^
HWREG(SOC_SYSCFG_0_REGS + SYSCFG0_PINMUX(11)) = (PINMUX11_BUSY_V1_ENABLE | PINMUX11_BUSY_V2_ENABLE | savePinMux);
1 }9 U6 l8 y1 w1 f0 @/ K3 u- Q1 l, ~ J
' f/ D( p+ V! N" {) S5 u savePinMux = HWREG(SOC_SYSCFG_0_REGS + SYSCFG0_PINMUX(12)) & (~(SYSCFG_PINMUX12_PINMUX12_31_28 | SYSCFG_PINMUX12_PINMUX12_27_24 | SYSCFG_PINMUX12_PINMUX12_23_20 | SYSCFG_PINMUX12_PINMUX12_11_8));
- s; ^! \6 Q8 a( y" n- r" A4 b" V( \$ I) S3 u
HWREG(SOC_SYSCFG_0_REGS + SYSCFG0_PINMUX(12)) = (PINMUX12_RESET_ENABLE | PINMUX12_CONVST_ENABLE | PINMUX12_RD_ENABLE | PINMUX12_BUSY_C_ENABLE | savePinMux);
7 v$ k! Y- F' a7 W
- U) Z8 B9 {7 H, u3 I}( o) D! d0 o; j+ I; w$ y
; E1 b) h/ n# g% C) H/ w1 I' v% I& Y
static void ad7606_gpio_setup(ad7606 *ad) {$ l+ J. o1 X, E
/*Set the AD7606_PAR_BUSY to the input mode*/( G" P& _4 q% _) F
//初始化5.11、5.9 、 5.5为中断口. w1 u& c5 T5 O0 b+ P, m0 O* P
GPIODirModeSet(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_V1, GPIO_DIR_INPUT);1 u; D: F W. D9 p" e$ |
GPIODirModeSet(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_V2, GPIO_DIR_INPUT);
% ^4 ?) \ H# v3 ?2 {7 L GPIODirModeSet(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_C, GPIO_DIR_INPUT);9 i( e+ t6 l# Z8 q
//GPIODirModeSet(SOC_GPIO_0_REGS, AD7606_PAR_BUSY, GPIO_DIR_INPUT);$ K. ]: U! t3 C$ U R7 J) X
/*Set the AD7606_PAR_BUSY to the Falling Edge Interrupt*/4 m* w) L4 e8 m1 Y
GPIOIntTypeSet(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_V1, GPIO_INT_TYPE_FALLEDGE);
, @ I( ?8 C0 E8 T0 S GPIOIntTypeSet(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_V2, GPIO_INT_TYPE_FALLEDGE);- @7 T- k7 x) v2 \ d( ~ i) G) ?
GPIOIntTypeSet(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_C, GPIO_INT_TYPE_FALLEDGE);
7 l: `1 A5 L3 o7 o" p% k0 h1 f //GPIOIntTypeSet(SOC_GPIO_0_REGS, AD7606_PAR_BUSY, GPIO_INT_TYPE_FALLEDGE);) Z6 M; |3 E- R8 ]! Y4 `- F
/*The interrupt setting allows AD7606_PAR_BUSY_GPIO_BANK*/
, ^/ G! a5 J: F* i+ ]+ {+ E GPIOBankIntEnable(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_GPIO_BANK);' U+ D H% s2 x. X# I2 b
# H7 z! H: ]$ g/ W GPIODirModeSet(SOC_GPIO_0_REGS, AD7606_PAR_RESET, GPIO_DIR_OUTPUT);+ ~7 s$ E8 l9 [ `3 g
GPIOPinWrite(SOC_GPIO_0_REGS, AD7606_PAR_RESET, GPIO_PIN_HIGH);2 F S1 H0 ]% _- {8 n" \4 ^
Task_sleep(1000);
2 X5 M# Q4 O, z1 E6 ?* C GPIOPinWrite(SOC_GPIO_0_REGS, AD7606_PAR_RESET, GPIO_PIN_LOW);; \6 x* W2 H }
Task_sleep(1000);7 x* y' u X3 f7 o
" J* ~8 r8 m# B0 J* ^" B( {& }
/*Set the AD7606_PAR_CONVST to output mode*/
& A% ~) X# g% c, p/ K+ O: R GPIODirModeSet(SOC_GPIO_0_REGS, AD7606_PAR_CONVST, GPIO_DIR_OUTPUT);- F1 j& H# y$ T$ \. d
GPIOPinWrite(SOC_GPIO_0_REGS, AD7606_PAR_CONVST, GPIO_PIN_LOW);
+ r' R' g0 j( W' A* F! u7 e( \
% u, a# K1 b( \) g( ^( L- Q" }$ z GPIODirModeSet(SOC_GPIO_0_REGS, AD7606_PAR_RD, GPIO_DIR_OUTPUT);
7 O0 y) F* g5 d- A3 T5 o* T) }4 K GPIOPinWrite(SOC_GPIO_0_REGS, AD7606_PAR_RD, GPIO_PIN_HIGH);7 Y/ F/ _. s: ] a0 g) Q
q- d! V, y, H
}
. x5 q) {1 W( t Q8 x- u3 Z% d* M1 F0 [1 b; t0 W
& ^. d" s' m7 y% B8 ]. X! A
static void ad7606_busy_hwi(UArg ad_addr) {
! u1 ^ m7 L% ^) {7 A: J3 B% X; [- @6 Q3 s6 O( j
6 a& w; o, _. a
/* Disable the interrupts for pins of bank AD7606_PAR_BUSY in GPIO.*/) m" ?2 m9 v9 z: o4 S
GPIOBankIntDisable(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_GPIO_BANK); //用仿真器debug,发现程序能进入这里。9 f) A. k' B( s
1 Q' O* Q/ c( l. x if(GPIOPinIntStatus(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_V1) == GPIO_INT_PEND)
6 f+ k# H* }1 U( ~+ K! F {. G4 J R a- D0 g2 I
GPIOPinIntClear(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_V1); //问题是:用仿真器debug,发现程序不能进入这里。
& D* s* K3 O8 R9 ~' G3 {" f cs_addr = SOC_EMIFA_CS5_ADDR ;
- Z$ s$ A/ l Q0 h A! a internal = 0 ;
) H( D/ P% U5 i" f: Y, l/ R int_flag[0] = 1 ;
' d) h4 Z }& i( Q$ ^ } ?! z' M$ ~1 y, z8 U
if(GPIOPinIntStatus(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_V2) == GPIO_INT_PEND); m) K$ F6 H& q) `* } M$ \( I
{1 D/ Z" l; g% ]& U6 x; j1 {! u
GPIOPinIntClear(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_V2); //问题是:用仿真器debug,发现程序不能进入这里。
, d1 n- a" C, g+ S- M4 O1 t- g3 m H) F cs_addr = SOC_EMIFA_CS4_ADDR ;. B( g! R' f! h( {* c( k! L& W$ U
internal = 6 ;
- ~; J1 z. w( ]. a( W int_flag[1] = 1 ;
@! o( k. @8 q }1 h1 T& s1 }2 C' d9 J) `
if(GPIOPinIntStatus(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_C) == GPIO_INT_PEND)& l( n, }/ j( F4 }& N* ]: i& i
{9 ~1 a/ ]2 H! ~7 p( _$ Y8 V8 O
GPIOPinIntClear(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_C); //问题是:用仿真器debug,发现程序不能进入这里。1 B; d/ X5 }+ N" |& a, i
cs_addr = SOC_EMIFA_CS2_ADDR ;3 a! P3 {2 I0 \
internal = 12 ;
0 d0 w& ]: b9 x+ F int_flag[2] = 1 ;
. Q+ d/ W' w7 C% Y: P3 O }
5 r# F0 O' e% U5 d! @ Z
- m2 w' Q, w6 y3 B GPIOPinWrite(SOC_GPIO_0_REGS, AD7606_PAR_CONVST, GPIO_PIN_LOW);% K7 |7 V& }2 M4 c! g: S
3 {* f c& C/ K) P+ j! V
GPIOBankIntEnable(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_GPIO_BANK);* [: z" G9 c- q9 {4 t4 ]! @
}( H1 \+ [& V4 @8 I4 L
9 |6 q1 X# @% K9 d8 O& s; |' s5 } |
|