|
您好。使用GPIO中断时,中断能进入ISR,但是不能区分具体的GPIO端口。程序如下:
$ t1 y' L* Z& q! Y#define AD7606_PAR_BUSY_GPIO_BANK 5
, _( E0 G# p( L2 ~# Q U1 E#define AD7606_PAR_BUSY_GPIO_BANK_INT SYS_INT_GPIO_B5INT$ U/ j _, @& |& [
/ u" y5 G5 ?* J& ~, K; S#define AD7606_PAR_BUSY_V1 GPIO_TO_PIN(5, 11) //BANK5的中断口5.11
( o! |5 a2 v' k M* x' h# B#define AD7606_PAR_BUSY_V2 GPIO_TO_PIN(5, 9) //BANK5的中断口5.9
4 X+ p4 i R0 K' D1 h8 P1 g#define AD7606_PAR_BUSY_C GPIO_TO_PIN(5, 5) //BANK5的中断口5.5
O) t2 d5 s, n% q/ {2 l+ U6 _0 [#define AD7606_PAR_BUSY GPIO_TO_PIN(5, 4)/ j2 l0 S4 M8 P. T2 g7 D
: S! g0 Q; P* H8 E0 k9 g
#define AD7606_PAR_CONVST GPIO_TO_PIN(5, 1)
4 K( J; Y3 m" `5 L( ^#define AD7606_PAR_RD GPIO_TO_PIN(5, 2)
: V6 ?! O# t* E H. Z- P0 f' V* N#define AD7606_PAR_RESET GPIO_TO_PIN(5, 0)
* M& r1 x+ y R# m1 J
" d# {0 m7 M) k. ?4 ^4 \0 F" m; m: R. e0 T8 t7 u( ]" V, t5 w, X* I
6 ^* z5 ^2 X* j6 d$ o7 ?9 F
static void ad7606_irq_setup(ad7606 *ad) {2 R+ E3 B# s! r- J# ~. T
Hwi_Params hwiParams;& E% B0 w+ ?; }0 [: S0 v" m
Hwi_Handle myHwi;7 Q) x. D8 ^2 f2 j
Error_Block eb;
; K( K- G$ u8 \+ x1 W4 c) \
9 U+ X0 u5 L% v3 h# |' j7 s- u Error_init(&eb);# q% j+ p9 ^, C7 F
Hwi_Params_init(&hwiParams);# P) g& @$ a" K; U; s
hwiParams.arg = (unsigned int)ad;
: o# I$ t8 S/ m hwiParams.enableInt = FALSE;
1 b6 p/ G6 z3 r/ j7 O; r/ {, _ hwiParams.eventId = SYS_INT_GPIO_B5INT;
( q3 T$ B( L0 ~' w% G hwiParams.priority = 4;
' L# z6 A. b U. P: \" J myHwi = Hwi_create(8, ad7606_busy_hwi, &hwiParams, &eb); //注册BANK5中断处理函数; i% z4 ]' V. n7 t% B z& ]
if (myHwi == NULL)
; v0 ~" R. n0 d+ j( S LOG_FATAL("failed to create hwi");
+ P( V3 w6 i* a7 @# M& v1 ^7 o
7 d @2 v" K* B y- e /* enable both interrupts */
, h9 }. P- l$ J2 ^; }) f Hwi_enableInterrupt(ad->irq_event);) p% f5 A) \, X, h& |
}
9 q2 V% O* H* {4 V9 c. J
* H- ?4 Q8 f! S
' z) D* _1 S* |4 sstatic void ad7606_gpio_pinmux_setup(ad7606 *ad) {# l7 E+ n5 W' x+ T: j- o+ [; r
volatile unsigned int savePinMux = 0;
! z% N6 v& j4 @3 S# c5 c X //初始化5.11、5.9 、 5.5为GPIO口
7 e+ F5 N& m- q! |' W6 w savePinMux = HWREG(SOC_SYSCFG_0_REGS + SYSCFG0_PINMUX(11)) & (~(SYSCFG_PINMUX11_PINMUX11_27_24 | SYSCFG_PINMUX11_PINMUX11_19_16));
& Z5 V% V' z6 h. m( e1 m
7 l# W4 D2 @: B4 S! Y HWREG(SOC_SYSCFG_0_REGS + SYSCFG0_PINMUX(11)) = (PINMUX11_BUSY_V1_ENABLE | PINMUX11_BUSY_V2_ENABLE | savePinMux);) v* @/ ^. M/ f s# ?' h
- E# g' l, z6 d 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));
4 @3 ], L& `. Q3 _% D% c* A3 R
# F: T( A- G, p# w9 D HWREG(SOC_SYSCFG_0_REGS + SYSCFG0_PINMUX(12)) = (PINMUX12_RESET_ENABLE | PINMUX12_CONVST_ENABLE | PINMUX12_RD_ENABLE | PINMUX12_BUSY_C_ENABLE | savePinMux);8 i7 L# o# r) d. i( o& {% d
! [0 o" m; I) ]' {, q D& i
}3 S! b2 A0 o! I- |
8 n; k$ p# X9 f( z- F
2 ^5 N9 B, z, v- }static void ad7606_gpio_setup(ad7606 *ad) {2 j) r6 b0 L) u# u) ~' e! S! f
/*Set the AD7606_PAR_BUSY to the input mode*/
4 g: j1 R$ J% b3 I //初始化5.11、5.9 、 5.5为中断口' X: f: w0 p4 y: Y/ j. x
GPIODirModeSet(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_V1, GPIO_DIR_INPUT);/ ~5 |3 c8 Y1 k# W) F2 |
GPIODirModeSet(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_V2, GPIO_DIR_INPUT);
5 I8 L/ \" Y) ?0 p+ E( S3 M# C GPIODirModeSet(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_C, GPIO_DIR_INPUT);
& m) [/ E* W; j4 V$ _8 } //GPIODirModeSet(SOC_GPIO_0_REGS, AD7606_PAR_BUSY, GPIO_DIR_INPUT);
4 w4 M! F1 }2 s2 @" t /*Set the AD7606_PAR_BUSY to the Falling Edge Interrupt*/
. f1 s, l# s" q GPIOIntTypeSet(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_V1, GPIO_INT_TYPE_FALLEDGE);3 s: i: {4 Y) z& K( H0 m; \
GPIOIntTypeSet(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_V2, GPIO_INT_TYPE_FALLEDGE); W0 @$ L/ e" c. i1 g" s
GPIOIntTypeSet(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_C, GPIO_INT_TYPE_FALLEDGE);
) l' O& i9 Q' ]3 r3 C" d6 I' Q //GPIOIntTypeSet(SOC_GPIO_0_REGS, AD7606_PAR_BUSY, GPIO_INT_TYPE_FALLEDGE);8 v% T7 S2 P) N5 a. J) y
/*The interrupt setting allows AD7606_PAR_BUSY_GPIO_BANK*/5 G% J" i8 q& c% F9 t. q
GPIOBankIntEnable(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_GPIO_BANK);
3 s# R. H" f9 V0 o. C4 i1 }
1 I$ u3 L! u. C( a5 P% O; M9 z GPIODirModeSet(SOC_GPIO_0_REGS, AD7606_PAR_RESET, GPIO_DIR_OUTPUT);
2 P' I' A# J6 ~/ n* D" {5 Z GPIOPinWrite(SOC_GPIO_0_REGS, AD7606_PAR_RESET, GPIO_PIN_HIGH);* i0 Q7 O7 N @7 X9 X8 j7 e) A0 ^
Task_sleep(1000);
' U4 Q% I9 b- T1 K# V# M3 D3 V0 l GPIOPinWrite(SOC_GPIO_0_REGS, AD7606_PAR_RESET, GPIO_PIN_LOW);
: y/ Y5 ~4 N6 i Task_sleep(1000); L: v, D% J. b9 N. o& R3 ?9 R+ l5 ]
" D7 x/ R2 F4 P: ~. c# j
/*Set the AD7606_PAR_CONVST to output mode*/) g4 R( |' a6 a* y4 @4 f1 O
GPIODirModeSet(SOC_GPIO_0_REGS, AD7606_PAR_CONVST, GPIO_DIR_OUTPUT);
, e$ p/ Y6 V( _# `+ H2 o7 y' { GPIOPinWrite(SOC_GPIO_0_REGS, AD7606_PAR_CONVST, GPIO_PIN_LOW);
/ c4 X/ ~3 E6 H' G. F! V! l, j0 A. w) ]* V. s8 j
GPIODirModeSet(SOC_GPIO_0_REGS, AD7606_PAR_RD, GPIO_DIR_OUTPUT);
( K' t# U5 C" U$ ?% w% N GPIOPinWrite(SOC_GPIO_0_REGS, AD7606_PAR_RD, GPIO_PIN_HIGH);; y4 |: D- a! ?' B
! F6 F* D. h) ~
}
* F8 d* A8 F, _1 S& Q3 _
# }# D. d+ W( t( }# [* K3 H& j8 W; W$ [" } e
static void ad7606_busy_hwi(UArg ad_addr) {
$ G: s) v; q2 ]$ j3 b5 C; n' x2 S* k4 B" b0 G1 p# V# E
# K) P6 Y+ Z& A& G3 \, f# u# s. u. Y
/* Disable the interrupts for pins of bank AD7606_PAR_BUSY in GPIO.*// Z: T+ I, W0 h
GPIOBankIntDisable(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_GPIO_BANK); //用仿真器debug,发现程序能进入这里。
# r6 z8 l! U" G6 _6 Y' g" ]) T. w6 s: P; c8 T) }
if(GPIOPinIntStatus(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_V1) == GPIO_INT_PEND)
0 f5 j. V3 N$ i' B {
; m8 `+ w1 t1 \9 _ GPIOPinIntClear(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_V1); //问题是:用仿真器debug,发现程序不能进入这里。$ I$ U; A' g5 ^
cs_addr = SOC_EMIFA_CS5_ADDR ;
2 U c- N v* e* i( g internal = 0 ;
2 d& D8 {2 M. g( Y$ H% ]0 ]$ N int_flag[0] = 1 ;: h) u& z' a8 S+ C# y5 z' m; M
}7 h& u: @1 F( o/ ?
if(GPIOPinIntStatus(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_V2) == GPIO_INT_PEND)
. j: i" @* z- N5 ^ {
) D3 I) u' R: v GPIOPinIntClear(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_V2); //问题是:用仿真器debug,发现程序不能进入这里。
& W4 H) q& Q% g6 m cs_addr = SOC_EMIFA_CS4_ADDR ;
& B% N3 k4 [! R& l: u# G8 f internal = 6 ;
, V. V% j6 d1 z7 h/ ^; H; F7 q$ Y int_flag[1] = 1 ;
! R% G" m: U0 M }
' G" m6 _7 |, c5 M2 \( t ] q if(GPIOPinIntStatus(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_C) == GPIO_INT_PEND)
) P3 e$ p6 f8 B3 m4 i {; Y! v% U( p) {/ P( A# X
GPIOPinIntClear(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_C); //问题是:用仿真器debug,发现程序不能进入这里。$ Z+ u7 T, S; x8 W$ }+ U
cs_addr = SOC_EMIFA_CS2_ADDR ;
6 N5 ?' L6 {9 |- ^+ { internal = 12 ;
6 L: K1 i5 W, y) p+ N# b% G" L int_flag[2] = 1 ;% K) }) h2 y5 S$ m" Z/ y6 j
}2 m/ S" G" B7 ~( n8 l
: k. ]! d. v1 n/ y+ E# W' T
GPIOPinWrite(SOC_GPIO_0_REGS, AD7606_PAR_CONVST, GPIO_PIN_LOW);
+ x& ^8 }2 |: C9 s
4 }) K( q+ W- m6 Z2 T/ p GPIOBankIntEnable(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_GPIO_BANK);5 m: M- c7 j1 K
}! }5 E! N% L: w" a! Z
1 X/ b& F* x4 d
|
|