|
|
您好。使用GPIO中断时,中断能进入ISR,但是不能区分具体的GPIO端口。程序如下:9 o" u" E2 ~+ W2 n. j' S
#define AD7606_PAR_BUSY_GPIO_BANK 5
4 e7 s5 o6 i0 \# I) j#define AD7606_PAR_BUSY_GPIO_BANK_INT SYS_INT_GPIO_B5INT& Q9 X, D& c2 B9 @( r6 C1 |
7 e" {/ |( d, Y' g+ O4 b' ~#define AD7606_PAR_BUSY_V1 GPIO_TO_PIN(5, 11) //BANK5的中断口5.11, k! d1 i+ @+ T! W. k: L+ H
#define AD7606_PAR_BUSY_V2 GPIO_TO_PIN(5, 9) //BANK5的中断口5.9
8 C% s+ H O# t#define AD7606_PAR_BUSY_C GPIO_TO_PIN(5, 5) //BANK5的中断口5.5, G: a2 h8 f$ B8 x/ |( B
#define AD7606_PAR_BUSY GPIO_TO_PIN(5, 4)
- m+ A* K7 Z- b) ]3 E( ~$ S: C
9 B9 K' Y' r! K7 K* d% P6 h4 p& @. m, o#define AD7606_PAR_CONVST GPIO_TO_PIN(5, 1)7 L; D" Q7 N8 t2 k" Q% l$ l
#define AD7606_PAR_RD GPIO_TO_PIN(5, 2)( t( m: Y) T- l0 f# ^1 Y! K
#define AD7606_PAR_RESET GPIO_TO_PIN(5, 0)
+ s. ^, R- ]1 G+ d5 T( v& o+ ^7 l# ]# W m0 j/ A/ f
; @ }2 O* L6 Y, p- j/ f3 j0 e6 K- T
7 \9 U! Y' }/ J. `- b$ Mstatic void ad7606_irq_setup(ad7606 *ad) {5 N: y$ w2 W4 j, K/ ?4 E
Hwi_Params hwiParams;
6 M4 ?4 {' A( g4 x% E Hwi_Handle myHwi;# i- ` \) p& I5 ]" x% E
Error_Block eb;- w/ _( V$ u8 X# i) w9 ~- ~4 n5 I
# c; ~( c( N) D, i# @
Error_init(&eb);7 `, F1 \0 w3 S6 W; C' X2 h
Hwi_Params_init(&hwiParams);
3 ]6 t2 l+ u; |+ n2 c; k% ] hwiParams.arg = (unsigned int)ad;
7 `9 {" g2 B4 E* I; _ hwiParams.enableInt = FALSE;
6 f- ?, F9 [* B. x hwiParams.eventId = SYS_INT_GPIO_B5INT;2 e. j: `9 S: U+ X
hwiParams.priority = 4; m3 q: p4 X# u
myHwi = Hwi_create(8, ad7606_busy_hwi, &hwiParams, &eb); //注册BANK5中断处理函数( y6 G( n9 s4 @' n* M* x Z
if (myHwi == NULL) 6 |' {% l( u5 M! I" Q
LOG_FATAL("failed to create hwi");8 y9 z' V1 @0 k% d( N: h
! ]. g! E7 { }1 M
/* enable both interrupts */
1 E, Y! X5 B. g. R, g Hwi_enableInterrupt(ad->irq_event);
3 \7 t( T+ h9 e$ l9 n4 {9 K9 h}
- B {8 U) a9 X# E3 I' I4 z
' n( u( E8 ^4 i8 B0 T$ F4 C) v' j7 x/ @8 K& Q7 x! h0 S7 a
static void ad7606_gpio_pinmux_setup(ad7606 *ad) {
; { \9 m' z' z( H$ B% N, j3 c volatile unsigned int savePinMux = 0;/ z7 X7 Q. `3 u3 ?3 \4 O9 o
//初始化5.11、5.9 、 5.5为GPIO口
O. `8 v4 P1 T savePinMux = HWREG(SOC_SYSCFG_0_REGS + SYSCFG0_PINMUX(11)) & (~(SYSCFG_PINMUX11_PINMUX11_27_24 | SYSCFG_PINMUX11_PINMUX11_19_16));
) W7 Z* _8 w8 k9 G6 m
+ ~2 l' A" i6 Y* _7 }. `' n HWREG(SOC_SYSCFG_0_REGS + SYSCFG0_PINMUX(11)) = (PINMUX11_BUSY_V1_ENABLE | PINMUX11_BUSY_V2_ENABLE | savePinMux);0 f; C+ f8 X, C9 p
0 G' Z% L0 i" ]+ u6 W6 p; E 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));
: \+ R1 \! R0 W z) U
6 y- b% L2 e2 T/ w% z: n HWREG(SOC_SYSCFG_0_REGS + SYSCFG0_PINMUX(12)) = (PINMUX12_RESET_ENABLE | PINMUX12_CONVST_ENABLE | PINMUX12_RD_ENABLE | PINMUX12_BUSY_C_ENABLE | savePinMux);
5 p$ R% C, U& s
- J+ d" l* Y" F7 {}
6 L$ {( @9 H; O! R) e; C7 i% d, y3 a) t s+ j5 `$ ~
" Z9 ^7 [- ^; Y# m2 \
static void ad7606_gpio_setup(ad7606 *ad) {/ u. z$ q0 q5 B- V# O+ B
/*Set the AD7606_PAR_BUSY to the input mode*/
/ M' ^9 z9 T8 ?, V) o* r //初始化5.11、5.9 、 5.5为中断口5 K+ N- |6 g" r; E3 ]
GPIODirModeSet(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_V1, GPIO_DIR_INPUT);
/ w5 z3 r! y6 N. ~3 t% d GPIODirModeSet(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_V2, GPIO_DIR_INPUT);
7 I) _* b4 N; o0 C5 B: p GPIODirModeSet(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_C, GPIO_DIR_INPUT);
# {, r4 T2 r- X0 w/ Q9 l //GPIODirModeSet(SOC_GPIO_0_REGS, AD7606_PAR_BUSY, GPIO_DIR_INPUT);. Q" j4 M: ^' \! P
/*Set the AD7606_PAR_BUSY to the Falling Edge Interrupt*/
/ f+ _6 f3 x$ c" M5 b: m& A% Y0 { GPIOIntTypeSet(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_V1, GPIO_INT_TYPE_FALLEDGE);
2 `/ {. u3 k7 C* c GPIOIntTypeSet(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_V2, GPIO_INT_TYPE_FALLEDGE);
W* g" C1 f$ Y: a" F: q" B GPIOIntTypeSet(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_C, GPIO_INT_TYPE_FALLEDGE);
6 r) |' y6 L; l& R9 @ //GPIOIntTypeSet(SOC_GPIO_0_REGS, AD7606_PAR_BUSY, GPIO_INT_TYPE_FALLEDGE);
: a4 y" H0 s3 T) e$ u. l /*The interrupt setting allows AD7606_PAR_BUSY_GPIO_BANK*/9 D: a2 I0 M( K" ?* L6 M
GPIOBankIntEnable(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_GPIO_BANK);
! P9 `# L! W2 z% e" ]7 P( g/ q9 A
+ _8 Z3 Q4 `1 K GPIODirModeSet(SOC_GPIO_0_REGS, AD7606_PAR_RESET, GPIO_DIR_OUTPUT);) Q; h: c2 {: ?1 U% N
GPIOPinWrite(SOC_GPIO_0_REGS, AD7606_PAR_RESET, GPIO_PIN_HIGH);! l ~5 X3 \( q% [
Task_sleep(1000);1 X# \. r$ L' w$ Y
GPIOPinWrite(SOC_GPIO_0_REGS, AD7606_PAR_RESET, GPIO_PIN_LOW);
+ C/ X7 A: n3 m% \! F$ D( {( ]* f& m Task_sleep(1000);
5 Y; U# e2 |- |' e( T% q/ B1 w
# S9 \, o+ ?" D& r* Y /*Set the AD7606_PAR_CONVST to output mode*/
* W8 C7 N- G! }3 q" `3 _) v: e GPIODirModeSet(SOC_GPIO_0_REGS, AD7606_PAR_CONVST, GPIO_DIR_OUTPUT);
4 c0 f: A* S& P" _7 B' Z GPIOPinWrite(SOC_GPIO_0_REGS, AD7606_PAR_CONVST, GPIO_PIN_LOW);2 [, u$ a8 o9 h6 ?$ U$ V, E; [1 s6 P
/ a8 G$ k, ^3 {* M6 {1 Y$ c, [ GPIODirModeSet(SOC_GPIO_0_REGS, AD7606_PAR_RD, GPIO_DIR_OUTPUT);
) `: @( d7 Z2 M- z GPIOPinWrite(SOC_GPIO_0_REGS, AD7606_PAR_RD, GPIO_PIN_HIGH);6 \ |7 G! T$ `
" n7 `# B, h, z) \1 M7 j}( r. E$ j, {/ o6 s0 w" q
9 c$ Y1 S! g) |/ d( g7 P9 Y8 _5 V# K7 b/ Y. @5 i
static void ad7606_busy_hwi(UArg ad_addr) {
+ c4 a4 J8 I+ c. i( }& Y# J O8 E6 [* o$ G7 }- ]" w
3 D) S7 a6 {' H7 H' O
/* Disable the interrupts for pins of bank AD7606_PAR_BUSY in GPIO.*// Q; [& u0 g# t* c0 s
GPIOBankIntDisable(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_GPIO_BANK); //用仿真器debug,发现程序能进入这里。
3 u, f" F4 B' Y7 E3 _* ]6 Y& r, I+ v# g9 m2 ~1 M
if(GPIOPinIntStatus(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_V1) == GPIO_INT_PEND)
& {4 u D0 E; p- m8 r8 P& b {. V/ J4 {' _ @. q
GPIOPinIntClear(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_V1); //问题是:用仿真器debug,发现程序不能进入这里。7 \9 L& [" @. g5 z
cs_addr = SOC_EMIFA_CS5_ADDR ;
- ?- H1 a0 V8 l% } internal = 0 ;
; m1 }* I7 o+ B3 Q" J5 K int_flag[0] = 1 ; m0 F% a" \2 W. c9 e/ j- V
}9 Z* e W+ Q8 v
if(GPIOPinIntStatus(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_V2) == GPIO_INT_PEND)5 T" [% a- ^& [% X+ J
{% c1 t9 b- K' j# r* K5 ~
GPIOPinIntClear(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_V2); //问题是:用仿真器debug,发现程序不能进入这里。3 l6 r1 [$ V4 i* d+ x6 l
cs_addr = SOC_EMIFA_CS4_ADDR ;
( C6 t. p: t0 [0 {; o2 x2 [ internal = 6 ;
8 t- W+ p. T+ C/ i' S; X int_flag[1] = 1 ;# e9 l. \& ]* o: {. H
}
( |4 b8 T. p& L# t/ A8 H6 @ if(GPIOPinIntStatus(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_C) == GPIO_INT_PEND)4 n- J8 Y6 l3 A! a( V& e6 U
{
: R+ L1 R( W5 g/ I& r8 g GPIOPinIntClear(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_C); //问题是:用仿真器debug,发现程序不能进入这里。
" m \/ n6 e4 {. g+ F3 u cs_addr = SOC_EMIFA_CS2_ADDR ;+ Y% e! j: S* c$ `2 }; |
internal = 12 ;* `* z7 v E1 |5 E5 X
int_flag[2] = 1 ;& m' \2 ]2 g8 A! U8 y3 X
}6 A' j; r' M6 [! Y& y+ G
1 t+ Y5 R- m; B {, ?# K! t3 n
GPIOPinWrite(SOC_GPIO_0_REGS, AD7606_PAR_CONVST, GPIO_PIN_LOW);6 u0 y$ Y& ?& U+ b+ `& B" f( ~6 X
* Y; U H3 g1 Z4 ~& y
GPIOBankIntEnable(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_GPIO_BANK);" M! d- \. F! _- d
}
. K& z! o1 \4 f" K, ~2 p) b+ B" g' c5 G. Q1 G, O% N \
|
|