|
|
您好。使用GPIO中断时,中断能进入ISR,但是不能区分具体的GPIO端口。程序如下:
5 c" M; W- u8 \2 V6 ]5 X#define AD7606_PAR_BUSY_GPIO_BANK 54 b2 I0 Z3 K9 `
#define AD7606_PAR_BUSY_GPIO_BANK_INT SYS_INT_GPIO_B5INT; [8 [! a; E9 x" F, G
" s; k5 ~9 B& ~+ a n( s- \ U#define AD7606_PAR_BUSY_V1 GPIO_TO_PIN(5, 11) //BANK5的中断口5.11
. {8 K" _6 i3 r. M: T#define AD7606_PAR_BUSY_V2 GPIO_TO_PIN(5, 9) //BANK5的中断口5.9' [" _6 n- @; u" @* g% ?7 z
#define AD7606_PAR_BUSY_C GPIO_TO_PIN(5, 5) //BANK5的中断口5.58 I# W& B* Y' X0 d! b4 |
#define AD7606_PAR_BUSY GPIO_TO_PIN(5, 4)
& g' q/ x I+ R8 A5 m
: Z @% \2 l7 |$ ^9 F6 t+ _5 w#define AD7606_PAR_CONVST GPIO_TO_PIN(5, 1)
3 }3 c; j2 S% b+ b) f#define AD7606_PAR_RD GPIO_TO_PIN(5, 2). z0 s; E' U- A# p0 q$ ]
#define AD7606_PAR_RESET GPIO_TO_PIN(5, 0)/ N* h- n7 R+ L6 u4 U5 q p$ n
: C- `5 m# ]) v9 @! P- m7 u T
! ]- z' _4 \" ]/ o+ B2 m
/ y& F; M' q. @6 Y7 y2 Wstatic void ad7606_irq_setup(ad7606 *ad) {
5 i4 D; I, G9 O9 P Hwi_Params hwiParams;9 }& c& B( V. K" y) A
Hwi_Handle myHwi;) j9 r& n6 O7 R3 L
Error_Block eb;
" }3 f' Z4 [6 K2 \' ?' k. h& x
Error_init(&eb);# f# z. U! L U8 A4 b, D
Hwi_Params_init(&hwiParams);
8 K5 u) B, V/ v: U, T2 ?2 L hwiParams.arg = (unsigned int)ad;
' _1 K3 {) k5 ^- X6 V) b+ A; g/ E5 ? hwiParams.enableInt = FALSE;
; L9 H. p% k5 y0 k+ y hwiParams.eventId = SYS_INT_GPIO_B5INT;& V5 u9 L4 O! ]( M5 n! `
hwiParams.priority = 4;5 U: `1 H* Z2 [3 t* |1 l" I
myHwi = Hwi_create(8, ad7606_busy_hwi, &hwiParams, &eb); //注册BANK5中断处理函数/ n' _5 D2 \4 n2 r- K# t# U9 L# D
if (myHwi == NULL)
9 K1 x7 @8 ?7 T0 M1 n LOG_FATAL("failed to create hwi");. c% D* M0 D' N( l
9 l$ O, f+ R. r3 X3 G& M+ y! c /* enable both interrupts */
+ ~1 Y8 a$ ]' f. r. s Hwi_enableInterrupt(ad->irq_event);
2 V8 _ k& }& Y7 T0 W} D7 _; G6 ~' d1 u$ Q1 ^. W# I
% x7 O7 f% r1 A' C4 I$ ]4 E
4 R j( L- M' G/ U5 Tstatic void ad7606_gpio_pinmux_setup(ad7606 *ad) {
7 k; ]5 z# t0 d3 f. X0 I8 B+ M volatile unsigned int savePinMux = 0;
9 |% e) F9 W/ g8 D5 J //初始化5.11、5.9 、 5.5为GPIO口
( ~' z( d, P" }) y* i+ p% _ savePinMux = HWREG(SOC_SYSCFG_0_REGS + SYSCFG0_PINMUX(11)) & (~(SYSCFG_PINMUX11_PINMUX11_27_24 | SYSCFG_PINMUX11_PINMUX11_19_16));' }9 w+ F$ W; n3 _
2 U" G$ l9 _5 G" b2 T
HWREG(SOC_SYSCFG_0_REGS + SYSCFG0_PINMUX(11)) = (PINMUX11_BUSY_V1_ENABLE | PINMUX11_BUSY_V2_ENABLE | savePinMux);$ X3 ^' j* V. N3 f. T) d4 v6 Z2 W
7 \0 \* p6 H. G. F 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));% d5 p$ ^2 u( B' y
2 W# \% x( t1 m% h9 b1 t% b HWREG(SOC_SYSCFG_0_REGS + SYSCFG0_PINMUX(12)) = (PINMUX12_RESET_ENABLE | PINMUX12_CONVST_ENABLE | PINMUX12_RD_ENABLE | PINMUX12_BUSY_C_ENABLE | savePinMux);
" E8 S' V# z& y. Z: R6 k' U1 R ^% D5 ?) L% U, ~2 S
}
3 v* S: U: C5 P" R
4 u1 {- V2 d1 D$ k
# {1 G% I; `1 T1 t2 f- L! q! Sstatic void ad7606_gpio_setup(ad7606 *ad) {& ]. c7 y g: \6 l! H
/*Set the AD7606_PAR_BUSY to the input mode*/
" h( }, B. Y, U0 h- f! h2 Y" o //初始化5.11、5.9 、 5.5为中断口, V: s; y2 R c/ y- l% _
GPIODirModeSet(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_V1, GPIO_DIR_INPUT);7 B& X2 p% n) X- h* C1 ~
GPIODirModeSet(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_V2, GPIO_DIR_INPUT);$ c) E+ b. R5 Y8 }. q: {
GPIODirModeSet(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_C, GPIO_DIR_INPUT);
9 ^2 k7 j- ^; F. I$ N //GPIODirModeSet(SOC_GPIO_0_REGS, AD7606_PAR_BUSY, GPIO_DIR_INPUT);. X' k3 o4 A7 m
/*Set the AD7606_PAR_BUSY to the Falling Edge Interrupt*/
8 G* ?7 N! a7 }1 I, ?# `2 ? GPIOIntTypeSet(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_V1, GPIO_INT_TYPE_FALLEDGE);
' Q1 r1 d# B" I. b# ^' K GPIOIntTypeSet(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_V2, GPIO_INT_TYPE_FALLEDGE);# x- {! |) T) m4 f, v2 x
GPIOIntTypeSet(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_C, GPIO_INT_TYPE_FALLEDGE);# u7 K( `/ Q- t& J2 Z" z
//GPIOIntTypeSet(SOC_GPIO_0_REGS, AD7606_PAR_BUSY, GPIO_INT_TYPE_FALLEDGE);' ]5 p! P7 p# m# m0 i: D/ h6 W
/*The interrupt setting allows AD7606_PAR_BUSY_GPIO_BANK*/9 z7 B" q, h1 K9 F% k# w2 `
GPIOBankIntEnable(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_GPIO_BANK);+ v: k5 D( u! @/ z: ^' y6 T3 U
# e1 \. v* h; S0 E/ `
GPIODirModeSet(SOC_GPIO_0_REGS, AD7606_PAR_RESET, GPIO_DIR_OUTPUT);: p, R* u+ ]: P( P+ L& c- `
GPIOPinWrite(SOC_GPIO_0_REGS, AD7606_PAR_RESET, GPIO_PIN_HIGH);
7 `) m# m, [7 w6 J2 x2 [1 u Task_sleep(1000);0 ~7 C Q# P8 r5 j9 J3 [" S$ X. y, O
GPIOPinWrite(SOC_GPIO_0_REGS, AD7606_PAR_RESET, GPIO_PIN_LOW);$ q- M# p' V. a& R* B7 R
Task_sleep(1000);
* }' _0 y: _* W" T X- {; A, J
/*Set the AD7606_PAR_CONVST to output mode*/
0 H* S* r9 |1 ^ u) U0 \ GPIODirModeSet(SOC_GPIO_0_REGS, AD7606_PAR_CONVST, GPIO_DIR_OUTPUT);
' [9 |: k2 @. t V GPIOPinWrite(SOC_GPIO_0_REGS, AD7606_PAR_CONVST, GPIO_PIN_LOW);
) M. B& k4 A& n- n
' t1 K* s4 }, g% b, p GPIODirModeSet(SOC_GPIO_0_REGS, AD7606_PAR_RD, GPIO_DIR_OUTPUT);
( c1 w R% X7 G& T GPIOPinWrite(SOC_GPIO_0_REGS, AD7606_PAR_RD, GPIO_PIN_HIGH);. n& D7 M+ r( q( s# p$ S+ u& e
5 D7 V5 R' W3 r% ~3 }' h9 a
}
9 G% Z2 b. K& e' L6 @0 F1 ]" _ ]! H& V
" W9 \8 P# B* p. D* mstatic void ad7606_busy_hwi(UArg ad_addr) {
" |2 R V ^6 j } C/ `( Q0 A8 s0 v- A5 k/ f, T
: k& ~8 p, M- n /* Disable the interrupts for pins of bank AD7606_PAR_BUSY in GPIO.*/8 W+ j0 y% |+ J& F4 m# o# n
GPIOBankIntDisable(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_GPIO_BANK); //用仿真器debug,发现程序能进入这里。 f! y" j; K' C. c% s4 f9 \7 A
* {$ \/ M# W2 C# q& I' ~9 U; C; n if(GPIOPinIntStatus(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_V1) == GPIO_INT_PEND)
& B) N, m( g% z {
# }$ k0 H/ B% v' A1 Z8 a) Q GPIOPinIntClear(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_V1); //问题是:用仿真器debug,发现程序不能进入这里。. y7 |; k" a( `/ I2 M! d, B
cs_addr = SOC_EMIFA_CS5_ADDR ;
/ Q* @4 `; R- ]4 i& I } internal = 0 ;/ D6 Q6 N" v P; h- N+ t/ `% d+ @( |, |
int_flag[0] = 1 ;
5 l. f' p2 }& t7 O% d- \ }+ E$ z* r# n, M' v; e! N5 U
if(GPIOPinIntStatus(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_V2) == GPIO_INT_PEND)" i! q3 k) z- c, U& o
{. j0 I" T! N+ ~2 o- ^
GPIOPinIntClear(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_V2); //问题是:用仿真器debug,发现程序不能进入这里。
7 J' ]. @) _) ^. S cs_addr = SOC_EMIFA_CS4_ADDR ;2 [2 k+ P% ]0 Y7 U& \2 z
internal = 6 ;
6 ]. o1 Z0 K0 X1 a4 z. R- M6 V int_flag[1] = 1 ;9 P0 G6 E- x9 a! Q" \) U( N
}
! L0 `3 [5 _/ V2 J9 {- E) k if(GPIOPinIntStatus(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_C) == GPIO_INT_PEND)
/ V" {7 c& c. f, \' Q/ i {
% P) L- ]1 B# U# c/ G GPIOPinIntClear(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_C); //问题是:用仿真器debug,发现程序不能进入这里。2 q n0 m! w; ?8 k7 d
cs_addr = SOC_EMIFA_CS2_ADDR ;! C a8 b9 ~7 }) f8 ?& S) `
internal = 12 ;, G) v, G8 r3 y! s6 K
int_flag[2] = 1 ;3 V% `# W; m$ K) A0 a; t
}/ J( s7 A }: T, y& p. e+ f
# N8 [7 E- V( _0 D) S GPIOPinWrite(SOC_GPIO_0_REGS, AD7606_PAR_CONVST, GPIO_PIN_LOW);7 z; x! H( P1 G1 Z
6 v7 b, b! R! \% L; `' [ GPIOBankIntEnable(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_GPIO_BANK);
, F# A. g5 t! K: S' V6 ^8 ~}* S+ k( ?% ~& Y" P0 t
0 L- `, N5 Z2 y3 z5 [* _5 K |
|