|
您好。使用GPIO中断时,中断能进入ISR,但是不能区分具体的GPIO端口。程序如下:9 A7 Q' b1 w1 X. F+ ]1 |
#define AD7606_PAR_BUSY_GPIO_BANK 55 e& E3 l3 E% K, y% E
#define AD7606_PAR_BUSY_GPIO_BANK_INT SYS_INT_GPIO_B5INT
- K' e4 L. M9 F7 ?6 k! F/ k' b. I6 l# B& T% W @" ]
#define AD7606_PAR_BUSY_V1 GPIO_TO_PIN(5, 11) //BANK5的中断口5.11
+ @" a' x6 P' c% B1 P9 L: W7 h. I#define AD7606_PAR_BUSY_V2 GPIO_TO_PIN(5, 9) //BANK5的中断口5.9# J2 K+ r" t3 O" _# f: J
#define AD7606_PAR_BUSY_C GPIO_TO_PIN(5, 5) //BANK5的中断口5.5; C1 `" p! S- P* f( G; A
#define AD7606_PAR_BUSY GPIO_TO_PIN(5, 4)
5 |1 u# q6 ?6 o0 M& a
# \7 S8 [3 w; r' H5 V#define AD7606_PAR_CONVST GPIO_TO_PIN(5, 1): f7 z& f6 ]" d# \6 l
#define AD7606_PAR_RD GPIO_TO_PIN(5, 2)
. F( ?. h/ l$ L6 Z* Y! r- S2 A: ^#define AD7606_PAR_RESET GPIO_TO_PIN(5, 0)
( { T0 L% T/ v1 b- {& q
& u- E. Y3 z0 M9 w' U$ W) K. k9 T+ n- f4 p$ t) \' V# `/ C( R
3 B$ i" f m5 a$ c# W% Q( W
static void ad7606_irq_setup(ad7606 *ad) {8 ~1 ]" I' R* A2 u2 ~
Hwi_Params hwiParams;
' X; \& d8 X! T Hwi_Handle myHwi;3 Q1 o$ L. F$ i! h
Error_Block eb;
4 q3 r$ N1 {: c7 r ]; g9 n( d K
Error_init(&eb);# ?- B0 d& g/ E- |& Z7 ]5 {, J/ u
Hwi_Params_init(&hwiParams);! D. a: C) R+ j) r' i: W/ f! ^; n2 S
hwiParams.arg = (unsigned int)ad;
1 e+ W* \/ A$ z5 F6 t. O hwiParams.enableInt = FALSE;7 [( a, y+ E# u3 U: G
hwiParams.eventId = SYS_INT_GPIO_B5INT;
" e; i+ i* e; O- Q( f0 B hwiParams.priority = 4;, A' e2 \6 Y* v7 K
myHwi = Hwi_create(8, ad7606_busy_hwi, &hwiParams, &eb); //注册BANK5中断处理函数
) e& q1 f3 X+ r! R# e2 R if (myHwi == NULL)
* c3 I2 w* ?6 n LOG_FATAL("failed to create hwi");
/ a& h2 \+ i& C* ]7 l3 ^# W2 r+ G
+ z i9 @) W( M# q3 u8 G! k /* enable both interrupts */+ B. i0 M( S) [' e7 E
Hwi_enableInterrupt(ad->irq_event);
" p3 R8 g- s' E}: C3 y" S& k D" H# X* z. q( z
" ^2 v2 H0 F6 g8 o/ F: O1 G3 U- F3 `
static void ad7606_gpio_pinmux_setup(ad7606 *ad) {
# X+ N) _2 _7 i1 n volatile unsigned int savePinMux = 0;. f y2 | L$ Y7 l" {; h; Z
//初始化5.11、5.9 、 5.5为GPIO口
) g4 @/ F4 _, G; S2 {4 h9 T7 z savePinMux = HWREG(SOC_SYSCFG_0_REGS + SYSCFG0_PINMUX(11)) & (~(SYSCFG_PINMUX11_PINMUX11_27_24 | SYSCFG_PINMUX11_PINMUX11_19_16));8 T% ^3 R/ B$ @: _# C
( ~2 b& U3 s& L5 n) {; h HWREG(SOC_SYSCFG_0_REGS + SYSCFG0_PINMUX(11)) = (PINMUX11_BUSY_V1_ENABLE | PINMUX11_BUSY_V2_ENABLE | savePinMux);6 T3 O; c/ F/ y8 {
" J& k7 [" Y, @ 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));, i" i7 Z S! c, H: v4 a
& X P# S3 b, `* h HWREG(SOC_SYSCFG_0_REGS + SYSCFG0_PINMUX(12)) = (PINMUX12_RESET_ENABLE | PINMUX12_CONVST_ENABLE | PINMUX12_RD_ENABLE | PINMUX12_BUSY_C_ENABLE | savePinMux);
( x) F9 S7 g- A! A
: ]& N) X( P3 i- C$ T}2 N; K) R6 `% p9 M6 Y: Y' f, j
8 a: x$ u% C- B# z4 C
* r6 l2 M# Z7 astatic void ad7606_gpio_setup(ad7606 *ad) {9 ~- B4 _# e- ~) y Q
/*Set the AD7606_PAR_BUSY to the input mode*/
6 O- f5 j" [* I: G7 W( ^7 g% p //初始化5.11、5.9 、 5.5为中断口0 E, d w/ f5 ], s
GPIODirModeSet(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_V1, GPIO_DIR_INPUT);
/ J0 A& U) X# ^1 N1 _3 p GPIODirModeSet(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_V2, GPIO_DIR_INPUT);: ?. a$ c5 `; I' ^* G
GPIODirModeSet(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_C, GPIO_DIR_INPUT);
+ E9 n+ D* N: k0 A //GPIODirModeSet(SOC_GPIO_0_REGS, AD7606_PAR_BUSY, GPIO_DIR_INPUT);
. V. i8 q8 n; g7 Y0 T4 ^9 J /*Set the AD7606_PAR_BUSY to the Falling Edge Interrupt*/( Y4 i- v/ u4 R4 i+ g
GPIOIntTypeSet(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_V1, GPIO_INT_TYPE_FALLEDGE);
$ f- I% C6 w* S; r$ P$ K1 ] GPIOIntTypeSet(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_V2, GPIO_INT_TYPE_FALLEDGE);/ I, _+ n: g2 k. M1 V+ s
GPIOIntTypeSet(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_C, GPIO_INT_TYPE_FALLEDGE);1 _7 y- U/ l" M; f) s" A; v: F$ m
//GPIOIntTypeSet(SOC_GPIO_0_REGS, AD7606_PAR_BUSY, GPIO_INT_TYPE_FALLEDGE);' p5 K$ P8 m. d3 s. [
/*The interrupt setting allows AD7606_PAR_BUSY_GPIO_BANK*/
1 J5 F9 r* F! g8 s2 z GPIOBankIntEnable(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_GPIO_BANK);: g% {; L3 }$ I- a) O
5 [* p. O; M4 S- a* j7 }( I# g2 i GPIODirModeSet(SOC_GPIO_0_REGS, AD7606_PAR_RESET, GPIO_DIR_OUTPUT);! P" e6 O% n1 m- w9 v
GPIOPinWrite(SOC_GPIO_0_REGS, AD7606_PAR_RESET, GPIO_PIN_HIGH);
; u" M! p- e1 b( ]3 U Task_sleep(1000);: N% C" O% n! r2 Q/ M4 j
GPIOPinWrite(SOC_GPIO_0_REGS, AD7606_PAR_RESET, GPIO_PIN_LOW);" W$ Y3 W1 Z6 @1 F! O" f5 i
Task_sleep(1000);8 E7 D' I0 r8 Q1 D
0 @* [, U7 J( L9 r R/ K: Q8 s! m% B
/*Set the AD7606_PAR_CONVST to output mode*// f; h. D3 U& Y7 G
GPIODirModeSet(SOC_GPIO_0_REGS, AD7606_PAR_CONVST, GPIO_DIR_OUTPUT);
u6 n$ j! f9 A I. M, Y GPIOPinWrite(SOC_GPIO_0_REGS, AD7606_PAR_CONVST, GPIO_PIN_LOW);
0 M8 x; F1 Z) ^% T# c
5 {! v1 c$ M1 [! u GPIODirModeSet(SOC_GPIO_0_REGS, AD7606_PAR_RD, GPIO_DIR_OUTPUT);- ^* D0 \, Z1 g9 x4 P1 ~) N
GPIOPinWrite(SOC_GPIO_0_REGS, AD7606_PAR_RD, GPIO_PIN_HIGH);
) K) f6 c8 p& e) h7 I2 i$ j! u+ ]" ~) v' Q
}
/ ?# o+ P o( R: o( R, ~" J1 p' q/ ~9 u0 g: G" k
# n g t' V: L6 K; n; @static void ad7606_busy_hwi(UArg ad_addr) {
8 K f+ I" M+ ~' Y) A; L
$ O! Q( H" }& ]9 b7 v# N$ f/ @0 v. c- F' T, Q7 j& L
/* Disable the interrupts for pins of bank AD7606_PAR_BUSY in GPIO.*/" f8 W2 l( b W
GPIOBankIntDisable(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_GPIO_BANK); //用仿真器debug,发现程序能进入这里。$ ?- F) f* @* Z j
7 ~6 a) M, V1 v9 ?7 `6 v3 ~ U
if(GPIOPinIntStatus(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_V1) == GPIO_INT_PEND). r' {' Z8 l6 ^: Z- V: X) H
{
) g6 z5 p) c/ b! T$ I GPIOPinIntClear(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_V1); //问题是:用仿真器debug,发现程序不能进入这里。8 f' ~$ p; B# H1 R# k
cs_addr = SOC_EMIFA_CS5_ADDR ;
0 ?- }, a' S7 ~; o+ U- a( J' [% V internal = 0 ;/ t5 E3 i/ `3 h- {3 R+ O4 i0 V
int_flag[0] = 1 ;- z9 j5 w" H* I: I
}
1 y/ r8 C g" V6 c, S if(GPIOPinIntStatus(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_V2) == GPIO_INT_PEND)7 k$ | C1 _0 ~$ a
{: H% G5 s6 F$ u+ {( U
GPIOPinIntClear(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_V2); //问题是:用仿真器debug,发现程序不能进入这里。4 B- L. u7 R6 M/ d4 s% Y
cs_addr = SOC_EMIFA_CS4_ADDR ;
) `4 n; l% z' |+ h" V internal = 6 ;3 o0 b" ^ p2 \# S
int_flag[1] = 1 ;
% T+ Q8 ]$ ?3 h3 {' E$ G! U }2 F3 g+ ~2 ~9 r8 Y4 g- d
if(GPIOPinIntStatus(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_C) == GPIO_INT_PEND)
! {% @( y; j9 T. x {) I" B5 r }; H$ [3 @
GPIOPinIntClear(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_C); //问题是:用仿真器debug,发现程序不能进入这里。
" x( k! K; y( r; n7 p cs_addr = SOC_EMIFA_CS2_ADDR ;
) p9 D- E8 d& U2 | internal = 12 ;$ D0 a) t$ t- N/ A
int_flag[2] = 1 ;
2 v$ G: l$ C0 U) [3 h }
4 A8 k2 N7 p# K- X7 h
! ~! Y u4 u3 R! n+ }5 ]: I& o GPIOPinWrite(SOC_GPIO_0_REGS, AD7606_PAR_CONVST, GPIO_PIN_LOW);, Y% Y$ n9 Q. @. r+ b+ c* E+ o
9 Y# ^/ B- p3 ^ V1 t; q6 `& A+ D GPIOBankIntEnable(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_GPIO_BANK);$ l" b+ I4 T% u3 C* {4 q1 q6 G
}
5 ~1 H) ~0 M& e' ?) |2 w
: Q6 q; n( t% v; a' T8 g
. @+ b% v0 g, Q- T2 Y8 h2 b Z1 p: j- ~3 T6 g& z% m: o
+ P# Q- r2 {- _, n5 c" P
|
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
|