|
您好。使用GPIO中断时,中断能进入ISR,但是不能区分具体的GPIO端口。程序如下:
# G6 F& g6 `2 @! y; W8 P% A#define AD7606_PAR_BUSY_GPIO_BANK 5
( R8 z! g7 u4 U) W#define AD7606_PAR_BUSY_GPIO_BANK_INT SYS_INT_GPIO_B5INT
( Q8 P- o# t, c/ R
. D+ ~" v4 T4 `: o+ T4 K#define AD7606_PAR_BUSY_V1 GPIO_TO_PIN(5, 11) //BANK5的中断口5.11
i2 Q% J9 E+ e; m5 f& a* p$ i8 X#define AD7606_PAR_BUSY_V2 GPIO_TO_PIN(5, 9) //BANK5的中断口5.9% @. z* o* f9 ~
#define AD7606_PAR_BUSY_C GPIO_TO_PIN(5, 5) //BANK5的中断口5.5( R3 u. |6 k( m, D
#define AD7606_PAR_BUSY GPIO_TO_PIN(5, 4)
M0 C: c5 h; e+ e# o8 ]# M: ^/ R8 ?5 D* ^6 T \. l
#define AD7606_PAR_CONVST GPIO_TO_PIN(5, 1)
0 s2 W8 W9 F2 }9 J#define AD7606_PAR_RD GPIO_TO_PIN(5, 2)# q! E( A5 v [5 i7 l- e0 f
#define AD7606_PAR_RESET GPIO_TO_PIN(5, 0)
$ h0 X: U2 \1 [2 l- `5 S( ^( D0 F; X H+ o
+ ]5 l2 @2 l; \+ M: b1 U" @
* j9 m& B( U. B8 ~( _ d
static void ad7606_irq_setup(ad7606 *ad) {; [+ D7 P" I, P
Hwi_Params hwiParams;
- Q0 c E( e- m* E Hwi_Handle myHwi;
# n0 s( h2 {5 `* I, x# C Error_Block eb;
0 f$ P$ b- s$ V& T& j) I6 Q
: {1 [* {7 z5 n& H" F Error_init(&eb);
, J! Q" a" L: w' S' i+ O" H Hwi_Params_init(&hwiParams);% L) p0 v. q8 l B
hwiParams.arg = (unsigned int)ad;6 N. O+ y% X- v# F
hwiParams.enableInt = FALSE;* I( N5 q+ p/ q+ o* }
hwiParams.eventId = SYS_INT_GPIO_B5INT;
* D% ^- F1 Y0 V+ S hwiParams.priority = 4;
* e) l9 ~5 e7 J; H myHwi = Hwi_create(8, ad7606_busy_hwi, &hwiParams, &eb); //注册BANK5中断处理函数2 J5 \* v% W" D5 L u
if (myHwi == NULL)
5 `; h: u7 o! W P LOG_FATAL("failed to create hwi");* e O- s8 I9 i6 z& W0 D
2 D6 N: s! E7 t9 K) c' A" T
/* enable both interrupts */. w0 _' t' C' j8 v5 d
Hwi_enableInterrupt(ad->irq_event);$ b" P1 n6 h8 c9 \( e) ?3 A
}3 A0 _6 _, }7 v
! }" w) L2 c3 b6 ^
$ x" T9 `. Y E$ }$ ]9 O
static void ad7606_gpio_pinmux_setup(ad7606 *ad) {/ d, i& h' Z8 y) ?# R
volatile unsigned int savePinMux = 0;) j& k$ W0 W) i" p/ \1 Z/ R$ R
//初始化5.11、5.9 、 5.5为GPIO口
$ [; S% A4 Y6 j- }) P: c/ v6 _ savePinMux = HWREG(SOC_SYSCFG_0_REGS + SYSCFG0_PINMUX(11)) & (~(SYSCFG_PINMUX11_PINMUX11_27_24 | SYSCFG_PINMUX11_PINMUX11_19_16));. P6 k3 O; F. W; M- E
6 y* c1 C% r2 T0 I8 H- C' T9 c HWREG(SOC_SYSCFG_0_REGS + SYSCFG0_PINMUX(11)) = (PINMUX11_BUSY_V1_ENABLE | PINMUX11_BUSY_V2_ENABLE | savePinMux);5 L X+ @% u: Q1 f8 _+ Y
" T7 Q& _# v4 z4 m8 u$ g4 z
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));
6 X) Y9 y% L) S& Y
* ~/ Z6 X% P; T* E! f8 c HWREG(SOC_SYSCFG_0_REGS + SYSCFG0_PINMUX(12)) = (PINMUX12_RESET_ENABLE | PINMUX12_CONVST_ENABLE | PINMUX12_RD_ENABLE | PINMUX12_BUSY_C_ENABLE | savePinMux);! j% b) I! `6 B7 U0 h( t. N
6 `' a; U) o; k) x, F2 h9 Q* K0 X; {
}
' j6 e3 b$ p( ]0 q9 a C# i( \
& K: \. o! C# F' m' l
2 V3 A1 j+ ?! }" Kstatic void ad7606_gpio_setup(ad7606 *ad) {' a- B6 ~5 s7 l- S6 v' e+ l
/*Set the AD7606_PAR_BUSY to the input mode*/0 W; h2 _+ `: h3 }" O! N
//初始化5.11、5.9 、 5.5为中断口* U, [* `8 b" J/ f7 x5 a$ W& i
GPIODirModeSet(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_V1, GPIO_DIR_INPUT);0 Z3 ~% Y( A( Y0 k' F2 \" I
GPIODirModeSet(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_V2, GPIO_DIR_INPUT);
3 U1 I( D: j4 E+ Q, z: g GPIODirModeSet(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_C, GPIO_DIR_INPUT);
6 J5 X9 {3 ]' O$ U, {2 W //GPIODirModeSet(SOC_GPIO_0_REGS, AD7606_PAR_BUSY, GPIO_DIR_INPUT);( R& J4 Q! g6 Q0 I4 F! g n
/*Set the AD7606_PAR_BUSY to the Falling Edge Interrupt*/" ~/ L0 G1 F# c7 y% W2 ?
GPIOIntTypeSet(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_V1, GPIO_INT_TYPE_FALLEDGE);
0 W- N6 A5 C7 n, w, ]. Q GPIOIntTypeSet(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_V2, GPIO_INT_TYPE_FALLEDGE);
# G! R. N/ h, l GPIOIntTypeSet(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_C, GPIO_INT_TYPE_FALLEDGE);- o& u! a; G$ `
//GPIOIntTypeSet(SOC_GPIO_0_REGS, AD7606_PAR_BUSY, GPIO_INT_TYPE_FALLEDGE);
$ F5 C" |5 j9 B4 w$ E( [ /*The interrupt setting allows AD7606_PAR_BUSY_GPIO_BANK*/
# q7 n" S2 D: g" g! H" h! I; g GPIOBankIntEnable(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_GPIO_BANK);
' b9 }, h3 X/ ?5 C
6 A8 F6 [' _* e9 z6 n# x GPIODirModeSet(SOC_GPIO_0_REGS, AD7606_PAR_RESET, GPIO_DIR_OUTPUT);
0 L: X; O8 a( O, S4 v' V1 i8 l GPIOPinWrite(SOC_GPIO_0_REGS, AD7606_PAR_RESET, GPIO_PIN_HIGH);+ c, \( Z& [( d
Task_sleep(1000);
# M: }& ^( @6 G) ^2 E7 b GPIOPinWrite(SOC_GPIO_0_REGS, AD7606_PAR_RESET, GPIO_PIN_LOW);
9 j2 k r) F) C: J6 q: i Task_sleep(1000);
2 j, F! b! z( t* c9 {
! J" a( }3 p; }. y F( ~( v% _ /*Set the AD7606_PAR_CONVST to output mode*/
2 t7 g1 e9 m/ D4 F( m6 L" Q GPIODirModeSet(SOC_GPIO_0_REGS, AD7606_PAR_CONVST, GPIO_DIR_OUTPUT);
9 P$ `! H+ Z# c4 ?# ?: A0 Y GPIOPinWrite(SOC_GPIO_0_REGS, AD7606_PAR_CONVST, GPIO_PIN_LOW);+ B, Q0 \ A; t: V" r
- M+ k5 s) a3 a4 N! b2 |; J2 r GPIODirModeSet(SOC_GPIO_0_REGS, AD7606_PAR_RD, GPIO_DIR_OUTPUT);
: }9 B; K( i q6 f GPIOPinWrite(SOC_GPIO_0_REGS, AD7606_PAR_RD, GPIO_PIN_HIGH);
5 v( I) @2 |4 [! V* ]
+ N7 a+ u0 z5 d1 u) i q7 a1 O* a6 m$ r}& m8 [2 t; D/ }
' a2 k. D5 D5 p) D* u5 ?, D$ I
|) s9 c7 V5 Sstatic void ad7606_busy_hwi(UArg ad_addr) {2 o0 p: g9 Y0 O. c9 D+ G
. o" |: n( q! f9 {8 K( f2 o
% l9 S4 P( e2 q /* Disable the interrupts for pins of bank AD7606_PAR_BUSY in GPIO.*/
7 Y6 w- U5 f& \; l1 G e GPIOBankIntDisable(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_GPIO_BANK); //用仿真器debug,发现程序能进入这里。% g& O& B% N% C/ q
$ X3 ^! x5 i7 T( ] _0 i! C
if(GPIOPinIntStatus(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_V1) == GPIO_INT_PEND)$ V5 Y; Y- i9 u3 l/ |* H: ]" N
{" a; B2 B# U- i9 s
GPIOPinIntClear(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_V1); //问题是:用仿真器debug,发现程序不能进入这里。- E, n/ w) s5 w2 l& a
cs_addr = SOC_EMIFA_CS5_ADDR ;) v7 c0 d v2 Z& i$ ~
internal = 0 ;
4 T- w( o5 h9 |- f3 \ int_flag[0] = 1 ;0 O- l8 \, n$ j; j
}/ ]3 L0 z/ J _$ P% X7 d
if(GPIOPinIntStatus(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_V2) == GPIO_INT_PEND)
: `6 E9 ^; p5 A5 { {) b0 t! C- Z; W, q: V
GPIOPinIntClear(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_V2); //问题是:用仿真器debug,发现程序不能进入这里。
0 I9 v$ P; q; D) c& E) T cs_addr = SOC_EMIFA_CS4_ADDR ;
3 O, t3 h% k8 R4 s internal = 6 ;, X$ [! D7 d% k8 Z3 i
int_flag[1] = 1 ;! b! X$ q; Q/ G0 C7 x
}% c7 E* f3 j. R9 f! t
if(GPIOPinIntStatus(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_C) == GPIO_INT_PEND)
3 o" E: y* S" o9 _& p @0 k {4 J' J. }9 k# h' x
GPIOPinIntClear(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_C); //问题是:用仿真器debug,发现程序不能进入这里。
. R3 |0 E! D C% V5 } cs_addr = SOC_EMIFA_CS2_ADDR ;
- L# X2 F+ e5 \ internal = 12 ;+ N' e9 L, i1 s$ K
int_flag[2] = 1 ;3 |$ ~9 v& H/ ]% h
}( G: b0 A" _+ n' m) t
5 X0 `0 `) i' _, b) h: V F; Z; `
GPIOPinWrite(SOC_GPIO_0_REGS, AD7606_PAR_CONVST, GPIO_PIN_LOW);+ w5 a' d$ n8 P
: j, ?% I" b3 K- |3 D2 V. T
GPIOBankIntEnable(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_GPIO_BANK);- }% c+ _% Z* X& h* q- I. G7 k
}
* w$ L% l9 e; h2 c0 M7 b% r
+ d+ K- N' U+ n9 K |
|