|
您好。使用GPIO中断时,中断能进入ISR,但是不能区分具体的GPIO端口。程序如下:8 p8 i# r2 i; y; U0 Y& r
#define AD7606_PAR_BUSY_GPIO_BANK 5
# o& I' c0 G1 S% o8 n4 M#define AD7606_PAR_BUSY_GPIO_BANK_INT SYS_INT_GPIO_B5INT
% I- B& f3 ?" k1 M+ b6 J
7 A( y5 {& R! R/ Q#define AD7606_PAR_BUSY_V1 GPIO_TO_PIN(5, 11) //BANK5的中断口5.11
: o- c/ h. C' K) \! |2 `#define AD7606_PAR_BUSY_V2 GPIO_TO_PIN(5, 9) //BANK5的中断口5.9
1 P! ?6 r) p, n9 d#define AD7606_PAR_BUSY_C GPIO_TO_PIN(5, 5) //BANK5的中断口5.5
1 n* R7 P/ Y4 V#define AD7606_PAR_BUSY GPIO_TO_PIN(5, 4)' v( p1 g8 w% _) v( w9 g
$ X( l/ y5 t, U
#define AD7606_PAR_CONVST GPIO_TO_PIN(5, 1)% ?: O, l) G* a$ j" f& `5 r
#define AD7606_PAR_RD GPIO_TO_PIN(5, 2)
1 H7 k) Z+ o2 b. s+ r5 u5 O8 R5 r#define AD7606_PAR_RESET GPIO_TO_PIN(5, 0)
( A2 R4 O* V7 \% u7 Z
2 G& g+ D+ q- k& N3 s _
* q* N P6 ]3 Y5 N) i7 J( ]5 Q- i* x! } o _7 z
static void ad7606_irq_setup(ad7606 *ad) {
6 Z# u# t8 ]" t5 M5 w+ Z. Q; H O6 z( h Hwi_Params hwiParams;4 i# P0 I; y" l% }" |7 F
Hwi_Handle myHwi;3 u: t2 ]; Z) C
Error_Block eb;
; f! l) a+ h$ n2 [) O
+ i% f% i) d* F& x! |7 A& A/ I Error_init(&eb);) }3 ]( q( h+ \/ ]2 X4 h7 F
Hwi_Params_init(&hwiParams);
& `" V) F6 Y' }3 p4 h0 J2 V: ~+ y' O" Q hwiParams.arg = (unsigned int)ad; p0 N; _0 M, ]* n" i& a" Z
hwiParams.enableInt = FALSE;9 L( }5 |" ^2 g" S% w) M
hwiParams.eventId = SYS_INT_GPIO_B5INT;6 w0 h* t; }% E* W% v% A
hwiParams.priority = 4;
$ Z' V7 h# S- t, x' e myHwi = Hwi_create(8, ad7606_busy_hwi, &hwiParams, &eb); //注册BANK5中断处理函数
+ |' @9 T# ^6 S s8 L; X if (myHwi == NULL) * b+ u' [! _$ Z
LOG_FATAL("failed to create hwi");8 X6 [# D% Q# q# N) c8 w
/ x% Y/ _9 I+ v8 \ z1 K /* enable both interrupts */6 c( G# p1 G. ?7 z
Hwi_enableInterrupt(ad->irq_event);
% k" j& h+ H/ D4 Z8 F9 N1 J) L9 F}
# {5 N2 P2 h% Z$ A% o+ ?
0 z% \, o' n- }
* P$ i! h* u6 L4 a* O: [" n. Rstatic void ad7606_gpio_pinmux_setup(ad7606 *ad) {4 h1 c" P: y9 p: ?& j: V
volatile unsigned int savePinMux = 0;
6 ?( b8 \- G) E* m X4 d( v" e7 ]9 E //初始化5.11、5.9 、 5.5为GPIO口7 g* Y7 Y ~1 w/ N
savePinMux = HWREG(SOC_SYSCFG_0_REGS + SYSCFG0_PINMUX(11)) & (~(SYSCFG_PINMUX11_PINMUX11_27_24 | SYSCFG_PINMUX11_PINMUX11_19_16));
2 V- y/ a. Q( k" v
% T% a) z2 _: j/ V6 { G4 }# G HWREG(SOC_SYSCFG_0_REGS + SYSCFG0_PINMUX(11)) = (PINMUX11_BUSY_V1_ENABLE | PINMUX11_BUSY_V2_ENABLE | savePinMux);
" R0 v) W# ]7 v* U: u* a, C2 z- w( z6 Q! w r
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));
, Y5 ]0 H2 j' f Y& n8 ]2 e* M8 e4 ?4 s; O) H* }: S' r
HWREG(SOC_SYSCFG_0_REGS + SYSCFG0_PINMUX(12)) = (PINMUX12_RESET_ENABLE | PINMUX12_CONVST_ENABLE | PINMUX12_RD_ENABLE | PINMUX12_BUSY_C_ENABLE | savePinMux);
; q/ k/ w" Z6 @; ^9 C
* A7 m; t7 o* P7 J+ G}5 X* e0 ]/ x! `) m2 F. U2 s) U
3 z. b1 R7 i' W2 V8 a
. _$ ~1 C [0 S# l1 T/ q- d2 Fstatic void ad7606_gpio_setup(ad7606 *ad) {
$ _0 M$ R6 m3 c) ~" ~ /*Set the AD7606_PAR_BUSY to the input mode*/
0 L) i! H5 `) @2 G8 Z* l. y( f" Z //初始化5.11、5.9 、 5.5为中断口
. G# J) f- ]# A7 H0 A GPIODirModeSet(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_V1, GPIO_DIR_INPUT);8 y! ?; N9 M4 m
GPIODirModeSet(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_V2, GPIO_DIR_INPUT);, S. l4 { k; @9 b
GPIODirModeSet(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_C, GPIO_DIR_INPUT);
: b5 m3 w+ N8 y( D/ w$ g( d$ K //GPIODirModeSet(SOC_GPIO_0_REGS, AD7606_PAR_BUSY, GPIO_DIR_INPUT);
9 g; _. z9 T. A2 K4 l" A% S5 D) z /*Set the AD7606_PAR_BUSY to the Falling Edge Interrupt*/5 f* P' |# M. _8 e6 J1 Y" F: w
GPIOIntTypeSet(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_V1, GPIO_INT_TYPE_FALLEDGE);
% }0 ~- E* Z& Q/ Z( S GPIOIntTypeSet(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_V2, GPIO_INT_TYPE_FALLEDGE);$ m, u; w( W4 `/ g( d0 O
GPIOIntTypeSet(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_C, GPIO_INT_TYPE_FALLEDGE);! F" ?) i: G: d- U
//GPIOIntTypeSet(SOC_GPIO_0_REGS, AD7606_PAR_BUSY, GPIO_INT_TYPE_FALLEDGE);
4 z) O$ a7 D/ y /*The interrupt setting allows AD7606_PAR_BUSY_GPIO_BANK*/
4 I- |# W: w, {$ t9 J/ y2 r- A GPIOBankIntEnable(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_GPIO_BANK);
+ z* V5 L. }. ^+ B: d
! h( X+ S! {% @* F# ~6 J/ k, b# x GPIODirModeSet(SOC_GPIO_0_REGS, AD7606_PAR_RESET, GPIO_DIR_OUTPUT);
, L/ _/ q( s) f2 o# O( X GPIOPinWrite(SOC_GPIO_0_REGS, AD7606_PAR_RESET, GPIO_PIN_HIGH);
3 X8 I, D' t6 x8 [ i# Z# h) ~ Task_sleep(1000);
* k( \4 m! T. A( D( u8 f GPIOPinWrite(SOC_GPIO_0_REGS, AD7606_PAR_RESET, GPIO_PIN_LOW);- c9 j5 [1 c) f% K/ C: T
Task_sleep(1000);$ T- J; ]; d& s+ e; F) ?1 k
; _0 E& O+ W, E3 L /*Set the AD7606_PAR_CONVST to output mode*/2 _$ v! m+ b7 V) ?6 s1 i$ y
GPIODirModeSet(SOC_GPIO_0_REGS, AD7606_PAR_CONVST, GPIO_DIR_OUTPUT);
N5 i1 W Q3 L- B- Y/ n! {& Z GPIOPinWrite(SOC_GPIO_0_REGS, AD7606_PAR_CONVST, GPIO_PIN_LOW);6 [ \4 U7 [) s9 a
8 A/ [! ^1 s( H+ r% d
GPIODirModeSet(SOC_GPIO_0_REGS, AD7606_PAR_RD, GPIO_DIR_OUTPUT);
6 ^5 i7 m; Z; e( P1 D3 k- B GPIOPinWrite(SOC_GPIO_0_REGS, AD7606_PAR_RD, GPIO_PIN_HIGH);* F3 d; p8 o+ h A: h8 K
% a( b8 U) P+ l
}) s! ]1 F" G+ B( P% ]
. U# C: E" q% Z7 }- n$ s# d
3 V+ ]$ V* }9 A2 Y/ nstatic void ad7606_busy_hwi(UArg ad_addr) {
/ K2 }: s) O4 I2 H6 {- ?$ O" Z
# n( X: g+ }+ _; L
* R5 b! \( G4 g /* Disable the interrupts for pins of bank AD7606_PAR_BUSY in GPIO.*/7 g+ Q. v1 o4 [+ c! b( M
GPIOBankIntDisable(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_GPIO_BANK); //用仿真器debug,发现程序能进入这里。3 R6 y# @0 t1 G% j" E+ \. ]; H6 w
5 y) r; i1 O) Q' B v3 h
if(GPIOPinIntStatus(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_V1) == GPIO_INT_PEND): Y5 x6 S9 v# Z J4 W
{8 v r5 I+ T2 ~% u& {+ U
GPIOPinIntClear(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_V1); //问题是:用仿真器debug,发现程序不能进入这里。
+ X& p3 E- K* x" Q cs_addr = SOC_EMIFA_CS5_ADDR ;
# l; O% l& x+ i( W$ R internal = 0 ;
! M3 E3 P# Z' r! ?7 D/ d" k' @8 S int_flag[0] = 1 ;
- B. Z) ~: G+ M }
; h4 h K- s) Y x* n% g4 V. I if(GPIOPinIntStatus(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_V2) == GPIO_INT_PEND)
/ V9 d+ U9 ?. z/ l+ N, A {
$ G9 f8 V, M" }+ _ GPIOPinIntClear(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_V2); //问题是:用仿真器debug,发现程序不能进入这里。+ n" p* h: Z5 O
cs_addr = SOC_EMIFA_CS4_ADDR ;5 z% O8 b4 P" f ~' b
internal = 6 ;* j7 p, z6 P# B
int_flag[1] = 1 ;2 g' h4 P( p9 `2 W- N
}
, I% z' O0 g9 e' ?6 {) T! U if(GPIOPinIntStatus(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_C) == GPIO_INT_PEND)
( t, s. X# ?: ]" T9 v {/ Y% p) I, @! ~
GPIOPinIntClear(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_C); //问题是:用仿真器debug,发现程序不能进入这里。
' \ z' C6 H. X6 W7 s6 s cs_addr = SOC_EMIFA_CS2_ADDR ;
4 b G* H( a$ J. B/ ~9 t0 ?9 y/ h internal = 12 ;% w9 C" l0 y# O! O0 M
int_flag[2] = 1 ;
6 P4 S6 S' ?$ Z5 a2 F }& e8 C$ M* L. U
! B9 h) e, i8 d1 Q! C Y8 {
GPIOPinWrite(SOC_GPIO_0_REGS, AD7606_PAR_CONVST, GPIO_PIN_LOW);
" z4 E$ R4 N$ s! V& T4 y1 A! Z) S * q' V$ C' h; _9 q
GPIOBankIntEnable(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_GPIO_BANK);
2 H& [, g+ i- E& c% ~0 @}
7 S; |/ G; K$ x4 g$ Z6 H
' N/ ~& W& g9 T) J% c |
|