|
您好。使用GPIO中断时,中断能进入ISR,但是不能区分具体的GPIO端口。程序如下:
( v' ^2 j3 J- i% F, _#define AD7606_PAR_BUSY_GPIO_BANK 5 T& @9 r( a2 b0 Y$ d
#define AD7606_PAR_BUSY_GPIO_BANK_INT SYS_INT_GPIO_B5INT% |. ?5 A5 }4 R' k0 g% P
7 y+ f3 n" m0 Q8 J( ~#define AD7606_PAR_BUSY_V1 GPIO_TO_PIN(5, 11) //BANK5的中断口5.11" d1 k# D/ S& z4 \1 O, B% \6 p
#define AD7606_PAR_BUSY_V2 GPIO_TO_PIN(5, 9) //BANK5的中断口5.93 p) A1 }' |- z8 y" b+ X
#define AD7606_PAR_BUSY_C GPIO_TO_PIN(5, 5) //BANK5的中断口5.5/ F9 i- S! W$ m2 P$ h
#define AD7606_PAR_BUSY GPIO_TO_PIN(5, 4)% W2 b( n, \" j9 S0 `& y
/ ^+ \, \ d) v8 p1 R( K5 U5 A: j
#define AD7606_PAR_CONVST GPIO_TO_PIN(5, 1)# P# y1 z" v6 |- G6 l1 w
#define AD7606_PAR_RD GPIO_TO_PIN(5, 2)
" V3 S& ]7 Y9 d) [; e( w#define AD7606_PAR_RESET GPIO_TO_PIN(5, 0)
5 J/ r6 o- [/ D. }0 M. ]: Y h; y9 Y" U
+ u, V+ Z. I3 J$ z
# b4 I, q5 s" {6 r4 f* q
static void ad7606_irq_setup(ad7606 *ad) {" l* ]) ~( _3 B/ I# u! t4 _
Hwi_Params hwiParams;3 Q9 t6 M0 M Z9 |
Hwi_Handle myHwi;
6 d5 g' k, K+ ^# u( a, U+ ^ Error_Block eb;
1 K+ ?1 h4 @7 r9 b% X# K! \3 K$ }* J% v, G t$ W2 L
Error_init(&eb);! H! [: ]" p0 f
Hwi_Params_init(&hwiParams);
- i) H7 V: n( ~2 b hwiParams.arg = (unsigned int)ad;
2 b% d! U* w) d- s hwiParams.enableInt = FALSE;8 g& \4 T/ p! p8 H6 P9 e& X- \: k+ `
hwiParams.eventId = SYS_INT_GPIO_B5INT;
" D) T0 i) i3 W0 b* Q8 n4 v. a. y hwiParams.priority = 4;
8 F# i J e2 r4 C& ^; S( F# P( g myHwi = Hwi_create(8, ad7606_busy_hwi, &hwiParams, &eb); //注册BANK5中断处理函数1 _3 o& E! j; Z; h2 x! \- ]; ?
if (myHwi == NULL) 1 q* P9 K" ~. Y, ] }* x6 n
LOG_FATAL("failed to create hwi");3 s3 i5 o6 w7 e- L D
7 |0 Y. `' \- J, r" S; \1 ]# y /* enable both interrupts */+ O- w% D+ b5 a s
Hwi_enableInterrupt(ad->irq_event);. i3 X4 M! p* x* ]" Q7 e# U( U
}; c, X4 T( n! G& Y9 M+ q
! O8 d2 N9 x, N" R1 l6 P
& v; x5 l; {0 ~3 A! \7 j: U0 u6 tstatic void ad7606_gpio_pinmux_setup(ad7606 *ad) {
}! ?2 H) o5 {( i5 H3 y; A4 R volatile unsigned int savePinMux = 0;
5 Z7 q. W# l5 `+ ~, S7 e //初始化5.11、5.9 、 5.5为GPIO口
. a4 G% g7 x, C; L0 \0 U savePinMux = HWREG(SOC_SYSCFG_0_REGS + SYSCFG0_PINMUX(11)) & (~(SYSCFG_PINMUX11_PINMUX11_27_24 | SYSCFG_PINMUX11_PINMUX11_19_16));5 c' {7 |3 e0 Q5 _# ?8 Z* Q# ~# ^
7 C3 w6 D" s: y0 K/ Z. Y HWREG(SOC_SYSCFG_0_REGS + SYSCFG0_PINMUX(11)) = (PINMUX11_BUSY_V1_ENABLE | PINMUX11_BUSY_V2_ENABLE | savePinMux);& f9 L0 E, w4 V# J3 W
3 m+ ]# `; A# m K: j" g 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));" f3 e- T9 w& K: I; g x
- p+ _7 h5 X. V. F" V HWREG(SOC_SYSCFG_0_REGS + SYSCFG0_PINMUX(12)) = (PINMUX12_RESET_ENABLE | PINMUX12_CONVST_ENABLE | PINMUX12_RD_ENABLE | PINMUX12_BUSY_C_ENABLE | savePinMux);2 p2 G8 w( u3 ]7 c+ S i
- X4 `- ^) u+ }2 z- p0 Q/ T}, _! d0 B- `( g+ Z0 G
; p$ z. |, \( s$ q4 i6 S
7 u% o# f: R3 d* `* t1 B
static void ad7606_gpio_setup(ad7606 *ad) {
: u6 S3 C8 W+ \6 E* \- z$ w& a# y% } /*Set the AD7606_PAR_BUSY to the input mode*/9 X9 S" z2 t! T- R4 {
//初始化5.11、5.9 、 5.5为中断口 e2 Y' c& B$ w: P6 o; X
GPIODirModeSet(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_V1, GPIO_DIR_INPUT);
7 i! ~) [; P+ P& z; [% \9 S1 ^ GPIODirModeSet(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_V2, GPIO_DIR_INPUT);/ w% F/ h8 F- |* e! a6 {& J
GPIODirModeSet(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_C, GPIO_DIR_INPUT);
# D1 n) C$ ^7 J4 v //GPIODirModeSet(SOC_GPIO_0_REGS, AD7606_PAR_BUSY, GPIO_DIR_INPUT);
( D+ s6 U- q- Q4 O /*Set the AD7606_PAR_BUSY to the Falling Edge Interrupt*/; ?5 ]9 [- N3 \
GPIOIntTypeSet(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_V1, GPIO_INT_TYPE_FALLEDGE);0 i% f# H1 k* q* T5 V
GPIOIntTypeSet(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_V2, GPIO_INT_TYPE_FALLEDGE);
, s# i6 a$ D* P# V+ v6 B GPIOIntTypeSet(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_C, GPIO_INT_TYPE_FALLEDGE);/ ?7 ?* F, d7 t* ^0 d
//GPIOIntTypeSet(SOC_GPIO_0_REGS, AD7606_PAR_BUSY, GPIO_INT_TYPE_FALLEDGE);' w1 _+ Q6 u( V2 Y
/*The interrupt setting allows AD7606_PAR_BUSY_GPIO_BANK*/
8 w8 N1 t7 N ?% p0 ]" X GPIOBankIntEnable(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_GPIO_BANK);
) W7 |7 R$ T8 j0 ]$ a" j1 R+ E
; D% @; \; R, Q& ] [7 D GPIODirModeSet(SOC_GPIO_0_REGS, AD7606_PAR_RESET, GPIO_DIR_OUTPUT);
: A7 W4 H1 }: ]5 u GPIOPinWrite(SOC_GPIO_0_REGS, AD7606_PAR_RESET, GPIO_PIN_HIGH);
: `5 v5 \) b: n/ E7 g/ i6 A Task_sleep(1000);. j/ \3 x! ~# Z
GPIOPinWrite(SOC_GPIO_0_REGS, AD7606_PAR_RESET, GPIO_PIN_LOW);
9 p# x" X0 p$ @. e' \2 B4 H Task_sleep(1000);
7 t" E" l4 v/ H3 E3 {7 Q Q' L* N! N$ \; J1 `
/*Set the AD7606_PAR_CONVST to output mode*/$ V" o) i) w$ h- w
GPIODirModeSet(SOC_GPIO_0_REGS, AD7606_PAR_CONVST, GPIO_DIR_OUTPUT);5 N, y" l" @7 h) B
GPIOPinWrite(SOC_GPIO_0_REGS, AD7606_PAR_CONVST, GPIO_PIN_LOW);
: @6 c" j! M# A% z% b7 ]
$ b b/ G- s) g7 B3 n1 ~5 @ GPIODirModeSet(SOC_GPIO_0_REGS, AD7606_PAR_RD, GPIO_DIR_OUTPUT);
# K* ]- G% W. j GPIOPinWrite(SOC_GPIO_0_REGS, AD7606_PAR_RD, GPIO_PIN_HIGH);
2 R" N2 v* X) q7 u( ^8 C2 h/ M) d( [, f U
}
! F8 A( A8 _# b1 Y' P6 }
" b8 \7 C4 T6 N) S* t9 K4 n! ]1 _/ q& F7 W- r$ F" v/ s/ H
static void ad7606_busy_hwi(UArg ad_addr) {& L4 R# H( D# g
$ s( Q+ Q" q# ~9 [
$ ]( y6 m) X8 v /* Disable the interrupts for pins of bank AD7606_PAR_BUSY in GPIO.*/4 S/ r6 i; W V U1 I: Y9 M( ~/ R8 C
GPIOBankIntDisable(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_GPIO_BANK); //用仿真器debug,发现程序能进入这里。
# o7 e2 i$ S- F L! ~( w7 g! l
4 w, P- T5 ~7 z Q if(GPIOPinIntStatus(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_V1) == GPIO_INT_PEND)0 f# Q8 }! T3 m; _* ]! x7 N2 a
{9 h Q4 g6 K$ B! x8 K r; {
GPIOPinIntClear(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_V1); //问题是:用仿真器debug,发现程序不能进入这里。
; ]' B6 w, f h, t7 J' ?9 \3 K5 J cs_addr = SOC_EMIFA_CS5_ADDR ;! Z8 W' B# X( T* Z
internal = 0 ;8 ^# Z( q# r0 g+ }& y! [5 h
int_flag[0] = 1 ;
7 ^2 F) B1 B3 w" \5 G }) a! Q6 B" ]3 B e, H# @2 k7 \& o" c
if(GPIOPinIntStatus(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_V2) == GPIO_INT_PEND)
b) w; `% w G& o9 ~# M+ H {8 w1 r' F; p: h, [, w
GPIOPinIntClear(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_V2); //问题是:用仿真器debug,发现程序不能进入这里。1 m# P6 y; A3 N
cs_addr = SOC_EMIFA_CS4_ADDR ;9 ?( k' X+ h' S5 R" t3 J
internal = 6 ; \) M @$ X' I6 C9 z U
int_flag[1] = 1 ;
# n2 n5 y: ~3 b2 B( {) i+ T }
& Q4 S& {# e2 w# r) k/ V& X; r if(GPIOPinIntStatus(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_C) == GPIO_INT_PEND)/ l. z" n& x/ |0 G+ s# _$ k
{+ c" R9 ~4 ?( D; C0 Y3 M( q
GPIOPinIntClear(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_C); //问题是:用仿真器debug,发现程序不能进入这里。2 d$ g3 [. d; z3 M( M; Y3 Y1 X
cs_addr = SOC_EMIFA_CS2_ADDR ;
7 S- U L6 S7 W" q internal = 12 ;( E. t7 O! q2 V+ z
int_flag[2] = 1 ;) G. ]0 L: C/ F; K+ f, ?5 q9 F
}& |# i( |8 Y t7 x, x+ G
7 V# ]# s5 f- o# K1 j GPIOPinWrite(SOC_GPIO_0_REGS, AD7606_PAR_CONVST, GPIO_PIN_LOW);
) C0 K: U3 _, b- s # |5 {7 T4 `6 M7 B
GPIOBankIntEnable(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_GPIO_BANK);$ ^8 \. Y, H' g, y5 h9 l- G- r2 L
}/ W9 m: e& F; d5 z3 A6 J) H
0 }' w0 w7 a5 [0 c& y
|
|