|
|
您好。使用GPIO中断时,中断能进入ISR,但是不能区分具体的GPIO端口。程序如下:
2 G# [, {; h! U3 n1 Z# l#define AD7606_PAR_BUSY_GPIO_BANK 54 A* }/ S- Z6 m: b! D+ Y l
#define AD7606_PAR_BUSY_GPIO_BANK_INT SYS_INT_GPIO_B5INT
. `' C/ _$ _0 r1 q9 Z0 i
# q: `- C/ m Y3 ]6 i#define AD7606_PAR_BUSY_V1 GPIO_TO_PIN(5, 11) //BANK5的中断口5.11 _- q' E0 e- m# J+ E
#define AD7606_PAR_BUSY_V2 GPIO_TO_PIN(5, 9) //BANK5的中断口5.9
, ~- }- K( @5 K8 C$ D* C4 I# | S#define AD7606_PAR_BUSY_C GPIO_TO_PIN(5, 5) //BANK5的中断口5.5
) N. j/ V) L2 p) z! F0 s#define AD7606_PAR_BUSY GPIO_TO_PIN(5, 4)
4 \/ f/ Z& _: \4 p. }- e- p* U7 b+ ~4 \% c* D# G0 M8 s
#define AD7606_PAR_CONVST GPIO_TO_PIN(5, 1)
$ J! D f* Z1 ?: Z. U% I/ r7 l9 _6 E#define AD7606_PAR_RD GPIO_TO_PIN(5, 2)
8 P. Q; i$ z# `* D#define AD7606_PAR_RESET GPIO_TO_PIN(5, 0)8 p: [$ I+ l) e$ c6 q" g- e1 t7 n0 q
8 z2 n* R; b7 ?3 y- t3 L9 Z9 m$ i6 d; u1 r. Q
1 I( C6 o, i& m/ J/ C9 c1 ]7 L# l+ mstatic void ad7606_irq_setup(ad7606 *ad) {
+ d, P& B3 ^- X3 O, { Hwi_Params hwiParams;
& x, L$ J9 K2 z* R Hwi_Handle myHwi;. U9 Q; T- Q5 I0 `, N
Error_Block eb;# n- ?/ R2 a0 T6 U
! V$ I3 t- C7 h2 V( V2 a' _
Error_init(&eb);. m0 F9 a# k6 v1 z: J6 m% b
Hwi_Params_init(&hwiParams);
1 i0 W$ m9 k* u4 P5 \ hwiParams.arg = (unsigned int)ad;0 w1 s/ o4 c$ R& X+ V+ J& ^2 B$ L
hwiParams.enableInt = FALSE;
v/ z; y+ J' K6 b4 [5 A/ ^ hwiParams.eventId = SYS_INT_GPIO_B5INT;
* ^# P( t% ?6 ^9 ?/ ~4 x hwiParams.priority = 4;1 t4 W! K8 F9 n% T1 ~* V# w
myHwi = Hwi_create(8, ad7606_busy_hwi, &hwiParams, &eb); //注册BANK5中断处理函数
8 `! a0 Z" X$ f0 x7 G if (myHwi == NULL)
, z- H( _8 H, j7 B0 |& U LOG_FATAL("failed to create hwi");# ] N; v2 v& i
. R, C* i* g, w6 m8 q( ] /* enable both interrupts */
7 g; t2 `( y5 J3 l: \6 s& u Hwi_enableInterrupt(ad->irq_event);
3 y0 @. a/ x' Y8 W}
8 p' `' J- t) r& ^! S# E: B' O3 C, e1 c/ z: `- A7 U
8 Z) D H8 z& @0 X* f3 v1 A4 ystatic void ad7606_gpio_pinmux_setup(ad7606 *ad) {
$ v K. e% P8 H volatile unsigned int savePinMux = 0;
& F0 ]5 O) d! z //初始化5.11、5.9 、 5.5为GPIO口; }! W4 m o( I( L* ?- a1 s
savePinMux = HWREG(SOC_SYSCFG_0_REGS + SYSCFG0_PINMUX(11)) & (~(SYSCFG_PINMUX11_PINMUX11_27_24 | SYSCFG_PINMUX11_PINMUX11_19_16));
# a$ i6 K! c3 ^' m, W& U, M8 J+ V# g9 e. Y
HWREG(SOC_SYSCFG_0_REGS + SYSCFG0_PINMUX(11)) = (PINMUX11_BUSY_V1_ENABLE | PINMUX11_BUSY_V2_ENABLE | savePinMux);
' C0 A ?( _8 s0 M1 L2 |3 m/ o* a# j9 \
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, Q8 k$ v. J5 S& c K
" [0 z( i. Y* Z. p( P
HWREG(SOC_SYSCFG_0_REGS + SYSCFG0_PINMUX(12)) = (PINMUX12_RESET_ENABLE | PINMUX12_CONVST_ENABLE | PINMUX12_RD_ENABLE | PINMUX12_BUSY_C_ENABLE | savePinMux);! t* s8 f. {9 k J; _! j( p. }
3 t1 W- V& D$ E3 F1 n; S( a# \' ~
}" O) T2 ^1 p) q) d/ e
+ |& l a9 S; F. N. F, X6 x/ c
. g! O7 C! r$ ?
static void ad7606_gpio_setup(ad7606 *ad) {5 A' Z& P, ]3 k
/*Set the AD7606_PAR_BUSY to the input mode*/& f y, }& H0 P* N: U2 s! R) L$ h. w
//初始化5.11、5.9 、 5.5为中断口7 w* y3 s, r0 h+ y! y
GPIODirModeSet(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_V1, GPIO_DIR_INPUT);
( x$ K9 `# b0 q |& L GPIODirModeSet(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_V2, GPIO_DIR_INPUT);/ M A3 ]7 g1 z7 R5 F
GPIODirModeSet(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_C, GPIO_DIR_INPUT);
% q6 ?8 v1 [% ?0 A# `7 F //GPIODirModeSet(SOC_GPIO_0_REGS, AD7606_PAR_BUSY, GPIO_DIR_INPUT);
' c/ y0 o( x7 X /*Set the AD7606_PAR_BUSY to the Falling Edge Interrupt*/
" ~1 ]3 F# I8 P# ?* N/ w/ ^ GPIOIntTypeSet(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_V1, GPIO_INT_TYPE_FALLEDGE);
! G$ j! L8 B2 Z3 _- c! l: s: P GPIOIntTypeSet(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_V2, GPIO_INT_TYPE_FALLEDGE);
! {5 Q/ ]) b$ N0 v' Y5 u- R6 K GPIOIntTypeSet(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_C, GPIO_INT_TYPE_FALLEDGE);& v& M+ a. ]8 s) p2 M" G$ X# T
//GPIOIntTypeSet(SOC_GPIO_0_REGS, AD7606_PAR_BUSY, GPIO_INT_TYPE_FALLEDGE);% ]/ l' M8 g- c9 g: H
/*The interrupt setting allows AD7606_PAR_BUSY_GPIO_BANK*/
! j+ M/ E* D) a; Q GPIOBankIntEnable(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_GPIO_BANK);5 {6 J$ C7 N) x- ~* F
" I# d3 c) P4 _8 B* ~1 P GPIODirModeSet(SOC_GPIO_0_REGS, AD7606_PAR_RESET, GPIO_DIR_OUTPUT); x! s* ~, B, T( S/ L, U
GPIOPinWrite(SOC_GPIO_0_REGS, AD7606_PAR_RESET, GPIO_PIN_HIGH);% u) I. l/ k' r1 c
Task_sleep(1000);
: J4 \4 q' d( _5 E" ] GPIOPinWrite(SOC_GPIO_0_REGS, AD7606_PAR_RESET, GPIO_PIN_LOW);
7 {( Z5 t" g( U% g Task_sleep(1000);" q! ?3 ~1 a$ f" P: ~+ a! S
( P0 ?: D2 D. F7 U
/*Set the AD7606_PAR_CONVST to output mode*/
0 J3 j! Y$ U3 ]5 j+ P" c8 ]4 `7 b- g0 ~9 ] GPIODirModeSet(SOC_GPIO_0_REGS, AD7606_PAR_CONVST, GPIO_DIR_OUTPUT);9 y/ t* O- m( d" k3 O* V2 m
GPIOPinWrite(SOC_GPIO_0_REGS, AD7606_PAR_CONVST, GPIO_PIN_LOW);2 r0 O5 R% g n3 [# f
. H( T% V* m' m
GPIODirModeSet(SOC_GPIO_0_REGS, AD7606_PAR_RD, GPIO_DIR_OUTPUT);
9 B& N3 v% N! \5 p& J7 k$ l/ @ GPIOPinWrite(SOC_GPIO_0_REGS, AD7606_PAR_RD, GPIO_PIN_HIGH);! N9 S/ s9 t E" ^* y
0 o- d# `& x! ~2 @ J* ~8 R
}9 i, m' j& q T) V3 R0 c9 M
) l- b5 H6 P- `- K5 m. L6 h8 l- L
: a3 C. G/ M m4 T& P% Astatic void ad7606_busy_hwi(UArg ad_addr) {
+ ]% s2 r% n/ C" X6 ]
: S1 Q- V4 P3 L$ K% w2 w$ u' h+ o! f {7 ^
/* Disable the interrupts for pins of bank AD7606_PAR_BUSY in GPIO.*/- t) A! g; G& k- `1 i5 Z7 N% P
GPIOBankIntDisable(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_GPIO_BANK); //用仿真器debug,发现程序能进入这里。
) b' J' w" P6 X; ?5 r; I- }/ z+ G( u, @' ^# x/ j/ H/ S0 y
if(GPIOPinIntStatus(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_V1) == GPIO_INT_PEND)
/ ^# o6 C9 v/ {; L: N" I {
; r5 x3 u6 l# ^+ S GPIOPinIntClear(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_V1); //问题是:用仿真器debug,发现程序不能进入这里。% b+ s" j) C' b% {& n& O& h
cs_addr = SOC_EMIFA_CS5_ADDR ;
; X# }) `) M- n+ J6 o1 P9 P internal = 0 ;, y( y+ b& e: s: F& r3 o x
int_flag[0] = 1 ;
9 ^- U$ c4 P% [4 y }
$ [6 g: ?0 [# D4 n1 A z5 I if(GPIOPinIntStatus(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_V2) == GPIO_INT_PEND)
( g% D( K$ |7 D( @$ o! N {; B* J s' D1 {: x n! r* O
GPIOPinIntClear(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_V2); //问题是:用仿真器debug,发现程序不能进入这里。
5 I- I8 W# s9 _9 f* V cs_addr = SOC_EMIFA_CS4_ADDR ;1 Q+ ]! @, Z4 _. ^( V
internal = 6 ;
e) y& |% k& X( e) h/ r# ~ int_flag[1] = 1 ;
y6 t+ M4 |% R% |" E2 b- ] }1 w5 G- f. u7 Q( b
if(GPIOPinIntStatus(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_C) == GPIO_INT_PEND)- N: J% T# k, m3 q) n
{ U! |) o8 n& Z
GPIOPinIntClear(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_C); //问题是:用仿真器debug,发现程序不能进入这里。- B; ^1 m8 i6 p6 N' o c
cs_addr = SOC_EMIFA_CS2_ADDR ;
& r8 b1 n, p3 h! O5 ~* O' M8 p internal = 12 ;
' f9 l( L# b8 n, p. o int_flag[2] = 1 ;
" E* y3 r1 A$ [& ] }
- F i* k3 w2 b2 G: e- W6 }" R, e
* B) d& }: v$ `: j GPIOPinWrite(SOC_GPIO_0_REGS, AD7606_PAR_CONVST, GPIO_PIN_LOW);! i, E8 `% y! T& u) ]5 V' Q) p" i
4 O' r1 T* s6 j2 j, w GPIOBankIntEnable(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_GPIO_BANK);: @- n$ r1 D8 y2 T1 Q
}
3 z3 y6 ]) C2 U* R( `. r* |. r/ ^ B0 a* y% b! W+ Y; P
|
|