|
您好。使用GPIO中断时,中断能进入ISR,但是不能区分具体的GPIO端口。程序如下:. p( }. ]+ D& } x( Z c
#define AD7606_PAR_BUSY_GPIO_BANK 5
+ E+ b* g- c0 H" L' F( e6 j#define AD7606_PAR_BUSY_GPIO_BANK_INT SYS_INT_GPIO_B5INT
- z9 h: X! N; v8 E
9 a+ \; A' P1 e" g- ]" k#define AD7606_PAR_BUSY_V1 GPIO_TO_PIN(5, 11) //BANK5的中断口5.11
. b$ X3 N; \) ^$ o4 z! c% U4 z1 Y#define AD7606_PAR_BUSY_V2 GPIO_TO_PIN(5, 9) //BANK5的中断口5.96 K3 y1 ~+ ]! E o5 q# B( I
#define AD7606_PAR_BUSY_C GPIO_TO_PIN(5, 5) //BANK5的中断口5.5+ l2 G' V9 o' `. H/ d# f+ P. Y% F
#define AD7606_PAR_BUSY GPIO_TO_PIN(5, 4)3 d; B, Y: n( x9 o/ k3 d
P4 h1 F* c, X/ i
#define AD7606_PAR_CONVST GPIO_TO_PIN(5, 1)6 Y# |4 e# b3 K# H. N, U& d* O9 S
#define AD7606_PAR_RD GPIO_TO_PIN(5, 2)2 Z$ T' y* I, I: ]( g! r
#define AD7606_PAR_RESET GPIO_TO_PIN(5, 0)8 L- v, j; I# s4 {
1 r( P. n/ r. v. I
* o+ |$ @9 ^$ M7 @) L6 i5 r* R7 h
, {' o/ S, X5 p1 _" K) hstatic void ad7606_irq_setup(ad7606 *ad) {
- i) s# a# k2 Z Hwi_Params hwiParams;
7 `& ^2 h5 X! c z- h w; o Hwi_Handle myHwi;- }5 J! }; N' F6 B- m
Error_Block eb;
9 E$ {. a' Q9 u3 t/ T5 E8 D/ L! N+ n3 j7 q) w
Error_init(&eb);
6 W' E4 d! l" Z& g: } Hwi_Params_init(&hwiParams);
! E! I8 g \* O" o: x; G; Q4 Y hwiParams.arg = (unsigned int)ad;
8 c) u c |+ N& l% v hwiParams.enableInt = FALSE;
: c. W/ z/ k/ | hwiParams.eventId = SYS_INT_GPIO_B5INT;4 R5 _9 `3 G6 R; F9 f
hwiParams.priority = 4;
. q `4 r( }' M9 j! F myHwi = Hwi_create(8, ad7606_busy_hwi, &hwiParams, &eb); //注册BANK5中断处理函数* i- ?2 l/ B$ E- ]
if (myHwi == NULL) ! n( }: |, _4 i; ~, z7 L. d+ r
LOG_FATAL("failed to create hwi");% {5 ~- J) G" z' s
/ z6 {1 q$ [, Y' A5 [6 S& ` /* enable both interrupts */. E! S6 z- i- J# }8 E
Hwi_enableInterrupt(ad->irq_event);
$ t( Y, `# W( P( c4 r( ~9 R, _}
h/ O/ G7 [+ }! r6 Z( |: H$ A9 K' n O: K3 |2 A* S; l9 x8 R
: W7 A0 m8 d: X7 o* B8 istatic void ad7606_gpio_pinmux_setup(ad7606 *ad) {
" W8 y* [+ z* B! F& [ volatile unsigned int savePinMux = 0;
% Z/ `9 t# _. ]; w( E //初始化5.11、5.9 、 5.5为GPIO口5 P1 d5 x. Q2 F, n; }7 j
savePinMux = HWREG(SOC_SYSCFG_0_REGS + SYSCFG0_PINMUX(11)) & (~(SYSCFG_PINMUX11_PINMUX11_27_24 | SYSCFG_PINMUX11_PINMUX11_19_16));, B$ }% x# L7 {; ?* L/ _
( R. Y( }7 Y H HWREG(SOC_SYSCFG_0_REGS + SYSCFG0_PINMUX(11)) = (PINMUX11_BUSY_V1_ENABLE | PINMUX11_BUSY_V2_ENABLE | savePinMux);) |* x' o$ a. ]) p
8 {" a* ?5 Z+ u: w* ?. W
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));
/ L+ k5 w: }( m( @/ v
. @4 r, q3 r; G/ K/ ]4 V HWREG(SOC_SYSCFG_0_REGS + SYSCFG0_PINMUX(12)) = (PINMUX12_RESET_ENABLE | PINMUX12_CONVST_ENABLE | PINMUX12_RD_ENABLE | PINMUX12_BUSY_C_ENABLE | savePinMux);8 `! {* s3 P+ _. O) l, ?$ ?; n* ~3 w/ V
% F! O# T8 D7 m6 B8 {) K" R& ^
}2 U5 |) _% L8 X% n( ^% E' S# F
, y& y: o1 `9 E7 P5 F# {1 r9 R
5 \& C' g! |) U" q+ H, mstatic void ad7606_gpio_setup(ad7606 *ad) {
* N! I, R( u; [ /*Set the AD7606_PAR_BUSY to the input mode*/
, s. g$ ?/ L5 g- Q) z //初始化5.11、5.9 、 5.5为中断口' i" h1 f6 M2 Q* k1 N' k/ I3 }
GPIODirModeSet(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_V1, GPIO_DIR_INPUT);
f+ H/ O& e1 s' N GPIODirModeSet(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_V2, GPIO_DIR_INPUT);6 s+ E& p2 c& \1 A3 ]6 W' a1 N
GPIODirModeSet(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_C, GPIO_DIR_INPUT);% \. @2 ~' S3 q5 U4 N
//GPIODirModeSet(SOC_GPIO_0_REGS, AD7606_PAR_BUSY, GPIO_DIR_INPUT);- o, l) n" K! s# g [- p! b
/*Set the AD7606_PAR_BUSY to the Falling Edge Interrupt*/
; J5 x! i. V" J5 ~ GPIOIntTypeSet(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_V1, GPIO_INT_TYPE_FALLEDGE);+ Z- p) W" d* _" P
GPIOIntTypeSet(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_V2, GPIO_INT_TYPE_FALLEDGE);
6 U. \4 P _: D4 v: }! F GPIOIntTypeSet(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_C, GPIO_INT_TYPE_FALLEDGE);
7 v! N, b& P4 m //GPIOIntTypeSet(SOC_GPIO_0_REGS, AD7606_PAR_BUSY, GPIO_INT_TYPE_FALLEDGE);; O9 H" W+ B' Y# r J+ }
/*The interrupt setting allows AD7606_PAR_BUSY_GPIO_BANK*/0 h; Z: J" J" O" o# a
GPIOBankIntEnable(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_GPIO_BANK);
) L: P. h9 i7 U8 M/ X% w! |% _- F) G1 I
GPIODirModeSet(SOC_GPIO_0_REGS, AD7606_PAR_RESET, GPIO_DIR_OUTPUT);
. v# ~2 M. q2 H" E GPIOPinWrite(SOC_GPIO_0_REGS, AD7606_PAR_RESET, GPIO_PIN_HIGH);
3 _6 K0 I+ f" P( r) q* N7 L Task_sleep(1000);
6 t0 r9 u6 q6 Z# }. B8 t GPIOPinWrite(SOC_GPIO_0_REGS, AD7606_PAR_RESET, GPIO_PIN_LOW);2 H9 R, P) x5 N/ m. N+ Q4 G
Task_sleep(1000);
& O' l% b0 q, u" ?+ _
, A7 w |* _ q /*Set the AD7606_PAR_CONVST to output mode*/, j* d% S! t3 w; c) Y4 W% Z' c4 p
GPIODirModeSet(SOC_GPIO_0_REGS, AD7606_PAR_CONVST, GPIO_DIR_OUTPUT);, u! i1 V6 P4 u9 [! M( f2 g" C
GPIOPinWrite(SOC_GPIO_0_REGS, AD7606_PAR_CONVST, GPIO_PIN_LOW);5 A4 ^ \* X( P+ |0 x
- `' |! e1 W0 {; l
GPIODirModeSet(SOC_GPIO_0_REGS, AD7606_PAR_RD, GPIO_DIR_OUTPUT);
$ a5 h8 n3 M, \$ i7 i [ GPIOPinWrite(SOC_GPIO_0_REGS, AD7606_PAR_RD, GPIO_PIN_HIGH);! k# K2 L. Y. {
, v# s2 I9 d5 R1 Z}
- F8 G% s% y" ?4 ?, R4 n2 d; L4 _" T/ z- V
+ W- D* ^! p# m3 h( h! `5 e
static void ad7606_busy_hwi(UArg ad_addr) {) r2 m2 e6 ^2 l/ {# x
* [3 R; c2 S. E9 E+ H
3 N$ e, U( R0 X L /* Disable the interrupts for pins of bank AD7606_PAR_BUSY in GPIO.*/4 `! F R4 r" ^; ~& B5 i; p8 g7 v
GPIOBankIntDisable(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_GPIO_BANK); //用仿真器debug,发现程序能进入这里。
: c& A' }2 J7 ^5 I/ T X1 \
. Y5 }5 Q/ N5 B5 A! y if(GPIOPinIntStatus(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_V1) == GPIO_INT_PEND)
! n# W5 Q! ~- n$ |# t3 j {
* |8 `5 {" N! @) E2 A* o GPIOPinIntClear(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_V1); //问题是:用仿真器debug,发现程序不能进入这里。! f( w% t4 x8 y. }7 }: A+ X
cs_addr = SOC_EMIFA_CS5_ADDR ;
4 F ?* O$ b3 c. J internal = 0 ;
5 R2 Z/ [% X, r/ Q- K int_flag[0] = 1 ;% l1 [( _+ f# k1 d8 w A# _" ~. ~
}
9 R! z' E. [% \1 e( _ if(GPIOPinIntStatus(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_V2) == GPIO_INT_PEND)9 S6 Q( ?9 O+ l
{% o. `1 U9 }$ J& X/ O: l
GPIOPinIntClear(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_V2); //问题是:用仿真器debug,发现程序不能进入这里。
% I$ U/ D4 H2 \ Z cs_addr = SOC_EMIFA_CS4_ADDR ;
7 L) n1 [3 n( F0 m! B- v i+ W: h internal = 6 ;
( G" A- @. O# w5 j5 e8 W int_flag[1] = 1 ;
( z2 r- }) `) q }
- O& U2 F P/ D/ C' C o! m8 r if(GPIOPinIntStatus(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_C) == GPIO_INT_PEND)
7 L3 T$ S- k4 A n {3 M0 d8 L* Z, z' ?
GPIOPinIntClear(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_C); //问题是:用仿真器debug,发现程序不能进入这里。* R9 s9 g% y6 W) Z! @
cs_addr = SOC_EMIFA_CS2_ADDR ;# _3 }3 V% A7 g) e
internal = 12 ;
0 I+ P, ^! M& s# c9 E int_flag[2] = 1 ;
" w9 w( a i S% S/ M3 g0 S/ D }0 \& h) |) r1 W
/ E3 G) Y6 O9 K6 k2 r
GPIOPinWrite(SOC_GPIO_0_REGS, AD7606_PAR_CONVST, GPIO_PIN_LOW);
" S2 u3 x* r1 K# G' O, s
& s2 o* l) F6 L& D2 F" T GPIOBankIntEnable(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_GPIO_BANK);
! c A# U+ g: B% j6 A& t7 `1 s}
: z0 x) t6 v+ r/ T$ T+ P& L ?' w. w& @; m
|
|