|
您好。使用GPIO中断时,中断能进入ISR,但是不能区分具体的GPIO端口。程序如下:( b8 a5 W7 N( ?3 ?7 a# C/ Q+ O
#define AD7606_PAR_BUSY_GPIO_BANK 5
. K. n6 T3 ~/ w/ s#define AD7606_PAR_BUSY_GPIO_BANK_INT SYS_INT_GPIO_B5INT' u. |4 ` a( _- t& }+ s1 D
2 m P g' ~" P9 T5 W4 y$ E4 {- K1 S
#define AD7606_PAR_BUSY_V1 GPIO_TO_PIN(5, 11) //BANK5的中断口5.113 B; M: X" C( c" t y
#define AD7606_PAR_BUSY_V2 GPIO_TO_PIN(5, 9) //BANK5的中断口5.99 j1 _) X# W b" A: ` ~0 u
#define AD7606_PAR_BUSY_C GPIO_TO_PIN(5, 5) //BANK5的中断口5.51 ~4 J, S9 l+ q9 @$ a! M5 R4 \5 k) M5 }) h2 h
#define AD7606_PAR_BUSY GPIO_TO_PIN(5, 4)
3 y4 |. n' u0 x% o/ W- j/ v/ R& o( q0 {1 w0 C6 L' E
#define AD7606_PAR_CONVST GPIO_TO_PIN(5, 1)9 h0 H% T; T% E' k7 e2 {
#define AD7606_PAR_RD GPIO_TO_PIN(5, 2)
: g( c% w/ \0 [! A! Y#define AD7606_PAR_RESET GPIO_TO_PIN(5, 0)
/ U- f8 j2 O) B1 Z. h1 k4 x
& K. e1 B) C; Y1 K1 i
6 h( E2 o3 K; b! i9 Z6 @
1 v5 D7 q$ T+ t9 xstatic void ad7606_irq_setup(ad7606 *ad) {
9 X, U, r; j. H* Q+ v/ w Hwi_Params hwiParams; v$ h: V/ Y, x/ t) \4 H& o
Hwi_Handle myHwi;
7 j: B- Q( M/ T# S) }5 F Error_Block eb;7 Q! L1 O* p% p2 c; L0 U
4 z) {. H0 Y( E! \- s Error_init(&eb);
% @3 F0 E5 m* Y# K, X Hwi_Params_init(&hwiParams);5 L# \- r. m" Y9 g8 Z3 ]) }
hwiParams.arg = (unsigned int)ad;
5 Z8 v& p" H6 T$ | hwiParams.enableInt = FALSE;5 \& n( l. z5 F2 G, {
hwiParams.eventId = SYS_INT_GPIO_B5INT;& B2 d+ n: |5 a+ u2 {$ [0 {
hwiParams.priority = 4;
8 B4 `. ~! u' i% L8 j; U( b myHwi = Hwi_create(8, ad7606_busy_hwi, &hwiParams, &eb); //注册BANK5中断处理函数- {# F. [5 c/ K% m% d+ n$ Z( ?
if (myHwi == NULL)
3 [$ _2 H* j4 w/ @$ i LOG_FATAL("failed to create hwi");8 p0 ]/ t7 G/ A4 L: O$ W9 \" P
; Z" C$ l+ e6 z. D H
/* enable both interrupts *// U, r& n5 R9 |5 t0 \' m! K
Hwi_enableInterrupt(ad->irq_event);$ ^) U- P* t" J$ a( G, H9 k
}
1 Z5 U; }- t7 [: X& B0 z1 J5 P' m4 C4 v. B* s8 }; |' p- [
* [1 x" A0 `) g9 {5 v! h6 I5 Vstatic void ad7606_gpio_pinmux_setup(ad7606 *ad) {
$ q2 D, ?4 N J$ H8 P( P volatile unsigned int savePinMux = 0;
" y, J& L2 w1 ]1 _! a+ M& T- I' S0 U //初始化5.11、5.9 、 5.5为GPIO口
: x" L4 P( M: a; d v/ u0 h savePinMux = HWREG(SOC_SYSCFG_0_REGS + SYSCFG0_PINMUX(11)) & (~(SYSCFG_PINMUX11_PINMUX11_27_24 | SYSCFG_PINMUX11_PINMUX11_19_16));( s, u7 M- E0 ]
3 o! T; p# l# f8 Q2 w. R6 Y HWREG(SOC_SYSCFG_0_REGS + SYSCFG0_PINMUX(11)) = (PINMUX11_BUSY_V1_ENABLE | PINMUX11_BUSY_V2_ENABLE | savePinMux);- ]4 Z4 M- v# [* @1 ]
- | @" I& V( Z& p 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));* y0 g* J! y- G* ~/ e6 I" l
0 L& Q% C4 j q2 @
HWREG(SOC_SYSCFG_0_REGS + SYSCFG0_PINMUX(12)) = (PINMUX12_RESET_ENABLE | PINMUX12_CONVST_ENABLE | PINMUX12_RD_ENABLE | PINMUX12_BUSY_C_ENABLE | savePinMux);+ W3 m( M) P$ A9 F6 {+ W3 ~" M
5 L0 q7 \! X2 h2 U- L
}: z! s; x: n- f5 h0 K8 H: i
4 t1 M6 m( O0 D0 R7 ~$ R0 y; p4 s; Y) A( E9 N8 r
static void ad7606_gpio_setup(ad7606 *ad) {
) `, u6 ~: ]. R" _ l3 ]9 I /*Set the AD7606_PAR_BUSY to the input mode*/
6 U A& ]/ f& R) a% U: R% @( k3 K4 A //初始化5.11、5.9 、 5.5为中断口" g1 v( O' r6 R) T
GPIODirModeSet(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_V1, GPIO_DIR_INPUT);, o5 l" D1 ^8 w) t0 o9 v* `
GPIODirModeSet(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_V2, GPIO_DIR_INPUT);
4 F- @# f7 i+ a8 P; Y# y GPIODirModeSet(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_C, GPIO_DIR_INPUT);% I: s$ v: N+ N6 d1 I1 Q: H
//GPIODirModeSet(SOC_GPIO_0_REGS, AD7606_PAR_BUSY, GPIO_DIR_INPUT);/ j9 J- t! D" q3 t. m1 i
/*Set the AD7606_PAR_BUSY to the Falling Edge Interrupt*/4 ^" s9 Q" b2 c ^) V7 w4 h
GPIOIntTypeSet(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_V1, GPIO_INT_TYPE_FALLEDGE);# I g* J6 r" n: @& i4 X( P
GPIOIntTypeSet(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_V2, GPIO_INT_TYPE_FALLEDGE);
* b( y* M/ e3 o3 ? GPIOIntTypeSet(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_C, GPIO_INT_TYPE_FALLEDGE);
; m4 ]+ {. V8 X- _+ }! H' `- f //GPIOIntTypeSet(SOC_GPIO_0_REGS, AD7606_PAR_BUSY, GPIO_INT_TYPE_FALLEDGE);0 B$ `' i% W4 k+ S) v8 G+ o
/*The interrupt setting allows AD7606_PAR_BUSY_GPIO_BANK*/: s7 } A( A/ i$ k
GPIOBankIntEnable(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_GPIO_BANK); U4 `( C( d- f: C% Z
, _% a( ~0 ?' Z [, n' J GPIODirModeSet(SOC_GPIO_0_REGS, AD7606_PAR_RESET, GPIO_DIR_OUTPUT);0 D8 f g( j) t' P' w
GPIOPinWrite(SOC_GPIO_0_REGS, AD7606_PAR_RESET, GPIO_PIN_HIGH);7 l- y, Y# l3 H0 F# g' h
Task_sleep(1000);) i, n" m4 z" k6 _ f# j- |
GPIOPinWrite(SOC_GPIO_0_REGS, AD7606_PAR_RESET, GPIO_PIN_LOW);
1 o- L" y+ K) x Task_sleep(1000);
$ J9 P) h* Y, {( e7 w+ a, D/ Z5 f4 \& {
/*Set the AD7606_PAR_CONVST to output mode*/$ c/ k( M7 e# s; O8 s' A5 y, v
GPIODirModeSet(SOC_GPIO_0_REGS, AD7606_PAR_CONVST, GPIO_DIR_OUTPUT);
* d! a9 B1 S: M/ E, q$ \) A GPIOPinWrite(SOC_GPIO_0_REGS, AD7606_PAR_CONVST, GPIO_PIN_LOW);9 K, O! C8 `) A& J& Z
2 S" |, f3 f5 u& A4 D' b
GPIODirModeSet(SOC_GPIO_0_REGS, AD7606_PAR_RD, GPIO_DIR_OUTPUT);
! f% \" Y+ h* j; g& _ S- \ GPIOPinWrite(SOC_GPIO_0_REGS, AD7606_PAR_RD, GPIO_PIN_HIGH);/ d2 N! ]- D: Z# y# }
$ o* ]5 O ?+ h0 w7 f, u, Y2 u
}9 W0 p7 i7 Q; Q( {
9 b" P- X4 g, u' \4 \
* I: H# Q6 T: h! ~
static void ad7606_busy_hwi(UArg ad_addr) {
* o+ v/ y5 d$ ]! `$ R8 H( N; K. ], O
0 E8 B' u: V8 H8 d! U: f: `! C1 V1 m
/* Disable the interrupts for pins of bank AD7606_PAR_BUSY in GPIO.*/
' f2 n% u0 a9 r3 a+ I) | GPIOBankIntDisable(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_GPIO_BANK); //用仿真器debug,发现程序能进入这里。
% g& e! Q0 l& V$ f% ^& w& o4 B2 m/ y
; O, | Y0 P& c+ ^1 [5 ^ if(GPIOPinIntStatus(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_V1) == GPIO_INT_PEND)
2 _. c. @; h' c; y8 {8 n( Z {- @4 \3 w; f0 {* m2 t3 A1 G
GPIOPinIntClear(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_V1); //问题是:用仿真器debug,发现程序不能进入这里。9 i r' R( P& a8 J- H
cs_addr = SOC_EMIFA_CS5_ADDR ;. }) S) v# w) K7 J% C: j! O
internal = 0 ;5 W7 y* t* n+ B5 D# r3 l- V1 R
int_flag[0] = 1 ;
1 F8 ~$ o [9 d/ a. n7 W: o6 | }$ N& O, y+ F! \4 {5 d
if(GPIOPinIntStatus(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_V2) == GPIO_INT_PEND)
9 c2 X, [6 e* E0 W {& a6 e8 r# E6 p3 x& \
GPIOPinIntClear(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_V2); //问题是:用仿真器debug,发现程序不能进入这里。
0 S4 o: R* l/ n& e cs_addr = SOC_EMIFA_CS4_ADDR ;/ X" O9 c1 X4 o* a& y& H) }; e' s
internal = 6 ;; p3 z# ?2 u# ?! B! e" ]! X
int_flag[1] = 1 ;% C' S5 c- U+ @+ H
}* N+ ~- A2 `: J
if(GPIOPinIntStatus(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_C) == GPIO_INT_PEND)1 H3 [* J; I+ B6 i
{. T/ y6 r7 ~6 h; a( P4 _! C" J
GPIOPinIntClear(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_C); //问题是:用仿真器debug,发现程序不能进入这里。+ f T$ i* t4 x' T2 i" T
cs_addr = SOC_EMIFA_CS2_ADDR ;) ^( b0 G$ w+ T! i& v" }
internal = 12 ;4 z8 j N7 L& V. i
int_flag[2] = 1 ;% E3 _% E4 o. f. J) N' O
}
; `7 T9 G" G) A( y/ |4 `# w' T+ g: b
, g% A! F8 x C, V1 z3 t GPIOPinWrite(SOC_GPIO_0_REGS, AD7606_PAR_CONVST, GPIO_PIN_LOW);! v; }. K( C1 i
0 k/ J! O$ n4 o; F
GPIOBankIntEnable(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_GPIO_BANK);
, k9 p8 e5 g; L- x5 P}( G8 F% x% L# S$ }- c; X
9 E% a+ h' \$ ?1 A8 g# e# M4 r4 w |
|