|
您好。使用GPIO中断时,中断能进入ISR,但是不能区分具体的GPIO端口。程序如下:
8 B0 A; n1 F1 q7 ]* A1 u, P% y; k#define AD7606_PAR_BUSY_GPIO_BANK 5
9 [, m- E) m% {0 G+ g$ j# Q' x0 {#define AD7606_PAR_BUSY_GPIO_BANK_INT SYS_INT_GPIO_B5INT
( v, L/ G7 p3 D4 S _8 X( C
' f/ F! ?( ^4 `9 b; j#define AD7606_PAR_BUSY_V1 GPIO_TO_PIN(5, 11) //BANK5的中断口5.11
2 G _ }/ y) m6 S' x! |2 ]9 R#define AD7606_PAR_BUSY_V2 GPIO_TO_PIN(5, 9) //BANK5的中断口5.9) P. z) \5 ~* _4 R5 P/ @
#define AD7606_PAR_BUSY_C GPIO_TO_PIN(5, 5) //BANK5的中断口5.5+ M7 @& c. g3 B# X5 [
#define AD7606_PAR_BUSY GPIO_TO_PIN(5, 4)
% I$ d7 O" \1 X2 `- n8 a. I0 S$ [6 }, v' f" c; h4 u
#define AD7606_PAR_CONVST GPIO_TO_PIN(5, 1)7 p# l! e/ A L7 W
#define AD7606_PAR_RD GPIO_TO_PIN(5, 2)- {: C, h: M0 q# m
#define AD7606_PAR_RESET GPIO_TO_PIN(5, 0)9 P' T1 D: p! A
9 `9 E: w' W% m' R- {* C' V# B; u& e' g* N
' X% b5 G" g, ?* D6 nstatic void ad7606_irq_setup(ad7606 *ad) {, I# j# h# T, R( e% U( R" A
Hwi_Params hwiParams;
, q4 c8 e+ }+ E0 s- E Hwi_Handle myHwi;) T* o+ |" ?" M: w5 ~2 }
Error_Block eb;
1 Y/ y' }, A# j0 {% n: g0 {8 ]9 z3 ~0 l4 y' L
Error_init(&eb);" Z% ?+ N1 m% f9 W+ b$ c9 O
Hwi_Params_init(&hwiParams);# P) j, s7 c: c ^! q# L5 A
hwiParams.arg = (unsigned int)ad;; T; d. j# _' o! a. M3 v/ p4 X, L
hwiParams.enableInt = FALSE;+ r. M5 G$ R# x$ h
hwiParams.eventId = SYS_INT_GPIO_B5INT;
2 S7 n* |! e7 _. I hwiParams.priority = 4;
* E! N9 Q4 D: m; k- }- ~" ? myHwi = Hwi_create(8, ad7606_busy_hwi, &hwiParams, &eb); //注册BANK5中断处理函数4 ?5 e+ v' D9 m' d
if (myHwi == NULL)
% `2 ]7 }+ U, A/ N9 j9 [ LOG_FATAL("failed to create hwi");
! F% M7 i5 B+ Y% w4 c" z. ~9 m8 S5 c& y/ G& _, ~$ V3 v
/* enable both interrupts */( X+ c8 D! u. d& c
Hwi_enableInterrupt(ad->irq_event);( r7 P9 N7 _5 F3 O# W
}, R. o) R& A1 M
3 ^8 p& g3 {, P1 A& g8 s6 M) |& j. E; S& I O, p7 _' X0 N0 K, U
static void ad7606_gpio_pinmux_setup(ad7606 *ad) {
& e3 X/ J: `, g2 f' l4 } volatile unsigned int savePinMux = 0;
, y% O8 V, x( b, `0 `) ? //初始化5.11、5.9 、 5.5为GPIO口
/ u) k- a. P# c/ B1 O7 k savePinMux = HWREG(SOC_SYSCFG_0_REGS + SYSCFG0_PINMUX(11)) & (~(SYSCFG_PINMUX11_PINMUX11_27_24 | SYSCFG_PINMUX11_PINMUX11_19_16));; v2 c/ ~% Q3 p+ J- F+ v" i
. y$ Q- b# A$ a8 O) G3 Z6 b7 Z' ^
HWREG(SOC_SYSCFG_0_REGS + SYSCFG0_PINMUX(11)) = (PINMUX11_BUSY_V1_ENABLE | PINMUX11_BUSY_V2_ENABLE | savePinMux);6 m A* x5 N4 ?! n1 i4 J
6 _1 o& }* k& B* p0 [, c, c 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));
$ \8 E6 D; S( H p. v! ?5 p$ Q! J3 U
, R! H+ f8 D& ^- R HWREG(SOC_SYSCFG_0_REGS + SYSCFG0_PINMUX(12)) = (PINMUX12_RESET_ENABLE | PINMUX12_CONVST_ENABLE | PINMUX12_RD_ENABLE | PINMUX12_BUSY_C_ENABLE | savePinMux);
9 d" S7 O [/ Y% p& }
) \7 ~0 Q& _& K}
: a" V% m: s4 y( r: K, o+ l3 |: u2 ?2 f$ _
' g( G% ~! K2 L! w8 h" w6 g; D
static void ad7606_gpio_setup(ad7606 *ad) {
6 J7 q& N. M I) P+ U8 g0 y/ M! V /*Set the AD7606_PAR_BUSY to the input mode*/3 d/ C, r8 m6 G' r! a! z$ h4 Q5 E
//初始化5.11、5.9 、 5.5为中断口
: @4 s/ Q" U& n3 ~ GPIODirModeSet(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_V1, GPIO_DIR_INPUT);
9 d) N @ d3 ~# f1 ^8 p6 O' v% m GPIODirModeSet(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_V2, GPIO_DIR_INPUT);' h. ^5 u j! H- Q4 G' Q l
GPIODirModeSet(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_C, GPIO_DIR_INPUT);
$ z8 h; A* v# l //GPIODirModeSet(SOC_GPIO_0_REGS, AD7606_PAR_BUSY, GPIO_DIR_INPUT);2 h* z/ u& M7 c) C
/*Set the AD7606_PAR_BUSY to the Falling Edge Interrupt*/1 \5 }5 I1 c9 H" `% _; }
GPIOIntTypeSet(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_V1, GPIO_INT_TYPE_FALLEDGE);/ |8 h. {/ I+ j: n& c7 `; D# B
GPIOIntTypeSet(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_V2, GPIO_INT_TYPE_FALLEDGE);
% { ^9 ?" r/ D3 s GPIOIntTypeSet(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_C, GPIO_INT_TYPE_FALLEDGE);3 o& P/ }* y* w) H7 K! D
//GPIOIntTypeSet(SOC_GPIO_0_REGS, AD7606_PAR_BUSY, GPIO_INT_TYPE_FALLEDGE);& S, c$ F9 h: ?0 u( `3 f" t7 Q5 h3 T
/*The interrupt setting allows AD7606_PAR_BUSY_GPIO_BANK*/
8 g3 W# @, ^7 h. j. R8 m5 f GPIOBankIntEnable(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_GPIO_BANK);" u h0 J. ~7 w( U P2 {
" R% p: c8 U# M( D2 R9 H
GPIODirModeSet(SOC_GPIO_0_REGS, AD7606_PAR_RESET, GPIO_DIR_OUTPUT);0 O1 b2 F) J" j! F9 G! l2 s
GPIOPinWrite(SOC_GPIO_0_REGS, AD7606_PAR_RESET, GPIO_PIN_HIGH);
1 |9 i- y3 W- u* X" g8 ? Task_sleep(1000);
4 [( h. {: g8 o) ^" U GPIOPinWrite(SOC_GPIO_0_REGS, AD7606_PAR_RESET, GPIO_PIN_LOW);
2 q/ e7 I7 j& X, e1 v7 W* t Task_sleep(1000);
3 D" D" T2 c9 b- ^4 x/ \: j0 y! w; K3 R4 D
/*Set the AD7606_PAR_CONVST to output mode*/9 T, o% ]7 ?* k/ m, N7 a
GPIODirModeSet(SOC_GPIO_0_REGS, AD7606_PAR_CONVST, GPIO_DIR_OUTPUT);
9 t: y. k% l- S# z8 {- G( K6 y GPIOPinWrite(SOC_GPIO_0_REGS, AD7606_PAR_CONVST, GPIO_PIN_LOW);
9 `% e/ P8 U6 b& m7 ]7 @* r. z" Q0 \7 x- L T- B& s1 v9 y# g- X# |
GPIODirModeSet(SOC_GPIO_0_REGS, AD7606_PAR_RD, GPIO_DIR_OUTPUT);$ J7 K0 y, x- I% h: K+ L5 E
GPIOPinWrite(SOC_GPIO_0_REGS, AD7606_PAR_RD, GPIO_PIN_HIGH);
- i7 F7 `% B( k3 n$ z( D
! H5 g6 J) n0 o. \# ]# U}
' k) ^* T3 J; q7 m9 y$ \3 M5 v, g" m g/ p7 _( Z5 G
6 e6 ?4 ]: {4 g8 i5 g
static void ad7606_busy_hwi(UArg ad_addr) {8 H5 H I* ^; q" D
# n6 V" X: }& I* M; p' A+ h6 x# x0 C4 w# Y
/* Disable the interrupts for pins of bank AD7606_PAR_BUSY in GPIO.*/
6 ?' Z2 m' C6 X* ~ GPIOBankIntDisable(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_GPIO_BANK); //用仿真器debug,发现程序能进入这里。
7 J2 G* ?# A/ ~% G; L u C% G9 \3 F* _ D" ]- @
if(GPIOPinIntStatus(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_V1) == GPIO_INT_PEND)
; \7 \4 _, b. z! g B* w4 D { @, n( g/ I3 p( _: E
GPIOPinIntClear(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_V1); //问题是:用仿真器debug,发现程序不能进入这里。
. Z( A2 y4 M+ n cs_addr = SOC_EMIFA_CS5_ADDR ;
) b# W* P: w" H! ~; h5 [ internal = 0 ;' B; H5 l% `0 l) L7 M9 q9 l; l8 i
int_flag[0] = 1 ;4 A' H- v0 y* ?
}" S' n! K; y/ Z4 Y; l
if(GPIOPinIntStatus(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_V2) == GPIO_INT_PEND)
; l2 M- Y5 d: p5 c {9 b" R0 q* d8 {4 k" a: {6 {
GPIOPinIntClear(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_V2); //问题是:用仿真器debug,发现程序不能进入这里。! W* g' K+ u! Y4 o9 q- C
cs_addr = SOC_EMIFA_CS4_ADDR ;
! J7 \! y* P* X$ ?3 u internal = 6 ;+ t, m M0 h! n) W4 m I, \
int_flag[1] = 1 ;& R0 t7 _- [, w8 d g* ~) Y% u
}
' \3 O4 f5 c, F/ [3 G" `2 f: Q if(GPIOPinIntStatus(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_C) == GPIO_INT_PEND)
4 N% E8 _6 P- Y, ?1 f' A0 z {
3 t0 F# v% l/ [% l8 Q GPIOPinIntClear(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_C); //问题是:用仿真器debug,发现程序不能进入这里。! x2 J# u- i: T$ L, }
cs_addr = SOC_EMIFA_CS2_ADDR ;
* u" k' Q7 L/ ~* U$ a internal = 12 ;
1 s: f) b F( V7 x/ D int_flag[2] = 1 ;* p" R) l0 j0 V/ P7 z9 ?; Q
}
7 i. Z J) i- r4 N5 v8 R 5 M, z3 S% T X0 _; O5 ^
GPIOPinWrite(SOC_GPIO_0_REGS, AD7606_PAR_CONVST, GPIO_PIN_LOW);2 g7 [) f: G( o% ?$ |+ k& m5 |+ _
- b3 Q" r, b' d( { GPIOBankIntEnable(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_GPIO_BANK);1 p2 S$ ]) [- i# h2 u8 n
}
! {3 N6 T9 p) z& e: X- k U% Q w7 w9 @( ~4 e
|
|