|
|
您好。使用GPIO中断时,中断能进入ISR,但是不能区分具体的GPIO端口。程序如下:
% z, S: D" }0 A$ G6 a* Y% b#define AD7606_PAR_BUSY_GPIO_BANK 5
- r7 e3 A7 X! i2 A#define AD7606_PAR_BUSY_GPIO_BANK_INT SYS_INT_GPIO_B5INT: j. T& V# R; L; c
% r. b) s4 \9 i J$ D, u
#define AD7606_PAR_BUSY_V1 GPIO_TO_PIN(5, 11) //BANK5的中断口5.11
, F/ q2 H V, M/ {$ }#define AD7606_PAR_BUSY_V2 GPIO_TO_PIN(5, 9) //BANK5的中断口5.9
) N' }- P2 w- h# g0 g( Q( G. a9 o#define AD7606_PAR_BUSY_C GPIO_TO_PIN(5, 5) //BANK5的中断口5.5
4 ~( V: r8 a4 V7 M#define AD7606_PAR_BUSY GPIO_TO_PIN(5, 4): E+ M" W9 G7 z8 _
1 \5 x' u& B3 ]$ @+ U4 L0 b#define AD7606_PAR_CONVST GPIO_TO_PIN(5, 1)2 U. ]- ?9 b n2 T$ I: C
#define AD7606_PAR_RD GPIO_TO_PIN(5, 2)2 q5 l+ R) Q* p- @2 p$ B
#define AD7606_PAR_RESET GPIO_TO_PIN(5, 0)
2 Z! @7 x, S5 }+ E4 @/ r& F5 w) @ b8 \1 S7 o. d
7 }; X% s; _( k1 J- v$ A
: Q5 p; Z) h3 c) Sstatic void ad7606_irq_setup(ad7606 *ad) {& L a0 C& o; H) p+ Z) O4 M5 y
Hwi_Params hwiParams;
- v5 K" g, {* u/ T) @7 C2 Y% B Hwi_Handle myHwi;
& i; R4 ^* V7 P/ H! n d Error_Block eb;
/ E/ `* u. c$ F h; m5 d* D! G
0 Z6 @4 _ [/ ?3 k* |# a6 ?; R+ O. ^, r! c Error_init(&eb);' n. Z6 W! \* b7 Q
Hwi_Params_init(&hwiParams);
$ c6 P4 y. R7 k2 g' f# F hwiParams.arg = (unsigned int)ad;( \! E( y# O0 R. k$ K
hwiParams.enableInt = FALSE;
$ T( S3 v. n( y! ?6 h; q hwiParams.eventId = SYS_INT_GPIO_B5INT;0 w; k" l o/ S- k+ s( X' F6 C
hwiParams.priority = 4;5 E" ?9 y4 s n1 R9 Y1 Y
myHwi = Hwi_create(8, ad7606_busy_hwi, &hwiParams, &eb); //注册BANK5中断处理函数" ]* G9 ^0 L: ?
if (myHwi == NULL)
7 k2 s; M' v# q' L) F* L7 P LOG_FATAL("failed to create hwi");
* O, j0 B; _% c5 c( R0 d) }. m7 ~" X8 e: i" x* o N4 h
/* enable both interrupts */
! i2 m# j+ w1 ~ Hwi_enableInterrupt(ad->irq_event);
* i; b# f) W& V4 k0 P}
7 D5 N0 w$ N8 ^+ S7 }, j. M/ d2 K
1 B* `* V4 y# Y5 M# L6 Z9 m6 G
static void ad7606_gpio_pinmux_setup(ad7606 *ad) {
( a+ j8 O4 U K; F$ g7 ~+ f, X volatile unsigned int savePinMux = 0;! g3 @" I+ H* g4 \
//初始化5.11、5.9 、 5.5为GPIO口4 t6 ?" K% A! d; t# o% ~ m% H
savePinMux = HWREG(SOC_SYSCFG_0_REGS + SYSCFG0_PINMUX(11)) & (~(SYSCFG_PINMUX11_PINMUX11_27_24 | SYSCFG_PINMUX11_PINMUX11_19_16));
, y# |8 J) B6 o7 H
6 n- H, x! Y R6 N HWREG(SOC_SYSCFG_0_REGS + SYSCFG0_PINMUX(11)) = (PINMUX11_BUSY_V1_ENABLE | PINMUX11_BUSY_V2_ENABLE | savePinMux);2 j9 G2 g( X, j# M/ O( ?3 X
/ ]! J( O6 K7 i9 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)); {1 Z9 S" r2 f8 U3 B
$ H5 c# y. E' m0 Y; _ HWREG(SOC_SYSCFG_0_REGS + SYSCFG0_PINMUX(12)) = (PINMUX12_RESET_ENABLE | PINMUX12_CONVST_ENABLE | PINMUX12_RD_ENABLE | PINMUX12_BUSY_C_ENABLE | savePinMux);' A9 R L4 r q! G* O$ n' q) n
, l- E! s( M- }# @
}; B) J4 v; i7 M
Q3 U/ z4 H ]3 j% B( A
; `' `& v W' l2 ostatic void ad7606_gpio_setup(ad7606 *ad) {
9 `8 ]% P$ S3 i4 w /*Set the AD7606_PAR_BUSY to the input mode*/
- M) `7 G4 L+ Y/ n4 n9 L# w* \ //初始化5.11、5.9 、 5.5为中断口
) d( T! T! u9 q5 T$ b GPIODirModeSet(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_V1, GPIO_DIR_INPUT);7 x: {0 Y2 ?9 [4 {) B+ T9 N
GPIODirModeSet(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_V2, GPIO_DIR_INPUT);
* A+ U8 b( c2 w" i9 C& U0 s) t GPIODirModeSet(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_C, GPIO_DIR_INPUT);) W( N! t( s. b
//GPIODirModeSet(SOC_GPIO_0_REGS, AD7606_PAR_BUSY, GPIO_DIR_INPUT);
n) R0 b" @) `$ J. d) p /*Set the AD7606_PAR_BUSY to the Falling Edge Interrupt*/
$ u( E e% D, ?; f* u GPIOIntTypeSet(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_V1, GPIO_INT_TYPE_FALLEDGE);
& g B; g9 w7 Y, O GPIOIntTypeSet(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_V2, GPIO_INT_TYPE_FALLEDGE);) g7 E$ ~4 v4 b( ]- ~
GPIOIntTypeSet(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_C, GPIO_INT_TYPE_FALLEDGE);
- ^$ i! ^# T. j1 G1 i8 b' { ]" o$ A //GPIOIntTypeSet(SOC_GPIO_0_REGS, AD7606_PAR_BUSY, GPIO_INT_TYPE_FALLEDGE);
) b9 E0 H. ~3 R7 N8 V /*The interrupt setting allows AD7606_PAR_BUSY_GPIO_BANK*/, E4 {4 d* Z% z+ ^9 e
GPIOBankIntEnable(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_GPIO_BANK);1 i$ `3 F5 N7 v" y) j2 t4 U m/ R0 Y
( R7 b* o% X U; B
GPIODirModeSet(SOC_GPIO_0_REGS, AD7606_PAR_RESET, GPIO_DIR_OUTPUT);
$ m% x. D) Y( L" |- G GPIOPinWrite(SOC_GPIO_0_REGS, AD7606_PAR_RESET, GPIO_PIN_HIGH);4 K4 u: ^) d" T2 g6 D# J* s B9 d6 x
Task_sleep(1000);
, ?. [/ [. n0 z8 F GPIOPinWrite(SOC_GPIO_0_REGS, AD7606_PAR_RESET, GPIO_PIN_LOW);
: q9 f \ C8 [ Task_sleep(1000); F! X7 J. N U% t9 S, }
9 @' O! t" B* W /*Set the AD7606_PAR_CONVST to output mode*/
# w" n% C9 o0 E6 ^1 P, ? GPIODirModeSet(SOC_GPIO_0_REGS, AD7606_PAR_CONVST, GPIO_DIR_OUTPUT);9 e7 [, O7 Z, }6 u% T, P8 n
GPIOPinWrite(SOC_GPIO_0_REGS, AD7606_PAR_CONVST, GPIO_PIN_LOW);
0 I1 J6 T- p" j* P8 \" L# c
6 D% U+ _2 i! A2 h. y7 S9 u GPIODirModeSet(SOC_GPIO_0_REGS, AD7606_PAR_RD, GPIO_DIR_OUTPUT);
, n3 o' I5 H: N2 n/ [+ `5 n GPIOPinWrite(SOC_GPIO_0_REGS, AD7606_PAR_RD, GPIO_PIN_HIGH);
' c* b4 r) r: l. J+ Y# o" ]
7 q/ C$ ?/ O- ?8 j& K: T0 l$ n}- a. {5 B- N! M# v: C+ j* i
! t; E' j( \+ ]
; F+ Y; W+ @7 t% u/ f: V$ b7 [
static void ad7606_busy_hwi(UArg ad_addr) {
3 A' A, J( c* o! Y: j* ?5 R" e; n& b# k5 O& j$ F6 F
, ^' r; T2 @0 k$ v2 p% G4 Y# E$ K /* Disable the interrupts for pins of bank AD7606_PAR_BUSY in GPIO.*/
7 B6 ? D0 H1 M9 g8 Y' [ GPIOBankIntDisable(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_GPIO_BANK); //用仿真器debug,发现程序能进入这里。
2 R3 d9 V8 q) L: C' w$ T% k* I5 g2 f6 T2 n8 O" u
if(GPIOPinIntStatus(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_V1) == GPIO_INT_PEND)/ ?! R5 g; }( p% s
{
; h, n( ~& F2 ~* o/ X0 s GPIOPinIntClear(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_V1); //问题是:用仿真器debug,发现程序不能进入这里。
1 p- s5 r2 P5 e1 T4 O8 l cs_addr = SOC_EMIFA_CS5_ADDR ;
* @% ~5 @& ~: [4 T' M internal = 0 ;# ~2 g2 b0 t* o$ A/ z8 S
int_flag[0] = 1 ;% H; c& ], ~0 [. z
}0 L$ X8 X6 h3 J& B- A( `
if(GPIOPinIntStatus(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_V2) == GPIO_INT_PEND)3 x% |7 R" o N! u6 u" _% b
{, H8 [$ K2 _* N
GPIOPinIntClear(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_V2); //问题是:用仿真器debug,发现程序不能进入这里。. K) o3 K/ t7 w
cs_addr = SOC_EMIFA_CS4_ADDR ;/ t. U0 b% m2 g- W( ^) a5 V: \
internal = 6 ;( ]+ Q2 S+ l. {
int_flag[1] = 1 ;: J5 W0 D" Q7 u. {5 z" M
}7 \# c c/ l5 c) b. X* R
if(GPIOPinIntStatus(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_C) == GPIO_INT_PEND): k% Z% ^ @: \' s1 N) J
{! t8 n P( }+ E) w
GPIOPinIntClear(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_C); //问题是:用仿真器debug,发现程序不能进入这里。. u0 ^* V9 Z8 y
cs_addr = SOC_EMIFA_CS2_ADDR ;$ M# ?8 m0 G+ p+ o( W- g/ f2 Z
internal = 12 ;
& [7 ?- Y: u6 Y5 Y% q int_flag[2] = 1 ;
" u7 N2 {) ?( s- g }
9 X2 `7 V; [* a4 x* o) P
: @/ m. \) u) ~* \& r ~1 [ GPIOPinWrite(SOC_GPIO_0_REGS, AD7606_PAR_CONVST, GPIO_PIN_LOW);) b2 ?# ~6 g8 i M
( C' O6 o3 f5 {+ b. L2 B0 d
GPIOBankIntEnable(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_GPIO_BANK);0 i1 A; T2 [- Q
}$ _1 o: @9 C2 K& g1 j8 ~
- N2 I1 M! f* n |
|