|
|
您好。使用GPIO中断时,中断能进入ISR,但是不能区分具体的GPIO端口。程序如下:: V* H' O$ |/ s
#define AD7606_PAR_BUSY_GPIO_BANK 5, X$ {8 L- j% t
#define AD7606_PAR_BUSY_GPIO_BANK_INT SYS_INT_GPIO_B5INT( s) i2 y8 a. x! f$ m8 y! I
. T) A& [" Q$ r: J
#define AD7606_PAR_BUSY_V1 GPIO_TO_PIN(5, 11) //BANK5的中断口5.114 R6 W: B& g/ E$ \/ r4 e6 `9 l: j& r, v
#define AD7606_PAR_BUSY_V2 GPIO_TO_PIN(5, 9) //BANK5的中断口5.9
5 |/ C* K' q5 x+ B) b#define AD7606_PAR_BUSY_C GPIO_TO_PIN(5, 5) //BANK5的中断口5.5
! z! r& R" a6 c2 c#define AD7606_PAR_BUSY GPIO_TO_PIN(5, 4)$ p. D9 n" g$ I& {* I% ^
" e3 C5 Z4 J3 ^% b8 S#define AD7606_PAR_CONVST GPIO_TO_PIN(5, 1) Z, A( V2 T& b, b9 A& u t0 r% U
#define AD7606_PAR_RD GPIO_TO_PIN(5, 2)9 n* k7 o- o" g
#define AD7606_PAR_RESET GPIO_TO_PIN(5, 0)
- w( a5 w i* D2 m7 v; G( `) Q( o5 E9 z; i, r
: P1 _- ?. A0 \# w! K8 x( C( D5 S9 a4 A* n% u8 O8 ^
static void ad7606_irq_setup(ad7606 *ad) {
5 Y# L3 x8 I/ R) ?) k& l6 E2 p Hwi_Params hwiParams;6 n8 Q Y& X, }( Y
Hwi_Handle myHwi;
0 v& ^) O# j) C; H3 V5 x Error_Block eb;, U% G8 {4 X+ ~/ d
* X p1 @2 h3 V# ]
Error_init(&eb);
9 F8 k5 b5 ]' k4 T Hwi_Params_init(&hwiParams);/ {5 C( D1 s6 _) _- T, Y6 J
hwiParams.arg = (unsigned int)ad;
9 z1 v% t: [2 k2 N hwiParams.enableInt = FALSE;/ N& S8 `$ I% x/ W8 f
hwiParams.eventId = SYS_INT_GPIO_B5INT;9 R: t! X' e* G
hwiParams.priority = 4;- {9 l N* `. Y" P$ p1 X% S' k. h
myHwi = Hwi_create(8, ad7606_busy_hwi, &hwiParams, &eb); //注册BANK5中断处理函数: a/ [* B2 u2 n% ^/ F. Y) Z
if (myHwi == NULL) ( s- p$ o& D# ~4 y
LOG_FATAL("failed to create hwi");
; L# [7 G$ x1 N
5 A6 O2 B: p) O( g& ~5 B /* enable both interrupts */4 }% P, g8 w- p+ I6 L9 s+ \
Hwi_enableInterrupt(ad->irq_event);
" t% C0 w, w. [% C1 V6 o}! Y# w7 l9 [; ?+ X) ]
$ P& A% w+ x' E
6 ^! N! j6 {6 n# Z- M+ d9 _% U" Q; Dstatic void ad7606_gpio_pinmux_setup(ad7606 *ad) {
$ g2 @& W7 @$ W3 w, X7 [+ C volatile unsigned int savePinMux = 0;
$ m' d6 D9 B, q( W5 R6 H //初始化5.11、5.9 、 5.5为GPIO口8 N8 q ?5 A, i/ K# [- w
savePinMux = HWREG(SOC_SYSCFG_0_REGS + SYSCFG0_PINMUX(11)) & (~(SYSCFG_PINMUX11_PINMUX11_27_24 | SYSCFG_PINMUX11_PINMUX11_19_16));
6 v8 {" W$ Y# O* l. e% f' |* ]! F, t. l0 z8 m3 `+ d
HWREG(SOC_SYSCFG_0_REGS + SYSCFG0_PINMUX(11)) = (PINMUX11_BUSY_V1_ENABLE | PINMUX11_BUSY_V2_ENABLE | savePinMux);
2 _0 t; D; ~+ @( U8 n/ M
" V" |3 m4 Q) ]/ M& ?0 J 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 W) E3 q3 z, h6 v" V8 {9 e
% ` x3 f s/ q! O! \$ |! Y HWREG(SOC_SYSCFG_0_REGS + SYSCFG0_PINMUX(12)) = (PINMUX12_RESET_ENABLE | PINMUX12_CONVST_ENABLE | PINMUX12_RD_ENABLE | PINMUX12_BUSY_C_ENABLE | savePinMux);
% k" z: j. w5 ^% O6 w
4 _4 g3 w* L3 ]4 H4 a} |6 P8 o+ i% |. e& O) c
( S/ S% z& { f6 i r+ |/ p4 P; D1 B8 b
static void ad7606_gpio_setup(ad7606 *ad) {
7 Z4 R) f. A. C Z /*Set the AD7606_PAR_BUSY to the input mode*/
# O5 W, z3 H9 k4 d5 d! H+ B* B //初始化5.11、5.9 、 5.5为中断口7 Z2 O! o! P7 t8 P G6 e, v
GPIODirModeSet(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_V1, GPIO_DIR_INPUT);+ Q# l" d( ~- p1 V1 M
GPIODirModeSet(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_V2, GPIO_DIR_INPUT);6 l7 @8 c# [8 K% ^
GPIODirModeSet(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_C, GPIO_DIR_INPUT);
6 V* ^7 D* d3 w7 l* V# L3 I X //GPIODirModeSet(SOC_GPIO_0_REGS, AD7606_PAR_BUSY, GPIO_DIR_INPUT);
! A3 {3 ], n) S. a4 z /*Set the AD7606_PAR_BUSY to the Falling Edge Interrupt*/2 @5 s: F6 a/ N/ ~5 O* r- x7 y$ R8 u
GPIOIntTypeSet(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_V1, GPIO_INT_TYPE_FALLEDGE);
/ r" R2 E5 a, _ GPIOIntTypeSet(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_V2, GPIO_INT_TYPE_FALLEDGE);. e# D) U* _* S% }: \- K
GPIOIntTypeSet(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_C, GPIO_INT_TYPE_FALLEDGE);% A, n1 B6 E3 j1 z, O% v
//GPIOIntTypeSet(SOC_GPIO_0_REGS, AD7606_PAR_BUSY, GPIO_INT_TYPE_FALLEDGE);7 X7 s# ]- n$ Y# g
/*The interrupt setting allows AD7606_PAR_BUSY_GPIO_BANK*/7 f1 b% y1 ~. M2 h4 u
GPIOBankIntEnable(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_GPIO_BANK);
3 u5 a5 b0 w, s, y
# f/ f8 w/ M; s# g GPIODirModeSet(SOC_GPIO_0_REGS, AD7606_PAR_RESET, GPIO_DIR_OUTPUT);, p4 E* W7 ~/ ?( _
GPIOPinWrite(SOC_GPIO_0_REGS, AD7606_PAR_RESET, GPIO_PIN_HIGH);) {4 m8 D5 B7 L1 f7 h# z* V/ n
Task_sleep(1000);# ^5 r5 D7 T6 C7 W) C5 Q2 D
GPIOPinWrite(SOC_GPIO_0_REGS, AD7606_PAR_RESET, GPIO_PIN_LOW);
9 ?+ d8 z+ z& s6 A# S: A Task_sleep(1000);) B! P3 m. V$ }. ^
- P6 {, t* }/ S /*Set the AD7606_PAR_CONVST to output mode*/4 c" ]% ^( |$ y
GPIODirModeSet(SOC_GPIO_0_REGS, AD7606_PAR_CONVST, GPIO_DIR_OUTPUT);) w. M$ L& n+ l% E5 ]- E
GPIOPinWrite(SOC_GPIO_0_REGS, AD7606_PAR_CONVST, GPIO_PIN_LOW);8 J$ X* j( J" X! m0 j( l- Y2 L
# o+ o2 f! O0 z* i, j, j2 H& M1 L& F3 Z GPIODirModeSet(SOC_GPIO_0_REGS, AD7606_PAR_RD, GPIO_DIR_OUTPUT);
# c% I. {7 P7 x& t% J- X3 F1 j" O; H GPIOPinWrite(SOC_GPIO_0_REGS, AD7606_PAR_RD, GPIO_PIN_HIGH);4 k1 I: S! f$ X. F$ H1 S
( ~ e% ?6 @# J3 o
}
" T$ G" u' t6 T
8 w* C: k f' [' w0 P3 K( g6 ^9 s j& N" o( N2 a& V
static void ad7606_busy_hwi(UArg ad_addr) {
+ I. g0 c3 }/ ^0 s
( B# }/ T& l- n$ I
5 V8 l6 V9 N' P /* Disable the interrupts for pins of bank AD7606_PAR_BUSY in GPIO.*/2 [! b! O/ T' v
GPIOBankIntDisable(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_GPIO_BANK); //用仿真器debug,发现程序能进入这里。8 A' y3 i. v$ `6 J' ^
K0 ~0 B8 t( F1 m; L# g9 M* h
if(GPIOPinIntStatus(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_V1) == GPIO_INT_PEND)
& \' J5 G) |* q: [ {4 { L) j8 Q. I& @
GPIOPinIntClear(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_V1); //问题是:用仿真器debug,发现程序不能进入这里。
+ T; ~) x8 x( w5 ]& Z cs_addr = SOC_EMIFA_CS5_ADDR ;
, u3 |! L G+ w8 V internal = 0 ;9 A' T6 V- K* {3 ?4 |/ z
int_flag[0] = 1 ;
6 h( {9 n0 q( U7 }, a }8 N7 u; |2 H% l- I! F# A
if(GPIOPinIntStatus(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_V2) == GPIO_INT_PEND)
2 `$ X9 D) m5 v, H {- S4 q% q* n& n/ o% Q, N5 E; {
GPIOPinIntClear(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_V2); //问题是:用仿真器debug,发现程序不能进入这里。
9 W* a! p% w6 g( u2 h0 Q; r! ~2 s cs_addr = SOC_EMIFA_CS4_ADDR ;8 R2 b) D/ T7 n. ~7 J( o* x
internal = 6 ;7 ^, X3 r! ^* a. W. @$ o8 B
int_flag[1] = 1 ;+ A) p/ d \3 X$ _
}; e0 F1 E3 ]/ a/ [# T
if(GPIOPinIntStatus(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_C) == GPIO_INT_PEND)
0 U. K9 A; |0 M {; Y7 R& f: i `/ O, H* @6 d
GPIOPinIntClear(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_C); //问题是:用仿真器debug,发现程序不能进入这里。
# T6 p/ ]1 e- @, a cs_addr = SOC_EMIFA_CS2_ADDR ;' U( t- d3 D- s$ O* V. ]" G
internal = 12 ;
; z( Z2 \1 b+ H1 o# w: w- {! p int_flag[2] = 1 ;
+ M, g& s' J3 S, ?4 V- s$ l0 Y }9 D7 \! w# m1 N
. s4 F1 i" [2 I; a- g$ L
GPIOPinWrite(SOC_GPIO_0_REGS, AD7606_PAR_CONVST, GPIO_PIN_LOW);
1 `: v9 `0 c k7 h- U ) P) w: h, Z8 i2 R7 H
GPIOBankIntEnable(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_GPIO_BANK);9 @9 G4 x, t* l1 B5 h
}
( r$ q6 G5 K L# Q* t
1 A9 [& O, O4 k% F |
|