|
|
您好。使用GPIO中断时,中断能进入ISR,但是不能区分具体的GPIO端口。程序如下:
4 _9 m; M0 K+ ^3 ]+ o3 Q; L+ Z7 U. y#define AD7606_PAR_BUSY_GPIO_BANK 5
. k+ F* Z, S+ K% i; x7 P#define AD7606_PAR_BUSY_GPIO_BANK_INT SYS_INT_GPIO_B5INT$ d) D! ^; r7 J& u
7 ?/ `- N$ f1 o2 }$ \#define AD7606_PAR_BUSY_V1 GPIO_TO_PIN(5, 11) //BANK5的中断口5.11* q6 R& |( q" A( _( A
#define AD7606_PAR_BUSY_V2 GPIO_TO_PIN(5, 9) //BANK5的中断口5.9
& J2 w6 u) r. O% v#define AD7606_PAR_BUSY_C GPIO_TO_PIN(5, 5) //BANK5的中断口5.5
/ G' L. s. v+ `9 n& n#define AD7606_PAR_BUSY GPIO_TO_PIN(5, 4)
m4 J G2 D0 T. O3 i" b1 b
- [: Y0 r+ S$ V% k. b* Y#define AD7606_PAR_CONVST GPIO_TO_PIN(5, 1)
& |5 `* t# G& q#define AD7606_PAR_RD GPIO_TO_PIN(5, 2)+ ~. K' X! r, F: G! Z8 O
#define AD7606_PAR_RESET GPIO_TO_PIN(5, 0)
# G3 { {1 _1 X/ ?0 V# ^' l
6 l1 j! B8 M* \0 z! Q' _' h6 [9 e
7 K$ p" g7 o. |4 A9 \; z+ gstatic void ad7606_irq_setup(ad7606 *ad) {
$ J" O7 e# R( d* Z% L+ [, \ Hwi_Params hwiParams;" r% V; b5 c8 U. f7 \9 [3 U) ]
Hwi_Handle myHwi;& T5 ~" w' D9 r
Error_Block eb;
" {1 Y/ g7 P! y+ t5 m: B( w
/ d5 ^4 z$ J, X- P- A9 _% u; D; c Error_init(&eb);/ q# s6 K% A5 d* x
Hwi_Params_init(&hwiParams);
8 B7 w5 R! | q/ A% A! | hwiParams.arg = (unsigned int)ad;$ n) ]5 F- R- |; j
hwiParams.enableInt = FALSE;
# U5 m0 D1 [* E1 W7 C; T f1 g hwiParams.eventId = SYS_INT_GPIO_B5INT;
6 d3 Z1 }* L/ R' P$ X I5 f8 X2 h hwiParams.priority = 4;/ A5 y6 d6 q+ t6 {" O& Y
myHwi = Hwi_create(8, ad7606_busy_hwi, &hwiParams, &eb); //注册BANK5中断处理函数4 H$ s5 K; l2 s1 Y- V' u
if (myHwi == NULL)
4 i; r4 a$ V9 R( _5 T LOG_FATAL("failed to create hwi");
) R. ^- B, H+ z/ R# W( i
7 }: V8 A+ g: ^1 j. K2 _ /* enable both interrupts */
: k& c3 c- u# k7 b5 @, Z9 W Hwi_enableInterrupt(ad->irq_event);- ^- X6 h. y( {4 a( T7 Z3 c
}
1 @1 T) _# F7 X( ^ Y: n1 l8 X" \( L4 R
' N# [* B- d# i! w9 G/ g$ Ustatic void ad7606_gpio_pinmux_setup(ad7606 *ad) { c* W, O2 [( T/ `" ]5 T! q2 _
volatile unsigned int savePinMux = 0;
8 n. o& [0 _5 S/ F8 W- L0 K //初始化5.11、5.9 、 5.5为GPIO口2 z1 [2 F0 }, R9 ]. Q9 P% y: C: R: ~
savePinMux = HWREG(SOC_SYSCFG_0_REGS + SYSCFG0_PINMUX(11)) & (~(SYSCFG_PINMUX11_PINMUX11_27_24 | SYSCFG_PINMUX11_PINMUX11_19_16));
) c. ]+ W c7 O& j2 E& @. k' P
9 W" s o X0 D& P! N9 J HWREG(SOC_SYSCFG_0_REGS + SYSCFG0_PINMUX(11)) = (PINMUX11_BUSY_V1_ENABLE | PINMUX11_BUSY_V2_ENABLE | savePinMux);( t- a' t r2 L! r5 o
; B! r# f* J! }# V) Y
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));8 H- X! j# R- `0 D7 z4 A
/ F( v+ }5 p/ \$ Y# x; [
HWREG(SOC_SYSCFG_0_REGS + SYSCFG0_PINMUX(12)) = (PINMUX12_RESET_ENABLE | PINMUX12_CONVST_ENABLE | PINMUX12_RD_ENABLE | PINMUX12_BUSY_C_ENABLE | savePinMux);, r- g J( F' h0 P1 ^. D2 d: I
. P7 `3 S% d; h7 w% @3 p; |: t
}* w* v7 F/ ^9 t0 B* Y+ B3 D$ j3 F1 @0 U. c
& N0 [4 C' K( R
$ A$ I( {, H" e' I+ X- B
static void ad7606_gpio_setup(ad7606 *ad) {( S8 I5 k& y8 v1 `. x9 x1 \
/*Set the AD7606_PAR_BUSY to the input mode*/
9 F2 e% R# L- x0 k7 p //初始化5.11、5.9 、 5.5为中断口! n9 r/ l0 d3 M# i3 d2 _! ^
GPIODirModeSet(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_V1, GPIO_DIR_INPUT);
6 G, e+ O4 d7 a5 m, M. p GPIODirModeSet(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_V2, GPIO_DIR_INPUT);( |/ z6 \% x" |7 k+ Z
GPIODirModeSet(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_C, GPIO_DIR_INPUT);
9 _) ]: U; P6 p% d //GPIODirModeSet(SOC_GPIO_0_REGS, AD7606_PAR_BUSY, GPIO_DIR_INPUT);
: F0 `+ w8 T7 B5 A& x4 D3 i /*Set the AD7606_PAR_BUSY to the Falling Edge Interrupt*/8 s1 b- c8 G, c) J- d$ m1 l
GPIOIntTypeSet(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_V1, GPIO_INT_TYPE_FALLEDGE);
) D+ M0 Y4 D I+ m+ _ GPIOIntTypeSet(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_V2, GPIO_INT_TYPE_FALLEDGE);' K2 z9 G& s$ l
GPIOIntTypeSet(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_C, GPIO_INT_TYPE_FALLEDGE);
0 {6 V3 o$ q! r) l4 [2 U0 @ //GPIOIntTypeSet(SOC_GPIO_0_REGS, AD7606_PAR_BUSY, GPIO_INT_TYPE_FALLEDGE);
9 R3 J- P% m$ J6 b7 r, y /*The interrupt setting allows AD7606_PAR_BUSY_GPIO_BANK*/
$ k8 y# E: p4 [* k$ v( l GPIOBankIntEnable(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_GPIO_BANK);
; Y3 q, J+ U3 N. ~* \
# p7 F; |0 z4 |& M4 v* { GPIODirModeSet(SOC_GPIO_0_REGS, AD7606_PAR_RESET, GPIO_DIR_OUTPUT);
3 q% O; ~% t6 ?/ b y GPIOPinWrite(SOC_GPIO_0_REGS, AD7606_PAR_RESET, GPIO_PIN_HIGH);
) t, z' G& C7 i/ Z/ [2 d" D Task_sleep(1000);
7 l+ G7 Z0 o% b. w GPIOPinWrite(SOC_GPIO_0_REGS, AD7606_PAR_RESET, GPIO_PIN_LOW);
* X i. m& Z6 q: q6 {' B0 P Task_sleep(1000);1 e& B/ e& Z3 Y+ X
3 v8 s/ L( R. }+ d J$ | /*Set the AD7606_PAR_CONVST to output mode*// R3 L m' P; E$ M: w1 @8 ?
GPIODirModeSet(SOC_GPIO_0_REGS, AD7606_PAR_CONVST, GPIO_DIR_OUTPUT);
q8 E" @2 m5 ?6 l. U$ J GPIOPinWrite(SOC_GPIO_0_REGS, AD7606_PAR_CONVST, GPIO_PIN_LOW);- T4 e. Q7 E$ z
4 D; Z: Z! ^) E GPIODirModeSet(SOC_GPIO_0_REGS, AD7606_PAR_RD, GPIO_DIR_OUTPUT);
2 S' _7 s$ O) ?) W9 W4 X4 b1 \ GPIOPinWrite(SOC_GPIO_0_REGS, AD7606_PAR_RD, GPIO_PIN_HIGH);, S$ B6 w' a8 Y# T% W1 U
. a- e5 S& i# [' h
}
X1 ~9 y0 I \; m! L8 o; f- U( @
/ S v& d5 R- X
static void ad7606_busy_hwi(UArg ad_addr) {+ x) Z( y0 t8 K, v
/ o$ _- P* o3 y: Z5 Y) \7 z" ?. s0 b# T2 b5 u: g
/* Disable the interrupts for pins of bank AD7606_PAR_BUSY in GPIO.*/
# b# B( \' Q- D, M GPIOBankIntDisable(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_GPIO_BANK); //用仿真器debug,发现程序能进入这里。0 i# c8 Z5 T1 Z
7 k0 |% R* e$ D2 }+ X" ?; [% ] if(GPIOPinIntStatus(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_V1) == GPIO_INT_PEND)
% [$ b/ _% U7 D9 _ {
, N( C4 h, ~- b/ U& t7 H n% e GPIOPinIntClear(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_V1); //问题是:用仿真器debug,发现程序不能进入这里。
4 e6 \9 v3 k h) Q2 m! `$ k6 ` cs_addr = SOC_EMIFA_CS5_ADDR ;7 Q1 H7 z/ C2 x7 d/ E- o
internal = 0 ;* [. i/ A! H3 A+ j( d
int_flag[0] = 1 ;% s0 K" M3 ]' G
}
9 p, d% I' `8 H/ }1 g: z1 |4 z if(GPIOPinIntStatus(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_V2) == GPIO_INT_PEND)$ w/ W% {$ F4 j- u& Q
{
) ~4 o: C1 {0 G% d) ? GPIOPinIntClear(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_V2); //问题是:用仿真器debug,发现程序不能进入这里。
# ?) _7 M9 l/ }) P# e$ W cs_addr = SOC_EMIFA_CS4_ADDR ;/ D' `7 c0 A) q- [$ T6 c, x# R
internal = 6 ;
. @# s, ]) ?: O- q' O7 l int_flag[1] = 1 ;4 H" D8 v! p# I7 x
}
' ~, ^. D" |2 _: P2 x, D if(GPIOPinIntStatus(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_C) == GPIO_INT_PEND)
; |. U8 n& _9 ?) a1 G; J { f2 `: x0 Z2 B9 Z5 J! h
GPIOPinIntClear(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_C); //问题是:用仿真器debug,发现程序不能进入这里。
! q" F/ W& F" r+ q cs_addr = SOC_EMIFA_CS2_ADDR ;
- M6 o# ]3 W. f/ I! p- m# c" j internal = 12 ;
: ]9 |6 Y0 T8 J1 E7 [ int_flag[2] = 1 ;! d. ?5 z* b: t6 S9 @0 |
}
& j8 v! O& a9 J- w0 n/ D" y 8 Q( y k% q. c! B+ f0 V% q+ R
GPIOPinWrite(SOC_GPIO_0_REGS, AD7606_PAR_CONVST, GPIO_PIN_LOW);
" ?. l! `% C" R6 L, b
2 d+ B1 [1 o1 i& x/ S9 P GPIOBankIntEnable(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_GPIO_BANK);) E% R$ S4 g3 X1 N# q/ n
}' {- G0 B {* U+ u; _5 C; N
+ @: ?$ E' d0 s+ [8 ?
|
|