|
|
您好。使用GPIO中断时,中断能进入ISR,但是不能区分具体的GPIO端口。程序如下:8 }) p$ n7 H% x
#define AD7606_PAR_BUSY_GPIO_BANK 5( D3 m, m% q* f4 M
#define AD7606_PAR_BUSY_GPIO_BANK_INT SYS_INT_GPIO_B5INT9 C5 D4 Q5 I- X6 h
+ c4 w: h0 M8 u, F3 y#define AD7606_PAR_BUSY_V1 GPIO_TO_PIN(5, 11) //BANK5的中断口5.11
\7 j9 o: T) c+ }, Q# W: k#define AD7606_PAR_BUSY_V2 GPIO_TO_PIN(5, 9) //BANK5的中断口5.9
! q i2 G) O: g; r5 t#define AD7606_PAR_BUSY_C GPIO_TO_PIN(5, 5) //BANK5的中断口5.5
0 n) W% v$ ^& f+ R#define AD7606_PAR_BUSY GPIO_TO_PIN(5, 4)# b" d, U# {) g6 x& J& I& C
7 |2 l! b0 V7 C; }5 F
#define AD7606_PAR_CONVST GPIO_TO_PIN(5, 1)
$ t0 y ^) o& `( M7 N, r0 T0 S3 X) u% R2 ]#define AD7606_PAR_RD GPIO_TO_PIN(5, 2)& y* ~$ b0 q+ V+ {
#define AD7606_PAR_RESET GPIO_TO_PIN(5, 0)
0 s+ Q; |4 q) _/ r( R: W- |
$ q: {7 l$ K! I+ r
# h' B8 c2 C! w1 T
/ o) M+ w: } S1 t6 t( s- istatic void ad7606_irq_setup(ad7606 *ad) {
0 _6 ~! D/ ^4 [$ n% w% E Hwi_Params hwiParams;
F4 k8 G: V1 Y. l R' \7 o1 q Hwi_Handle myHwi;
# H7 X# I4 k$ g# l" I" K Error_Block eb;! o" i5 g: `6 G. u* Y0 n. R
) D5 c' p. w; U" H; w Error_init(&eb);
& }$ T( k: c; v1 ] n, V, f Hwi_Params_init(&hwiParams);
+ y- J4 y$ i! M- z( p* F; ?/ t9 E hwiParams.arg = (unsigned int)ad;
" T: r) u9 M, Z hwiParams.enableInt = FALSE;
" b6 P1 {' `1 U+ v c* y6 l- Y! U hwiParams.eventId = SYS_INT_GPIO_B5INT;$ q, E# }5 f$ p$ ]9 ~
hwiParams.priority = 4;: v( g) a$ G$ F& ]; K; P/ o6 v
myHwi = Hwi_create(8, ad7606_busy_hwi, &hwiParams, &eb); //注册BANK5中断处理函数9 v) b! D: g5 @3 `
if (myHwi == NULL) + ^% h% e4 A. L; K5 H
LOG_FATAL("failed to create hwi");
) D: J5 }5 @# D7 I( a: m
' w C/ N) G. a3 ]$ b! Q /* enable both interrupts */. w6 v* w% P( P, @* Q8 _' y( X
Hwi_enableInterrupt(ad->irq_event);
3 E9 }, v- X- V' Y. N6 f}5 q0 P# L8 J- t* G7 Z0 o
3 R4 `. r: U$ l2 i- p
3 V, R" [: i8 j2 ]- N3 Wstatic void ad7606_gpio_pinmux_setup(ad7606 *ad) {3 @ U% B; q& g4 H8 g
volatile unsigned int savePinMux = 0;0 E3 D) @* U. F$ n0 C6 Q, X
//初始化5.11、5.9 、 5.5为GPIO口
+ [4 s( v4 `! q) h savePinMux = HWREG(SOC_SYSCFG_0_REGS + SYSCFG0_PINMUX(11)) & (~(SYSCFG_PINMUX11_PINMUX11_27_24 | SYSCFG_PINMUX11_PINMUX11_19_16));
1 g% Z. L; A Q4 f5 Y) _5 g& P9 P5 ^4 Z# \) r
HWREG(SOC_SYSCFG_0_REGS + SYSCFG0_PINMUX(11)) = (PINMUX11_BUSY_V1_ENABLE | PINMUX11_BUSY_V2_ENABLE | savePinMux);
0 g3 p2 r: H2 \ | }6 D9 Q7 [: ^5 }+ Y% S
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));
# @2 f: s2 U% k5 G( f4 n
3 W; T3 v- w. C HWREG(SOC_SYSCFG_0_REGS + SYSCFG0_PINMUX(12)) = (PINMUX12_RESET_ENABLE | PINMUX12_CONVST_ENABLE | PINMUX12_RD_ENABLE | PINMUX12_BUSY_C_ENABLE | savePinMux);, X0 l/ u: n( q# O/ `: H/ A
$ S- x6 F8 y3 X7 t; N: P5 v2 @}. e- _* F1 ~, Y6 n1 S' b
% ?/ a- B1 @* |) y9 @2 |
7 X5 m; y5 r G( Y2 istatic void ad7606_gpio_setup(ad7606 *ad) {2 j) Z6 g& ]3 p; e; u! g' q
/*Set the AD7606_PAR_BUSY to the input mode*/5 n4 Y# \# f4 _2 q5 x3 B
//初始化5.11、5.9 、 5.5为中断口
2 @9 \* l# v7 K$ b0 u4 Q1 Y GPIODirModeSet(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_V1, GPIO_DIR_INPUT);6 s8 N/ X3 z: H! B2 J3 l
GPIODirModeSet(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_V2, GPIO_DIR_INPUT);8 E; w) ^5 I x7 Y+ ]4 |
GPIODirModeSet(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_C, GPIO_DIR_INPUT);: a: z+ \# L4 V
//GPIODirModeSet(SOC_GPIO_0_REGS, AD7606_PAR_BUSY, GPIO_DIR_INPUT);6 G. M: ?, P! f) j( f- i
/*Set the AD7606_PAR_BUSY to the Falling Edge Interrupt*/; ^0 c8 m7 y+ W. b1 c1 F
GPIOIntTypeSet(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_V1, GPIO_INT_TYPE_FALLEDGE);7 Z0 j+ K! f3 s1 V3 W- r# q9 T
GPIOIntTypeSet(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_V2, GPIO_INT_TYPE_FALLEDGE);8 S) `0 ~2 j* I& y
GPIOIntTypeSet(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_C, GPIO_INT_TYPE_FALLEDGE);
* p' {1 t }- O //GPIOIntTypeSet(SOC_GPIO_0_REGS, AD7606_PAR_BUSY, GPIO_INT_TYPE_FALLEDGE);# V% d ]2 Q- ?3 [- t
/*The interrupt setting allows AD7606_PAR_BUSY_GPIO_BANK*/
# c" c$ ]% K; t GPIOBankIntEnable(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_GPIO_BANK);, [ H2 W" V% Y" y/ o) }
, K f& c9 y8 e3 D" V2 T6 S
GPIODirModeSet(SOC_GPIO_0_REGS, AD7606_PAR_RESET, GPIO_DIR_OUTPUT);
9 j3 j$ F6 a; r0 U( k GPIOPinWrite(SOC_GPIO_0_REGS, AD7606_PAR_RESET, GPIO_PIN_HIGH); x: G& t* W/ B' k
Task_sleep(1000);
# X+ c. k( i. E" x' x) Z GPIOPinWrite(SOC_GPIO_0_REGS, AD7606_PAR_RESET, GPIO_PIN_LOW);
5 b- a) i! X% ^2 q6 l/ U Task_sleep(1000);
7 E" E' O% H0 I$ I: C6 j
' n% @# A, h7 t7 @7 N( G /*Set the AD7606_PAR_CONVST to output mode*/2 v1 [, @+ X( B8 A4 F+ E; J* D+ p+ C" g. B
GPIODirModeSet(SOC_GPIO_0_REGS, AD7606_PAR_CONVST, GPIO_DIR_OUTPUT);
3 S6 f6 b* H6 J c GPIOPinWrite(SOC_GPIO_0_REGS, AD7606_PAR_CONVST, GPIO_PIN_LOW);
& l, K3 Z) f/ l9 T1 c( A% o
: V( c. ~3 m6 q- k GPIODirModeSet(SOC_GPIO_0_REGS, AD7606_PAR_RD, GPIO_DIR_OUTPUT);
/ |3 {. l) J4 V- x GPIOPinWrite(SOC_GPIO_0_REGS, AD7606_PAR_RD, GPIO_PIN_HIGH);6 l) w& X. }: G4 d
) Y4 [& U; ]( o3 ?" u! C- v" X: \
}: f9 ~2 m+ k6 S0 E0 z$ x
+ [2 V6 i1 ~, _9 p* l
' H" a% v5 \* F
static void ad7606_busy_hwi(UArg ad_addr) { R3 h; k0 O: u. L& e
9 ~4 p7 [3 r8 X6 w# I/ t: l% G# @2 i' ]! U* J: s
/* Disable the interrupts for pins of bank AD7606_PAR_BUSY in GPIO.*/
; b. H% t6 B0 G- x GPIOBankIntDisable(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_GPIO_BANK); //用仿真器debug,发现程序能进入这里。
$ M9 f& C( s6 `( i
- u4 ?1 F; y2 ^* r0 W6 a: U# ^ if(GPIOPinIntStatus(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_V1) == GPIO_INT_PEND)2 r" t }2 j1 O
{
' p- F6 j2 c$ Y O1 a3 ?( ]7 U GPIOPinIntClear(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_V1); //问题是:用仿真器debug,发现程序不能进入这里。9 A- s8 ]7 S6 ~) w. w
cs_addr = SOC_EMIFA_CS5_ADDR ;
8 m8 k7 P: _3 L" H* [" s internal = 0 ;
7 w- O/ \& ]1 f0 f int_flag[0] = 1 ;4 |1 {; ]' H0 p) U* p8 g) f. n6 L9 V
}
' R* n4 }' b2 Y$ E if(GPIOPinIntStatus(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_V2) == GPIO_INT_PEND)" ~1 g. a& w$ s, c, V5 Q$ {
{8 K) l3 Z$ K9 y7 n
GPIOPinIntClear(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_V2); //问题是:用仿真器debug,发现程序不能进入这里。" `0 q6 J: h7 k) [3 M$ h; j+ }
cs_addr = SOC_EMIFA_CS4_ADDR ;3 R+ m/ N, I7 N. H7 d7 q3 U
internal = 6 ;
+ d3 @/ B9 u$ N, J int_flag[1] = 1 ;$ {, O1 z, k/ z$ M5 D+ h2 [
}2 t" V, T' f O! v) \5 N
if(GPIOPinIntStatus(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_C) == GPIO_INT_PEND)
+ p! d8 @. h- Y: a2 l/ k8 t {: F- f& O8 S. i1 X2 m/ m8 e* b8 d
GPIOPinIntClear(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_C); //问题是:用仿真器debug,发现程序不能进入这里。# [6 u0 v3 k% Z! S. j5 ?7 C
cs_addr = SOC_EMIFA_CS2_ADDR ;4 I8 J" F2 U9 B
internal = 12 ;. K/ `9 I5 {% `
int_flag[2] = 1 ;
8 u0 J+ S- c# n }
3 x: w2 f# _. o8 d1 Q/ \( n
1 X. B, U" C; j- @7 {+ ?+ y0 D j+ c GPIOPinWrite(SOC_GPIO_0_REGS, AD7606_PAR_CONVST, GPIO_PIN_LOW);
% _' ~- U$ r9 d" p8 }! s
7 r" \2 I1 s* b+ g6 b4 @ GPIOBankIntEnable(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_GPIO_BANK);
; ~6 V! d |" h# s W+ ]) {7 [}& r8 |- m1 u V
: U) g# M/ G- N% ^ |
|