|
您好。使用GPIO中断时,中断能进入ISR,但是不能区分具体的GPIO端口。程序如下:; S9 r' v7 i6 _* C9 J1 s
#define AD7606_PAR_BUSY_GPIO_BANK 5- e3 l/ Z3 x$ ~
#define AD7606_PAR_BUSY_GPIO_BANK_INT SYS_INT_GPIO_B5INT
( A7 @& C- w. n" J7 P
- C% c. O. W" B7 A& s w% }#define AD7606_PAR_BUSY_V1 GPIO_TO_PIN(5, 11) //BANK5的中断口5.110 H9 s2 @; {9 E1 p, r0 Q' Z$ Q
#define AD7606_PAR_BUSY_V2 GPIO_TO_PIN(5, 9) //BANK5的中断口5.9
/ s; {1 y1 i; }; }9 m& K0 j$ `#define AD7606_PAR_BUSY_C GPIO_TO_PIN(5, 5) //BANK5的中断口5.5$ G; [/ f" P8 D
#define AD7606_PAR_BUSY GPIO_TO_PIN(5, 4)
' |" L& o8 @, E& h7 [2 b3 s$ h n+ y( R- C6 B7 u
#define AD7606_PAR_CONVST GPIO_TO_PIN(5, 1)
2 |7 E6 F& x" g8 Q7 ^#define AD7606_PAR_RD GPIO_TO_PIN(5, 2)% ]' q5 H2 i3 t0 M! |
#define AD7606_PAR_RESET GPIO_TO_PIN(5, 0)3 e' P9 {# ^: }
6 d+ \6 K! C( @; J2 n/ i2 }
4 @( [0 p) W ~, |. `3 \
) \3 a7 K% D8 J4 y4 o3 s- ustatic void ad7606_irq_setup(ad7606 *ad) {; t- s. l# i4 Q" h# ~/ O( b2 F
Hwi_Params hwiParams;& i1 _; l5 a" K7 N0 \8 N
Hwi_Handle myHwi;
! M9 L8 ]+ [1 m$ C8 Y0 G" N Error_Block eb;5 \! g; a% D2 ^3 n5 M9 a9 y
8 u8 p( K7 ?9 }+ a! M; x3 P Error_init(&eb);
+ g. N! f* c0 l. `& P, m3 N( _ Hwi_Params_init(&hwiParams);
& z, P1 m# H" W' c) W hwiParams.arg = (unsigned int)ad;) ]# ?7 Y9 I1 a( P- W) I1 r# C
hwiParams.enableInt = FALSE;) f, @5 i' H+ T
hwiParams.eventId = SYS_INT_GPIO_B5INT;0 Z4 l3 I5 t( ~0 ^% G) j8 X) {8 y* A
hwiParams.priority = 4;
" Y: l `6 z+ H myHwi = Hwi_create(8, ad7606_busy_hwi, &hwiParams, &eb); //注册BANK5中断处理函数: {7 W7 W6 s6 M: J' u$ ]+ r
if (myHwi == NULL)
; Q* D* C8 B) j; \ LOG_FATAL("failed to create hwi");# D- |5 P8 A) c, \4 Q
* L% o& i! i$ w9 h5 z! t
/* enable both interrupts */
A# ?& @" }+ e1 o Hwi_enableInterrupt(ad->irq_event);
1 B& G3 B0 G$ U4 T, L+ H% B& w: e} g) N8 E7 W7 a
2 M+ V2 X2 ?$ h' z" q* F
2 _, `, Q9 a0 `
static void ad7606_gpio_pinmux_setup(ad7606 *ad) {/ \* Q; D- `! W0 ]
volatile unsigned int savePinMux = 0;6 ?8 l7 {& H) r, @) \1 G R
//初始化5.11、5.9 、 5.5为GPIO口
% f# \( q$ G* ^9 U) u% o savePinMux = HWREG(SOC_SYSCFG_0_REGS + SYSCFG0_PINMUX(11)) & (~(SYSCFG_PINMUX11_PINMUX11_27_24 | SYSCFG_PINMUX11_PINMUX11_19_16));
" Y1 `; {# ^7 S# z& u, h& u* K6 c" j& O7 s. x
HWREG(SOC_SYSCFG_0_REGS + SYSCFG0_PINMUX(11)) = (PINMUX11_BUSY_V1_ENABLE | PINMUX11_BUSY_V2_ENABLE | savePinMux);8 u/ a3 U% ]6 n
: F+ t, P1 I; _. U. y0 |' ^5 Z 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));4 S' h- ?) Z3 {6 d: o
' @: s: ] U% G P1 }* S# B" m, `
HWREG(SOC_SYSCFG_0_REGS + SYSCFG0_PINMUX(12)) = (PINMUX12_RESET_ENABLE | PINMUX12_CONVST_ENABLE | PINMUX12_RD_ENABLE | PINMUX12_BUSY_C_ENABLE | savePinMux);6 z& Z5 m5 V; G; e: u' E1 a+ L* K
6 h% X* E. Q* k i) ^" r7 s# ^- P}
- ]$ H2 A, c& o% K8 H! n G, C& U! V; s1 ]/ Z
& a1 [& s Z7 y6 _. r7 d4 Jstatic void ad7606_gpio_setup(ad7606 *ad) {
" F/ H0 Z5 J' k+ E2 w) ] /*Set the AD7606_PAR_BUSY to the input mode*/
- \ F) B3 \( U //初始化5.11、5.9 、 5.5为中断口; a# V$ W1 q# [1 W9 Q. \ o! A
GPIODirModeSet(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_V1, GPIO_DIR_INPUT);0 L# Q" y& V4 K. }! |2 P: r
GPIODirModeSet(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_V2, GPIO_DIR_INPUT);+ q! A; y3 b. y: c, H) J6 Y
GPIODirModeSet(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_C, GPIO_DIR_INPUT);, p* y% M$ k& v' e: L
//GPIODirModeSet(SOC_GPIO_0_REGS, AD7606_PAR_BUSY, GPIO_DIR_INPUT);
: U/ K) I) [3 t. t( |% { /*Set the AD7606_PAR_BUSY to the Falling Edge Interrupt*/, E; x8 T9 {* X, V9 X% V( m
GPIOIntTypeSet(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_V1, GPIO_INT_TYPE_FALLEDGE);' a# `( E0 j9 c1 T1 J
GPIOIntTypeSet(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_V2, GPIO_INT_TYPE_FALLEDGE);
L' e! r" B3 u+ E- p GPIOIntTypeSet(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_C, GPIO_INT_TYPE_FALLEDGE);4 @0 v( d" d' s* p# u7 k
//GPIOIntTypeSet(SOC_GPIO_0_REGS, AD7606_PAR_BUSY, GPIO_INT_TYPE_FALLEDGE);
7 U3 ]) K+ A0 r+ W/ A+ H+ p /*The interrupt setting allows AD7606_PAR_BUSY_GPIO_BANK*/: \- J* k6 q: j3 L R# ]
GPIOBankIntEnable(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_GPIO_BANK);. L1 k I8 l1 v B3 ^
: C- g" X/ r- K* G! A9 @1 o6 E GPIODirModeSet(SOC_GPIO_0_REGS, AD7606_PAR_RESET, GPIO_DIR_OUTPUT);% D O! ~* `0 \' r( A
GPIOPinWrite(SOC_GPIO_0_REGS, AD7606_PAR_RESET, GPIO_PIN_HIGH);
7 `8 o" u' [+ t! J% t1 E; O/ F* b0 @ Task_sleep(1000);# | J" K3 K( S0 @6 X9 w
GPIOPinWrite(SOC_GPIO_0_REGS, AD7606_PAR_RESET, GPIO_PIN_LOW);
" `" I$ w; R y' U5 J7 [ Task_sleep(1000);5 x) v1 [+ y" p9 h) p
0 C/ u! {( N$ f* q6 D+ J& q, q
/*Set the AD7606_PAR_CONVST to output mode*/
* p5 Y# f/ ]. U3 y* i GPIODirModeSet(SOC_GPIO_0_REGS, AD7606_PAR_CONVST, GPIO_DIR_OUTPUT);
+ p) M) Z* `5 v* G9 |0 ^ GPIOPinWrite(SOC_GPIO_0_REGS, AD7606_PAR_CONVST, GPIO_PIN_LOW);
8 F) B" ~5 d/ W/ [; k/ L" k% n! x
% \/ ^; u! @: I" s GPIODirModeSet(SOC_GPIO_0_REGS, AD7606_PAR_RD, GPIO_DIR_OUTPUT);3 Z: W6 I& l$ ^' L6 a% j
GPIOPinWrite(SOC_GPIO_0_REGS, AD7606_PAR_RD, GPIO_PIN_HIGH);: }3 w, |! L/ @7 D% X1 u
" L5 `/ H6 P, I, g3 _/ }. j
}5 b2 S* c1 u$ \( |/ N# y
0 @, K2 s% C2 ]3 D
! Z: l0 I9 |( ~. `9 hstatic void ad7606_busy_hwi(UArg ad_addr) {3 ]) u, ^6 y1 R' p; i' a# Y* _" [
: p8 t' d* l5 k0 U+ g- i
& Z' u3 ~, _. X1 `' A: ?2 v9 r1 a
/* Disable the interrupts for pins of bank AD7606_PAR_BUSY in GPIO.*/
) K' w& Q d: j7 l GPIOBankIntDisable(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_GPIO_BANK); //用仿真器debug,发现程序能进入这里。. ?' q1 Z* J) s$ V8 q, z; A) ]
: K2 ~% L3 \9 U6 Z
if(GPIOPinIntStatus(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_V1) == GPIO_INT_PEND): c/ I- y+ J, O6 a
{; r8 r' U& e& K [' r& c. Q7 |
GPIOPinIntClear(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_V1); //问题是:用仿真器debug,发现程序不能进入这里。
2 S- K; {: @, b! @$ Q/ s3 ` cs_addr = SOC_EMIFA_CS5_ADDR ;
# \! k6 S$ v$ n" M internal = 0 ;
! e2 e" Y: W/ J' a) I9 u4 _ int_flag[0] = 1 ;
) S+ @( H7 i# s7 { U- o9 G, t }
. r+ N9 q# ~" D if(GPIOPinIntStatus(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_V2) == GPIO_INT_PEND), M% v) r8 u4 u1 f, g/ D5 v0 `
{
" v3 c! R# ^0 V* L' i( w GPIOPinIntClear(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_V2); //问题是:用仿真器debug,发现程序不能进入这里。
; J3 ?3 c5 X! r0 r6 T ^( ~2 z cs_addr = SOC_EMIFA_CS4_ADDR ;
: l8 E1 O1 `: E: b- l internal = 6 ;
* x) R& l5 j8 z7 R) Q. I int_flag[1] = 1 ;, Y: H+ w+ u0 \6 P$ m* B
}9 y" H- G# w$ d$ ? _5 v7 O. ]$ `
if(GPIOPinIntStatus(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_C) == GPIO_INT_PEND)) U; B7 x# |- t1 `" y
{
' i: e1 r; M0 _' I GPIOPinIntClear(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_C); //问题是:用仿真器debug,发现程序不能进入这里。- ]- ~0 [& X1 p
cs_addr = SOC_EMIFA_CS2_ADDR ;4 N& a2 u3 k' R7 S4 R( ^
internal = 12 ;
( i' S8 ?' W( J! l7 b3 {4 ~ int_flag[2] = 1 ;
9 L0 R) ?- P: ], h9 F, e }
8 m; u* \# {& n2 ^4 H; b
& p: \3 \# t$ Y( I3 E" c GPIOPinWrite(SOC_GPIO_0_REGS, AD7606_PAR_CONVST, GPIO_PIN_LOW);
) {9 }9 o c. q5 m8 Z0 S" Y# d
) ~1 f1 g1 y2 n v GPIOBankIntEnable(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_GPIO_BANK);
- H) h7 [ U1 O6 e+ X0 s4 Y# X( D1 D}
) }; S* r( k5 w6 T, n0 |. |* O- w `4 U' |, z) u( ^
8 _; j8 I6 V7 \) X2 U* |
! z+ J$ D, m: Y5 {
+ y! b- h9 G: X! o* M4 l7 `) z' T |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
|