|
您好。使用GPIO中断时,中断能进入ISR,但是不能区分具体的GPIO端口。程序如下:4 B! W3 i# \% Y
#define AD7606_PAR_BUSY_GPIO_BANK 5$ j: ~9 a% g6 f5 G9 G& J3 a
#define AD7606_PAR_BUSY_GPIO_BANK_INT SYS_INT_GPIO_B5INT. C3 A( L$ G5 T( o4 u5 _, E
( M5 r+ B/ G$ T9 d5 B: d
#define AD7606_PAR_BUSY_V1 GPIO_TO_PIN(5, 11) //BANK5的中断口5.11; i( Q* p$ {2 Y/ _
#define AD7606_PAR_BUSY_V2 GPIO_TO_PIN(5, 9) //BANK5的中断口5.9; C, ~% {( @; n
#define AD7606_PAR_BUSY_C GPIO_TO_PIN(5, 5) //BANK5的中断口5.5
( m# V/ K6 j' Q$ e! ]% z1 s3 C#define AD7606_PAR_BUSY GPIO_TO_PIN(5, 4)! ?! q% K' l) i" B$ @2 A: i
9 }5 I. M( Z! U& T: b9 b: O#define AD7606_PAR_CONVST GPIO_TO_PIN(5, 1)
/ l# H2 ~6 G& {) m5 w) d* @#define AD7606_PAR_RD GPIO_TO_PIN(5, 2)
- u9 i6 y2 q0 j) I% q#define AD7606_PAR_RESET GPIO_TO_PIN(5, 0)
6 k4 A! S, W/ X- o, ?5 Y+ [' O4 ?/ l+ u, L
5 X9 t% P9 \) c9 z: {# L
* V1 q1 Y, P6 |. y$ G6 L3 ystatic void ad7606_irq_setup(ad7606 *ad) {
4 i5 p4 o& x7 Y0 D) y, H Hwi_Params hwiParams;
$ Q& C: K+ U# S7 ] Hwi_Handle myHwi;
, O+ c) n) F g1 Y) [: Y/ Q Error_Block eb;
" H- I$ ~) W! Q" {( k
' g" h# e. ?- f2 o7 I Error_init(&eb);: [" X$ \0 L2 r! s/ {% u: t6 P
Hwi_Params_init(&hwiParams);" K3 c/ o8 d, P9 I) }: N. i
hwiParams.arg = (unsigned int)ad;+ y. }, [! Q8 [( a" {
hwiParams.enableInt = FALSE;
% D( B7 e; L4 L% m3 M( ]4 V hwiParams.eventId = SYS_INT_GPIO_B5INT;: X( u p' o8 z1 C
hwiParams.priority = 4;
) a& W7 M$ |& v! V6 Z7 t+ F myHwi = Hwi_create(8, ad7606_busy_hwi, &hwiParams, &eb); //注册BANK5中断处理函数
4 s4 }, y( I, U( z) e9 f if (myHwi == NULL) ! B' o3 y5 N: N" m6 O
LOG_FATAL("failed to create hwi");
& {' r) f) Z; E) ~( w8 o% C
" ?3 B+ H0 A0 q% H: V0 o /* enable both interrupts */9 M8 p8 g0 a. n! y
Hwi_enableInterrupt(ad->irq_event);
9 z: f @7 w6 _: @3 S6 u' ~}
: _# k7 v; R+ |2 j) f6 o
! g7 Q8 }1 e- W" K: Y5 W5 u/ E: i* H" S$ E5 x3 N
static void ad7606_gpio_pinmux_setup(ad7606 *ad) {
- e( \( ]8 u8 q- k2 M volatile unsigned int savePinMux = 0;1 D+ M) a& r( c% @% s O
//初始化5.11、5.9 、 5.5为GPIO口! ^5 F4 z1 d1 L# y) s
savePinMux = HWREG(SOC_SYSCFG_0_REGS + SYSCFG0_PINMUX(11)) & (~(SYSCFG_PINMUX11_PINMUX11_27_24 | SYSCFG_PINMUX11_PINMUX11_19_16));8 x6 V1 J1 E) Q; i- j9 B
- e7 G( v8 X3 v5 T) X HWREG(SOC_SYSCFG_0_REGS + SYSCFG0_PINMUX(11)) = (PINMUX11_BUSY_V1_ENABLE | PINMUX11_BUSY_V2_ENABLE | savePinMux);
5 W( c4 b3 k4 x' Y' P A9 X8 G/ d e4 c* i
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));5 ]& \# z: A @
/ W; r" \5 ^3 w2 i, ]; a; A" m HWREG(SOC_SYSCFG_0_REGS + SYSCFG0_PINMUX(12)) = (PINMUX12_RESET_ENABLE | PINMUX12_CONVST_ENABLE | PINMUX12_RD_ENABLE | PINMUX12_BUSY_C_ENABLE | savePinMux);
6 Y) g( d. s& ^' M i6 ?1 M
7 y; N( n0 T( k% ^8 s}
/ [% E8 K. d* o# b `1 y
3 e1 B- [- Q+ N/ {6 r" \- F% E) ~8 o0 k6 F7 U% _! V; S+ W$ `
static void ad7606_gpio_setup(ad7606 *ad) {
5 c2 C7 c' c; ~% \8 i6 N0 X /*Set the AD7606_PAR_BUSY to the input mode*/
- |/ t. u9 \" ^( F. }: l //初始化5.11、5.9 、 5.5为中断口# _8 n; K# w2 a3 r
GPIODirModeSet(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_V1, GPIO_DIR_INPUT);" v. ?* Q* x2 o3 ^3 m
GPIODirModeSet(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_V2, GPIO_DIR_INPUT);, b, M: \6 H) z: L- H. W: p
GPIODirModeSet(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_C, GPIO_DIR_INPUT);
t2 n: H5 U1 c$ m. G+ Q# V //GPIODirModeSet(SOC_GPIO_0_REGS, AD7606_PAR_BUSY, GPIO_DIR_INPUT);
: q5 ~8 c; j+ |: A5 ]" o' P /*Set the AD7606_PAR_BUSY to the Falling Edge Interrupt*/
8 w5 S/ j2 `4 k% l3 e GPIOIntTypeSet(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_V1, GPIO_INT_TYPE_FALLEDGE);
* }5 n; D7 L3 R8 } GPIOIntTypeSet(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_V2, GPIO_INT_TYPE_FALLEDGE);
@& |" t+ c8 R, M GPIOIntTypeSet(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_C, GPIO_INT_TYPE_FALLEDGE);; }1 h- o4 x9 X) y' o) E
//GPIOIntTypeSet(SOC_GPIO_0_REGS, AD7606_PAR_BUSY, GPIO_INT_TYPE_FALLEDGE);
; M4 v# a3 _8 z- _5 F# T# e /*The interrupt setting allows AD7606_PAR_BUSY_GPIO_BANK*/5 j# M; i, f+ D' G
GPIOBankIntEnable(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_GPIO_BANK);$ U" [6 B8 t9 ~) W% B
: J# E( f& l1 \, y2 U# c- S
GPIODirModeSet(SOC_GPIO_0_REGS, AD7606_PAR_RESET, GPIO_DIR_OUTPUT);8 e1 {/ a" M3 G0 v6 O( j8 _" U
GPIOPinWrite(SOC_GPIO_0_REGS, AD7606_PAR_RESET, GPIO_PIN_HIGH);- y# k. b8 `( G: w. _6 Q
Task_sleep(1000);' \4 x% I j8 r3 F: |% ?
GPIOPinWrite(SOC_GPIO_0_REGS, AD7606_PAR_RESET, GPIO_PIN_LOW);
& H$ k* O- [4 y K Task_sleep(1000);
6 X6 Z, \6 `* h3 S& M8 [9 S0 O9 q
; f. [3 z0 _* V1 i! a, o j- | /*Set the AD7606_PAR_CONVST to output mode*/
7 N; U0 M, C5 z* O, k ]0 u5 i GPIODirModeSet(SOC_GPIO_0_REGS, AD7606_PAR_CONVST, GPIO_DIR_OUTPUT);( j: U4 A" @# T- u
GPIOPinWrite(SOC_GPIO_0_REGS, AD7606_PAR_CONVST, GPIO_PIN_LOW);
6 m J/ P8 v- [8 H$ @" N
2 G7 \/ G* o, j0 b9 N GPIODirModeSet(SOC_GPIO_0_REGS, AD7606_PAR_RD, GPIO_DIR_OUTPUT);" b% Q- U: h# \$ A0 ]' V% k
GPIOPinWrite(SOC_GPIO_0_REGS, AD7606_PAR_RD, GPIO_PIN_HIGH);
& M2 @; J% u# m0 M5 i; y% m/ h
. k* ]% \ j; X7 H* L}, V+ e# k( h( A, a( o+ z8 }2 L
0 l+ s& \3 H! j& r4 @4 w {8 {, w/ z# n) ?" F, e
static void ad7606_busy_hwi(UArg ad_addr) {
9 o# V; X/ Q3 G, l: q4 y/ }% i, Q% g9 H( k6 }2 \5 G! n) Q% I
3 z. }$ T" q& f' A9 O
/* Disable the interrupts for pins of bank AD7606_PAR_BUSY in GPIO.*/$ |; s$ W& L: _9 L7 g
GPIOBankIntDisable(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_GPIO_BANK); //用仿真器debug,发现程序能进入这里。
0 W [; n" ~- E) Y" x
$ M( T% w& W+ L# C: n; C# i; q- j if(GPIOPinIntStatus(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_V1) == GPIO_INT_PEND)! B5 h; c- ?/ u% x% j
{% h6 ?; N9 i% r1 f
GPIOPinIntClear(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_V1); //问题是:用仿真器debug,发现程序不能进入这里。
~2 l8 u# v1 E8 ~, d! a cs_addr = SOC_EMIFA_CS5_ADDR ;
) ~- D8 S O7 ~& `$ P5 O, b y @0 h internal = 0 ;
' K" \: m3 ~; C) j4 _: u# N( J int_flag[0] = 1 ;( Z) b0 L+ ]6 u' k* ?7 C. {
}
- p% K1 B. x8 @ if(GPIOPinIntStatus(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_V2) == GPIO_INT_PEND)4 H3 d3 Y2 `, O( X+ ^
{7 q/ [1 z- Z: X$ c. j7 V
GPIOPinIntClear(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_V2); //问题是:用仿真器debug,发现程序不能进入这里。. l. |" u, H- R; D
cs_addr = SOC_EMIFA_CS4_ADDR ;
9 {# I( [- Y& L1 ?9 r: y0 _ internal = 6 ;" B" k! U9 G$ G5 o: Z# |5 h
int_flag[1] = 1 ;! n2 u# E- r: ?4 `: f+ _
}
- @. |8 I1 w) K0 H; } if(GPIOPinIntStatus(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_C) == GPIO_INT_PEND)
! u2 X" H3 E0 d" l* y3 N. z {1 p6 Y$ _) u" s% x) s* _. b
GPIOPinIntClear(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_C); //问题是:用仿真器debug,发现程序不能进入这里。. G% U0 D4 M# n
cs_addr = SOC_EMIFA_CS2_ADDR ;
5 }. V& d7 ~- {6 q0 { L9 l* |/ S internal = 12 ;' E7 ]+ J% D( ~$ @& H* y1 m
int_flag[2] = 1 ;# x- U8 M. l V1 B/ t2 z
}
7 X* F- v* E5 |. |8 a& W* o( U
: b$ X/ k. p2 I+ T/ @' w: \0 R; h" J GPIOPinWrite(SOC_GPIO_0_REGS, AD7606_PAR_CONVST, GPIO_PIN_LOW);# T; N0 e& O4 X
1 k4 l! r! S( @# e- o# M1 ^5 w% i
GPIOBankIntEnable(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_GPIO_BANK);
% @ d% U; y2 \ K% j3 v0 D3 B}
" t6 M* s- U0 \7 d& X3 D( {- b9 h: y+ o
|
|