|
您好。使用GPIO中断时,中断能进入ISR,但是不能区分具体的GPIO端口。程序如下:
/ R8 h/ O* A% [3 X! q& y. X( S2 F& g#define AD7606_PAR_BUSY_GPIO_BANK 5
1 q7 }# h) V; p+ j/ Z3 i9 m' {3 k#define AD7606_PAR_BUSY_GPIO_BANK_INT SYS_INT_GPIO_B5INT! Y7 }6 o! H2 x& F& O
* h- p4 E( Q9 d: x; x; F#define AD7606_PAR_BUSY_V1 GPIO_TO_PIN(5, 11) //BANK5的中断口5.11
" _4 |: U5 B* r#define AD7606_PAR_BUSY_V2 GPIO_TO_PIN(5, 9) //BANK5的中断口5.9
# d$ D# i2 J( c4 W( E5 J5 J: T. m#define AD7606_PAR_BUSY_C GPIO_TO_PIN(5, 5) //BANK5的中断口5.5
' g- H1 I( j6 y u/ y. y1 r#define AD7606_PAR_BUSY GPIO_TO_PIN(5, 4)( s G: i6 h) o3 E9 a: H) r
" q7 P$ }7 t1 A5 @
#define AD7606_PAR_CONVST GPIO_TO_PIN(5, 1)
* G! d L0 o: ?4 r#define AD7606_PAR_RD GPIO_TO_PIN(5, 2)
! s5 \6 g+ l* p( F#define AD7606_PAR_RESET GPIO_TO_PIN(5, 0)
; E2 k i: G# {# I
. K; M9 e: [5 |6 f* x9 [$ l! o& u. \- b1 E* v0 ~6 n$ P2 ^- S% {
m- ?3 J. t* Y3 _( w' q$ ^static void ad7606_irq_setup(ad7606 *ad) {4 T: J+ B9 V# I* s% z
Hwi_Params hwiParams;
( D* V2 ^* M; @8 I$ X Hwi_Handle myHwi;
' b, T0 @% @& I! o Error_Block eb;$ v$ _6 {/ X% e
5 v, S) u! |+ S- E h Error_init(&eb);8 M3 @5 y; M# B; ]3 v4 }
Hwi_Params_init(&hwiParams);
9 j' q1 y2 Q. y hwiParams.arg = (unsigned int)ad;3 [) _+ n2 w6 }: C/ x
hwiParams.enableInt = FALSE;
Q* w0 u2 s4 R8 C3 X) y1 \! Y hwiParams.eventId = SYS_INT_GPIO_B5INT;
* |+ L' a1 ]7 F I; R; E0 R hwiParams.priority = 4;
: k. A8 R1 k6 T% R2 M myHwi = Hwi_create(8, ad7606_busy_hwi, &hwiParams, &eb); //注册BANK5中断处理函数/ v* I2 M$ ~9 K8 @* W
if (myHwi == NULL) 5 J; b! Q, p) U `- C
LOG_FATAL("failed to create hwi");, k- ?, Q- T1 \3 B% X9 ]! O3 X
" _9 \ s/ ?! s4 [& |
/* enable both interrupts */4 @7 S7 K7 @5 e C
Hwi_enableInterrupt(ad->irq_event);
" S9 S* ]* V; Y# Z* a) K}
3 E) m& L. ~, L3 W, X7 C5 s
' ?4 q9 ~3 k0 S
$ o& |" C, N m4 `static void ad7606_gpio_pinmux_setup(ad7606 *ad) {
% D U9 U7 C' X* d volatile unsigned int savePinMux = 0;
: l4 B: L- W7 T: e9 V V5 W2 o6 `1 ^ //初始化5.11、5.9 、 5.5为GPIO口
+ A6 b6 P6 Q) @1 V savePinMux = HWREG(SOC_SYSCFG_0_REGS + SYSCFG0_PINMUX(11)) & (~(SYSCFG_PINMUX11_PINMUX11_27_24 | SYSCFG_PINMUX11_PINMUX11_19_16));
5 s' ]% s; e7 V/ b; `+ f$ P- w3 I5 ^0 @% D! x% W1 O. Y9 O
HWREG(SOC_SYSCFG_0_REGS + SYSCFG0_PINMUX(11)) = (PINMUX11_BUSY_V1_ENABLE | PINMUX11_BUSY_V2_ENABLE | savePinMux);
" Q3 o- [ R9 X, H) b4 t/ [; J. Z2 M3 _& x' f* ?0 ]3 j* C; Z8 {
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));/ K# I6 y9 l: f" I
6 _ }8 S& \: I6 v6 X
HWREG(SOC_SYSCFG_0_REGS + SYSCFG0_PINMUX(12)) = (PINMUX12_RESET_ENABLE | PINMUX12_CONVST_ENABLE | PINMUX12_RD_ENABLE | PINMUX12_BUSY_C_ENABLE | savePinMux);% F! P( }" J2 |# Y" ~% W2 L+ Z
. m% `. n+ z! Z0 v% t5 H" I
}
) v! N ^% G! v' B" b J' x1 V+ l# Z$ m" j! r
# Z S% S0 K8 r
static void ad7606_gpio_setup(ad7606 *ad) {
4 z, t( p) J2 l- P /*Set the AD7606_PAR_BUSY to the input mode*/
3 G* V) l) I6 ^0 b! @ //初始化5.11、5.9 、 5.5为中断口
5 E5 n; v; ~5 Q" b GPIODirModeSet(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_V1, GPIO_DIR_INPUT);# O8 e' u6 ?% V8 z( P
GPIODirModeSet(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_V2, GPIO_DIR_INPUT);8 |1 k& V9 M$ Q
GPIODirModeSet(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_C, GPIO_DIR_INPUT);) A$ c: j7 V- N/ e/ |+ n& d. ~
//GPIODirModeSet(SOC_GPIO_0_REGS, AD7606_PAR_BUSY, GPIO_DIR_INPUT);
5 |( O6 N, a4 g( _. r /*Set the AD7606_PAR_BUSY to the Falling Edge Interrupt*/8 V9 H, H1 x8 q; |
GPIOIntTypeSet(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_V1, GPIO_INT_TYPE_FALLEDGE);
+ T0 U& r$ @; ]' o1 {/ g GPIOIntTypeSet(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_V2, GPIO_INT_TYPE_FALLEDGE);7 r, D0 K) ]! \; P5 v2 S# M
GPIOIntTypeSet(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_C, GPIO_INT_TYPE_FALLEDGE);
& K1 }' U' q) V //GPIOIntTypeSet(SOC_GPIO_0_REGS, AD7606_PAR_BUSY, GPIO_INT_TYPE_FALLEDGE);, s9 r$ S) X- z$ m1 v L
/*The interrupt setting allows AD7606_PAR_BUSY_GPIO_BANK*/ t. l( p2 T( w5 W
GPIOBankIntEnable(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_GPIO_BANK);
$ S8 H- ` G1 Y) I7 v4 G
4 f8 T/ w# m. i) H GPIODirModeSet(SOC_GPIO_0_REGS, AD7606_PAR_RESET, GPIO_DIR_OUTPUT);
9 P0 i* d m- \, }; x, G' _0 L GPIOPinWrite(SOC_GPIO_0_REGS, AD7606_PAR_RESET, GPIO_PIN_HIGH);2 H* A4 b9 I+ \9 Q9 w6 V2 F4 }
Task_sleep(1000);# B: g& p- n; E) \* P9 g0 C
GPIOPinWrite(SOC_GPIO_0_REGS, AD7606_PAR_RESET, GPIO_PIN_LOW);( ^5 u+ Y7 }& K+ h8 v4 ~ d
Task_sleep(1000);
- v f% J' a. S2 X8 \ t) }
, \, i: P- O0 R4 y5 w& _/ ]$ N- R /*Set the AD7606_PAR_CONVST to output mode*/
+ I) ~( X( [1 e5 u7 Q GPIODirModeSet(SOC_GPIO_0_REGS, AD7606_PAR_CONVST, GPIO_DIR_OUTPUT);
: L) N5 C: m% l& r L6 Z$ E GPIOPinWrite(SOC_GPIO_0_REGS, AD7606_PAR_CONVST, GPIO_PIN_LOW);7 b0 z, p8 k0 S" s% A
, q6 j f( H' g GPIODirModeSet(SOC_GPIO_0_REGS, AD7606_PAR_RD, GPIO_DIR_OUTPUT);
1 K* [* l- Y9 X9 n GPIOPinWrite(SOC_GPIO_0_REGS, AD7606_PAR_RD, GPIO_PIN_HIGH);
& g- M! y% b1 O0 o' f& C2 B
) ?+ j/ T" Y, m- ]9 n9 M# Q}
. `/ J; { ]7 n+ K/ f! Q1 v% \; h" n7 A8 c( C
* L& w! ~6 ^5 h( L# U+ G
static void ad7606_busy_hwi(UArg ad_addr) {
& y; c: X8 t! I6 f1 |/ H, x+ ^& W9 g T4 b3 a
4 _# q/ ?" g ]5 y# S* J /* Disable the interrupts for pins of bank AD7606_PAR_BUSY in GPIO.*/
- b1 \; h9 U' g- |/ }9 Y GPIOBankIntDisable(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_GPIO_BANK); //用仿真器debug,发现程序能进入这里。. f- D7 s5 N- A: G0 C
1 B; R! ]3 k9 L3 [2 X) D
if(GPIOPinIntStatus(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_V1) == GPIO_INT_PEND)
; q' h4 n" {# ?, @/ n {
2 B( K3 O |+ r B& O GPIOPinIntClear(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_V1); //问题是:用仿真器debug,发现程序不能进入这里。
8 q3 ]( N5 g7 N0 o# o( ^ cs_addr = SOC_EMIFA_CS5_ADDR ; {" h3 b' O5 q/ T8 @
internal = 0 ;
2 }6 m, `/ n! x5 g7 d9 [ int_flag[0] = 1 ;
) B! o$ A7 B7 s. W4 q }' `+ O8 c) u1 `6 _3 b+ B
if(GPIOPinIntStatus(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_V2) == GPIO_INT_PEND)
6 Y9 X& M: N& N2 o {
% L: u L* y5 I* X# o- U! U GPIOPinIntClear(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_V2); //问题是:用仿真器debug,发现程序不能进入这里。1 f* m! p1 L( A6 A3 d( K5 a) h
cs_addr = SOC_EMIFA_CS4_ADDR ;8 s5 s. x4 C5 s1 f/ `
internal = 6 ;
0 Z; l) l. C! y9 ^: n5 o) _ E int_flag[1] = 1 ;/ K" a1 H) n1 l+ I
}
+ \, o% D0 h4 J/ [2 W if(GPIOPinIntStatus(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_C) == GPIO_INT_PEND)4 W# |8 ]: g3 N# W0 v
{
$ S e; f+ f; J: _# R GPIOPinIntClear(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_C); //问题是:用仿真器debug,发现程序不能进入这里。
) u4 ]7 Q0 |& a8 h cs_addr = SOC_EMIFA_CS2_ADDR ;
' W2 P3 f' c9 J5 d& d internal = 12 ;6 r/ n& T0 F# \, }* H9 V
int_flag[2] = 1 ;5 W5 C$ T* S0 ~: z8 [1 o
}' r* M# @; w$ n2 y6 k- t6 W" Z
0 ]4 b" C" `5 _- H& r" K
GPIOPinWrite(SOC_GPIO_0_REGS, AD7606_PAR_CONVST, GPIO_PIN_LOW);; M: ?' D4 s* T4 k, ?! o
; k7 v1 b2 X3 f0 J
GPIOBankIntEnable(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_GPIO_BANK);
R, H: T* k; g4 K7 m}
) S% [. x2 ?8 c% _' w3 d, W* W& J
|
|