|
您好。使用GPIO中断时,中断能进入ISR,但是不能区分具体的GPIO端口。程序如下:& g0 k2 {# v1 }+ d) b4 u
#define AD7606_PAR_BUSY_GPIO_BANK 5
# c6 n( W: N; g3 z9 i#define AD7606_PAR_BUSY_GPIO_BANK_INT SYS_INT_GPIO_B5INT# X( ?; S- M; y8 {( b+ j5 o# t5 L
) e F$ o' |: v& i- s$ p- A
#define AD7606_PAR_BUSY_V1 GPIO_TO_PIN(5, 11) //BANK5的中断口5.11# q& `! [, d$ a, i L+ r, { q
#define AD7606_PAR_BUSY_V2 GPIO_TO_PIN(5, 9) //BANK5的中断口5.9
& `, s9 O/ t) h0 a+ J" u& C#define AD7606_PAR_BUSY_C GPIO_TO_PIN(5, 5) //BANK5的中断口5.5
( o2 o. A1 z( M/ n#define AD7606_PAR_BUSY GPIO_TO_PIN(5, 4)
7 B h9 Z& b3 Z+ U; M, F. p0 J4 q D; [& I- r- f! c3 J x+ `
#define AD7606_PAR_CONVST GPIO_TO_PIN(5, 1)& }1 }0 E$ f" s" L# S
#define AD7606_PAR_RD GPIO_TO_PIN(5, 2)1 L( d$ f, B4 L3 {) \4 A; V
#define AD7606_PAR_RESET GPIO_TO_PIN(5, 0)' [2 @! t; o; V8 _9 ~0 a; O
9 P6 q' {& o/ s7 H* @ O( i
: F0 _) i5 q& ^5 H2 {
. y% A l( k0 D0 o; G4 T
static void ad7606_irq_setup(ad7606 *ad) {
- Y( C8 I) N! _2 H7 C% X Hwi_Params hwiParams;( \+ B8 I2 x& D2 f0 _& f \( W7 P
Hwi_Handle myHwi;
' A7 G; t' L: V" G7 j Error_Block eb;
6 Z0 A5 d4 i. A5 Z3 `# L
( N. R2 n+ T1 y$ f0 k Error_init(&eb);
5 J R/ D' h, v0 _+ V Hwi_Params_init(&hwiParams);
# }2 M& b7 ?6 M. x hwiParams.arg = (unsigned int)ad;5 v+ x5 p% i K7 r. G
hwiParams.enableInt = FALSE;4 ^: f0 P/ [- ~$ Z
hwiParams.eventId = SYS_INT_GPIO_B5INT;- ~. d* U4 S. u. ?: Q+ [* \
hwiParams.priority = 4;
% X; ~) q$ t' a; h$ ]" Y; y P myHwi = Hwi_create(8, ad7606_busy_hwi, &hwiParams, &eb); //注册BANK5中断处理函数
- y8 D% x3 b' t# E$ T& } if (myHwi == NULL) * r6 I$ W n4 f$ U8 X1 f
LOG_FATAL("failed to create hwi");
: W3 v1 }8 n# k; s' X4 w: n* W2 W& S
/* enable both interrupts */( q8 D- B' t o7 O$ o6 x' E8 t
Hwi_enableInterrupt(ad->irq_event);
S- ^0 L! J4 V7 b8 d$ ?}
. Q: `- R& y% P
; R1 f% @( I# \1 \! _( x) R0 ^6 y% C
! a" V" P+ S/ Bstatic void ad7606_gpio_pinmux_setup(ad7606 *ad) {4 X/ I8 g& u; X+ p0 }' K
volatile unsigned int savePinMux = 0;+ ^* F# y3 H: d* y& B) w
//初始化5.11、5.9 、 5.5为GPIO口5 c5 Q$ d2 S* D! A" r4 K8 t" v
savePinMux = HWREG(SOC_SYSCFG_0_REGS + SYSCFG0_PINMUX(11)) & (~(SYSCFG_PINMUX11_PINMUX11_27_24 | SYSCFG_PINMUX11_PINMUX11_19_16));. d- ^6 W+ ~# W9 ^- W, Z
3 ]+ G* @( [! f1 K4 [+ A$ @" X
HWREG(SOC_SYSCFG_0_REGS + SYSCFG0_PINMUX(11)) = (PINMUX11_BUSY_V1_ENABLE | PINMUX11_BUSY_V2_ENABLE | savePinMux);
3 a; U1 S6 C' d1 @1 i) A8 J; {+ y) d; B# k( v0 ~' i/ j
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));3 ~% q. r' x- t7 R0 z7 y: F- |
. n, _1 V0 a0 b! j9 t6 x. y' H1 x7 t
HWREG(SOC_SYSCFG_0_REGS + SYSCFG0_PINMUX(12)) = (PINMUX12_RESET_ENABLE | PINMUX12_CONVST_ENABLE | PINMUX12_RD_ENABLE | PINMUX12_BUSY_C_ENABLE | savePinMux);
0 y ?$ @0 ] h1 o% c" J& n% T9 V2 v5 }- l7 L9 A" N: X4 q2 R
}
( u K# D0 p! k9 H0 s7 A& U$ I
, Z; B: ^7 U- t$ n! Q0 B) [' `+ [. @5 j6 ^& `) J) Y5 f/ ~$ M+ q
static void ad7606_gpio_setup(ad7606 *ad) {. p5 M0 Z/ Y* r* R- H
/*Set the AD7606_PAR_BUSY to the input mode*/
' @/ a) c0 g) H" Z //初始化5.11、5.9 、 5.5为中断口
* d, V. X) A) x GPIODirModeSet(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_V1, GPIO_DIR_INPUT);
& g7 Q) V1 c$ J+ ^' |/ U0 n$ F GPIODirModeSet(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_V2, GPIO_DIR_INPUT);" X# G9 [# [, j5 c$ r9 h- w
GPIODirModeSet(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_C, GPIO_DIR_INPUT);, ]* t1 {7 [) f: g9 ^" X
//GPIODirModeSet(SOC_GPIO_0_REGS, AD7606_PAR_BUSY, GPIO_DIR_INPUT);
& U6 h2 H4 o+ L8 U) C4 j7 U /*Set the AD7606_PAR_BUSY to the Falling Edge Interrupt*/
$ X8 }) e. i6 ] GPIOIntTypeSet(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_V1, GPIO_INT_TYPE_FALLEDGE);0 S v6 B; x( p) l. }
GPIOIntTypeSet(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_V2, GPIO_INT_TYPE_FALLEDGE);7 T9 ?! x3 \. \$ T' J: C
GPIOIntTypeSet(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_C, GPIO_INT_TYPE_FALLEDGE);
$ w5 X+ K/ [7 ^2 J //GPIOIntTypeSet(SOC_GPIO_0_REGS, AD7606_PAR_BUSY, GPIO_INT_TYPE_FALLEDGE);
" ~3 n( ~) E# p7 _: o /*The interrupt setting allows AD7606_PAR_BUSY_GPIO_BANK*/4 ^- e0 O4 u. Q, I8 J' T& J
GPIOBankIntEnable(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_GPIO_BANK);
6 c3 N- `+ u/ `% y3 n
; R% ]! `7 M5 f+ J2 C- e GPIODirModeSet(SOC_GPIO_0_REGS, AD7606_PAR_RESET, GPIO_DIR_OUTPUT);
* y1 U3 r: o: z4 D2 P6 y1 F0 u" Q- ? GPIOPinWrite(SOC_GPIO_0_REGS, AD7606_PAR_RESET, GPIO_PIN_HIGH);/ R% i* b9 ]$ K& f/ P7 y; C0 B- Y
Task_sleep(1000);
, X) W3 N$ P9 A2 t GPIOPinWrite(SOC_GPIO_0_REGS, AD7606_PAR_RESET, GPIO_PIN_LOW);0 b5 J9 E7 Y* [0 X. }
Task_sleep(1000);$ u- Y% T7 E' f4 V) f7 A; j
( N: w6 |0 `: D6 z N4 u- X2 @; j /*Set the AD7606_PAR_CONVST to output mode*/
c6 o# `5 M) R4 L GPIODirModeSet(SOC_GPIO_0_REGS, AD7606_PAR_CONVST, GPIO_DIR_OUTPUT);
$ Y2 V U% H" o" Z GPIOPinWrite(SOC_GPIO_0_REGS, AD7606_PAR_CONVST, GPIO_PIN_LOW);: m( e$ z& S8 v+ s8 \: Z
c/ M/ W$ ]' o- Y9 @ GPIODirModeSet(SOC_GPIO_0_REGS, AD7606_PAR_RD, GPIO_DIR_OUTPUT);
' o" Q0 F5 X( A% J1 `7 L& _ GPIOPinWrite(SOC_GPIO_0_REGS, AD7606_PAR_RD, GPIO_PIN_HIGH);
* S' @2 ~! Q* X+ w( \4 b$ l, T( _. y8 @3 r u k5 y+ ^
}
' x3 L% r1 P( i# b* O0 U4 ?
" ~3 Y9 @- x0 w4 Q7 o" X
$ K( S. C: b- m9 q2 o: ~9 s6 {static void ad7606_busy_hwi(UArg ad_addr) {
* V5 g9 u6 y; x$ Z- S0 y& Y7 V/ j, S& T, P8 U
4 h& L$ N& c" ?1 E" j! y
/* Disable the interrupts for pins of bank AD7606_PAR_BUSY in GPIO.*/
4 V$ Y$ D" u2 q" l3 w& z% n GPIOBankIntDisable(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_GPIO_BANK); //用仿真器debug,发现程序能进入这里。
# k% t3 {( h- C3 I3 r1 s9 L0 W. z ~( P0 q5 \* e# x$ Z6 n
if(GPIOPinIntStatus(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_V1) == GPIO_INT_PEND)
" u& ^2 A6 P0 h4 v+ ] {5 ^" u! f% S& h$ v
GPIOPinIntClear(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_V1); //问题是:用仿真器debug,发现程序不能进入这里。
. K- d+ x( \( }, {# K cs_addr = SOC_EMIFA_CS5_ADDR ;9 E( b m, f* I0 J; V
internal = 0 ;5 l+ ?' n9 K# P) |$ ] w" G
int_flag[0] = 1 ;
( ?; T5 w6 ]! K5 @& z }- B) l0 P( Q$ a) g; ^3 I% o- e
if(GPIOPinIntStatus(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_V2) == GPIO_INT_PEND); P2 B7 V) H% D8 Z5 d) c! ~
{8 S. e& ]" I: _% j0 n$ S* ~ ]% r
GPIOPinIntClear(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_V2); //问题是:用仿真器debug,发现程序不能进入这里。
8 s1 X8 f+ Q* B8 S/ j& K1 q# f cs_addr = SOC_EMIFA_CS4_ADDR ;" x) |: O4 `% J6 }8 R1 K
internal = 6 ;2 y6 z) {0 m! p$ q3 a/ S" Y
int_flag[1] = 1 ;
% i& Z# k+ Q+ D, o }
, g5 Q( ^) v1 v if(GPIOPinIntStatus(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_C) == GPIO_INT_PEND)/ |# w' T. d) d. }4 C/ [
{4 Z3 @( V, x) T% I, S1 U! ^* r
GPIOPinIntClear(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_C); //问题是:用仿真器debug,发现程序不能进入这里。& `& s. |3 D( {9 B! F
cs_addr = SOC_EMIFA_CS2_ADDR ;0 k, b8 Q3 U y
internal = 12 ;# H/ h$ u& i3 J! T- q7 J( C1 J3 A
int_flag[2] = 1 ;2 d0 s' @0 ]9 B7 Z, U( \, W
}& w; e' x( K" z. z9 L/ R( Y
2 n7 B( } N% M5 I
GPIOPinWrite(SOC_GPIO_0_REGS, AD7606_PAR_CONVST, GPIO_PIN_LOW);( I/ H! l k2 o0 K2 h) R
3 k5 s% @9 v: [. L+ } Q- x
GPIOBankIntEnable(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_GPIO_BANK);
2 Z k6 h( l4 ]6 F5 u6 X}
8 Y% J, J2 Z" o" u3 ^* T' q
- E. D( H+ h V. [8 ] |
|