|
|
您好。使用GPIO中断时,中断能进入ISR,但是不能区分具体的GPIO端口。程序如下:- W* G2 E; a& A5 e# b, C* l3 H
#define AD7606_PAR_BUSY_GPIO_BANK 5! D K2 v4 w4 ], v/ ?
#define AD7606_PAR_BUSY_GPIO_BANK_INT SYS_INT_GPIO_B5INT' C1 g6 |, v1 f! n# K" E
8 ?! l9 A) I7 K$ M6 N, o#define AD7606_PAR_BUSY_V1 GPIO_TO_PIN(5, 11) //BANK5的中断口5.11
, @8 H2 U) V, U#define AD7606_PAR_BUSY_V2 GPIO_TO_PIN(5, 9) //BANK5的中断口5.9
d% |( `9 v" e8 A* V#define AD7606_PAR_BUSY_C GPIO_TO_PIN(5, 5) //BANK5的中断口5.5
5 y" a0 R% ?5 P, ]3 o7 F5 M% U#define AD7606_PAR_BUSY GPIO_TO_PIN(5, 4)
& K8 O+ p/ ]" [' }
* P0 E5 H) F4 N: M: D#define AD7606_PAR_CONVST GPIO_TO_PIN(5, 1)
0 ~# G( ?5 J0 B#define AD7606_PAR_RD GPIO_TO_PIN(5, 2)1 q, E# [9 T) \! @
#define AD7606_PAR_RESET GPIO_TO_PIN(5, 0)
# `: r; H+ U. I1 u
0 B. C5 I) T1 n5 c h j+ F* E
L/ ~- C- X5 }& H
$ w: B- {# J6 q' \3 }& X) ^static void ad7606_irq_setup(ad7606 *ad) {
' z2 l/ t" Z, [9 M+ E, f7 _ Hwi_Params hwiParams;: _: @3 n, C9 F. Q" m2 _
Hwi_Handle myHwi;' u( g* E8 Y2 O& o+ ^
Error_Block eb;
% ~( `6 E# l2 W5 r8 u' A) z, v9 R; C
Error_init(&eb);
0 L8 j3 c$ |& f1 n0 @# f( ` Hwi_Params_init(&hwiParams);
3 U5 G5 Z6 h. A6 y& M hwiParams.arg = (unsigned int)ad;6 y7 A2 n% E% R
hwiParams.enableInt = FALSE;+ x1 `! Z$ ]; E7 U3 M+ @
hwiParams.eventId = SYS_INT_GPIO_B5INT;
. d; b% v0 v- y H( A, U5 [: S; l6 t hwiParams.priority = 4;
! ~% @" b9 g% Z# W! t, k" B myHwi = Hwi_create(8, ad7606_busy_hwi, &hwiParams, &eb); //注册BANK5中断处理函数
. q: G3 P5 i. p5 L0 C* ^. w if (myHwi == NULL)
8 E, H; g* [/ o; b3 o( E3 o LOG_FATAL("failed to create hwi");
7 d7 u$ j& F: Z* Y: H1 K
% j. l9 H2 S6 ? /* enable both interrupts */6 ~' [ e G G! K5 h! n+ a( p; f
Hwi_enableInterrupt(ad->irq_event);; D( o+ [* d/ `2 j6 P5 E
}
9 A( f* C6 @) W8 a
. E6 H( A. l; K: u; S
) V+ Q! `& b- i& A8 T7 C+ Sstatic void ad7606_gpio_pinmux_setup(ad7606 *ad) {* Z7 F2 W6 i! G% Z
volatile unsigned int savePinMux = 0;
S2 b$ S0 F% A //初始化5.11、5.9 、 5.5为GPIO口
* i- K* s# `3 G0 [2 t savePinMux = HWREG(SOC_SYSCFG_0_REGS + SYSCFG0_PINMUX(11)) & (~(SYSCFG_PINMUX11_PINMUX11_27_24 | SYSCFG_PINMUX11_PINMUX11_19_16));
$ F# X: h2 I- m( B2 v3 N! K+ S. x/ B7 \
HWREG(SOC_SYSCFG_0_REGS + SYSCFG0_PINMUX(11)) = (PINMUX11_BUSY_V1_ENABLE | PINMUX11_BUSY_V2_ENABLE | savePinMux);
0 E: c# `* z8 M3 R, k) i! [% M7 \" C& \& o n, ?% U
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));
5 T, _3 g2 @! e
! h& s* _ ?6 D+ v4 c8 H6 }0 X HWREG(SOC_SYSCFG_0_REGS + SYSCFG0_PINMUX(12)) = (PINMUX12_RESET_ENABLE | PINMUX12_CONVST_ENABLE | PINMUX12_RD_ENABLE | PINMUX12_BUSY_C_ENABLE | savePinMux);
' c3 W _& B' h: n( j
5 O0 l o: k# \/ J5 Q8 O}
7 V3 m0 T# S1 [0 q& z/ H
# q3 n$ ~4 Q! J9 f- I/ R5 B; w0 c
; I" ~3 u9 c, t& f" jstatic void ad7606_gpio_setup(ad7606 *ad) {
2 u) k* l) b* f& Z/ ^* G /*Set the AD7606_PAR_BUSY to the input mode*/
0 r5 Y# P2 n. L8 [ //初始化5.11、5.9 、 5.5为中断口
3 ]4 v t# o7 A6 @- z6 ]$ ~ GPIODirModeSet(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_V1, GPIO_DIR_INPUT);
& d4 m, ?9 q" ^" V4 p( B- M4 r GPIODirModeSet(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_V2, GPIO_DIR_INPUT);" b4 \% _3 `: ~ o
GPIODirModeSet(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_C, GPIO_DIR_INPUT);) q7 [4 x7 T3 \& u
//GPIODirModeSet(SOC_GPIO_0_REGS, AD7606_PAR_BUSY, GPIO_DIR_INPUT);
+ g$ s% U, E7 A* k$ ?. u /*Set the AD7606_PAR_BUSY to the Falling Edge Interrupt*/8 t5 u+ ^+ s% V5 n
GPIOIntTypeSet(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_V1, GPIO_INT_TYPE_FALLEDGE);; {! V) n9 D; y5 n, f, w! C5 P
GPIOIntTypeSet(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_V2, GPIO_INT_TYPE_FALLEDGE); |. V+ [' ?1 l _( `& @
GPIOIntTypeSet(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_C, GPIO_INT_TYPE_FALLEDGE);
: S& {4 ?7 C+ O, E //GPIOIntTypeSet(SOC_GPIO_0_REGS, AD7606_PAR_BUSY, GPIO_INT_TYPE_FALLEDGE);
( c. Q1 G* F3 ^ /*The interrupt setting allows AD7606_PAR_BUSY_GPIO_BANK*/( F9 O" o' c# I
GPIOBankIntEnable(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_GPIO_BANK);( M8 W2 l h( e
" }2 x3 w2 V- W7 W. i D1 _' o8 Q) Y
GPIODirModeSet(SOC_GPIO_0_REGS, AD7606_PAR_RESET, GPIO_DIR_OUTPUT);
. A% P3 L* g( P GPIOPinWrite(SOC_GPIO_0_REGS, AD7606_PAR_RESET, GPIO_PIN_HIGH);
, E6 j9 [0 T& e6 F( k4 j Task_sleep(1000);: U+ P M3 P, [! T7 |, d
GPIOPinWrite(SOC_GPIO_0_REGS, AD7606_PAR_RESET, GPIO_PIN_LOW);
0 F5 ^ `4 p1 I5 F9 h2 o Task_sleep(1000);
: J5 ?/ _. R' _' d4 i0 x/ {: `4 A, ~8 J- p- M, z& `: D1 ^
/*Set the AD7606_PAR_CONVST to output mode*/
5 i0 S2 Z& W [& g6 V GPIODirModeSet(SOC_GPIO_0_REGS, AD7606_PAR_CONVST, GPIO_DIR_OUTPUT);5 \. k9 O8 p. s2 w' W4 x
GPIOPinWrite(SOC_GPIO_0_REGS, AD7606_PAR_CONVST, GPIO_PIN_LOW);. }7 I$ M& i+ C% b& U' n% Z
) E! b0 b0 r2 b, q5 @6 H
GPIODirModeSet(SOC_GPIO_0_REGS, AD7606_PAR_RD, GPIO_DIR_OUTPUT);1 |$ B- m' J* `
GPIOPinWrite(SOC_GPIO_0_REGS, AD7606_PAR_RD, GPIO_PIN_HIGH);
" ?2 X2 n; o5 T1 x
- ]# V S2 J, E. X}
- ?# G4 L% B& y# t1 ]. {, R# ^8 C! \2 f1 V6 c) P0 D, A
' I, G, M1 X9 j. E8 Y
static void ad7606_busy_hwi(UArg ad_addr) {2 Z* ^0 S) I$ @6 g4 z" U7 e
7 \7 j9 M! q# ?4 U1 S% t. x4 G# S3 `& {* P8 D+ b% p* S
/* Disable the interrupts for pins of bank AD7606_PAR_BUSY in GPIO.*/
, d5 f5 g1 a7 F; e; F6 W GPIOBankIntDisable(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_GPIO_BANK); //用仿真器debug,发现程序能进入这里。' D5 x" O) K4 ]5 c! m+ W2 a" g
- @1 v- O; z2 J7 p& \& U0 ~2 b) {
if(GPIOPinIntStatus(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_V1) == GPIO_INT_PEND)" r4 R7 u9 I" ~8 l/ q
{1 }" r7 s% R- y# h5 N) N' R: s. J
GPIOPinIntClear(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_V1); //问题是:用仿真器debug,发现程序不能进入这里。0 u9 E/ G' g4 l+ N7 \/ y
cs_addr = SOC_EMIFA_CS5_ADDR ;
% i. X( }9 U. l# C7 w internal = 0 ;
& [8 q$ k. |6 ^- j. f* f" ?2 F+ J int_flag[0] = 1 ;; J( P# V: F4 }/ L& ]
}8 _; K+ y+ ]2 r& N# v. s E
if(GPIOPinIntStatus(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_V2) == GPIO_INT_PEND)
6 F1 I4 q9 p: q* A$ F {5 K7 n& P: W2 A6 N+ P
GPIOPinIntClear(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_V2); //问题是:用仿真器debug,发现程序不能进入这里。
5 M6 u+ b* H1 K' x1 @! }/ p3 p cs_addr = SOC_EMIFA_CS4_ADDR ;: Q: y) F( K9 M: e( p9 i, Q
internal = 6 ;; n4 W a$ N1 g/ O5 n! ]8 o
int_flag[1] = 1 ;1 o8 |3 I8 }6 `, {* q5 x
} }- @1 S+ V# X* b
if(GPIOPinIntStatus(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_C) == GPIO_INT_PEND)
% F) }0 [( L* P, A+ L {
& x- n1 _- m' [' l/ Q GPIOPinIntClear(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_C); //问题是:用仿真器debug,发现程序不能进入这里。+ i: d4 T( W0 o7 Z7 K
cs_addr = SOC_EMIFA_CS2_ADDR ;% b, |7 M8 C R/ d; D Q
internal = 12 ;9 s" w0 M& a; d9 N
int_flag[2] = 1 ;
/ s8 C' F5 q. A m2 z7 F8 F6 J }8 }8 ^: X& W- j/ P6 A
- f! u, Z- }" X2 [1 @9 W; Y
GPIOPinWrite(SOC_GPIO_0_REGS, AD7606_PAR_CONVST, GPIO_PIN_LOW);3 n4 O- K; Z0 f
6 U) j# n7 c8 R! O E2 a) l9 F
GPIOBankIntEnable(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_GPIO_BANK);
- t5 W! z3 z3 F( u}. W: x0 n2 z. B, V- m5 a$ Q' ^
N" Q7 q8 @& Q) o; [- J
' }9 T' l) G J4 G. @
$ e5 Y# K3 e" h0 K: A( ~5 d, n4 n% [* U# f8 b- u! U
|
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
|