|
|
您好。使用GPIO中断时,中断能进入ISR,但是不能区分具体的GPIO端口。程序如下:+ t! i9 @ u8 ~1 U( `
#define AD7606_PAR_BUSY_GPIO_BANK 5* u- f/ z! w# f5 o v
#define AD7606_PAR_BUSY_GPIO_BANK_INT SYS_INT_GPIO_B5INT
9 T/ } x2 a: d5 P# q) [
4 w5 d) U% y- e: F% D, h+ A" i#define AD7606_PAR_BUSY_V1 GPIO_TO_PIN(5, 11) //BANK5的中断口5.11
2 {( D' \+ T+ `#define AD7606_PAR_BUSY_V2 GPIO_TO_PIN(5, 9) //BANK5的中断口5.9
* g) a, |6 Y Y8 o7 B' T5 X; W2 J% Z#define AD7606_PAR_BUSY_C GPIO_TO_PIN(5, 5) //BANK5的中断口5.5+ o, y) t7 a6 C- ^
#define AD7606_PAR_BUSY GPIO_TO_PIN(5, 4)
# H2 |, d4 s' r# C: @# N) e4 w3 q; {0 v3 C3 ?* d k1 e7 w5 I
#define AD7606_PAR_CONVST GPIO_TO_PIN(5, 1)
2 u3 b/ P' U: ^' R9 K# I% Z- R/ `3 R#define AD7606_PAR_RD GPIO_TO_PIN(5, 2)
- k2 v5 _+ T! t: a#define AD7606_PAR_RESET GPIO_TO_PIN(5, 0)% M- W& y( R$ g* d
1 |, Q( ?. \' w r' R) M3 O$ w
- C, t2 S; C6 X* a# o- Y( v" c! m% @: K& U1 {
static void ad7606_irq_setup(ad7606 *ad) {0 \- `5 v- h) L+ m; ]7 W, E( B3 y
Hwi_Params hwiParams;
0 Q7 d1 J0 ^ q Hwi_Handle myHwi;2 S- P- J% R3 {
Error_Block eb;) X" z9 i: a% E- Z# t
* N, ?: l8 |. I* ]
Error_init(&eb);
& f( O% D4 ^. _0 m$ H! P J Hwi_Params_init(&hwiParams);/ F. y# O/ S2 c, ]( v0 @; |# w- ^
hwiParams.arg = (unsigned int)ad;
& y# _# l- G/ w7 _( F hwiParams.enableInt = FALSE;
. @7 E0 E9 I7 I" Q* W& H hwiParams.eventId = SYS_INT_GPIO_B5INT;
- A E5 Q2 A1 `# y hwiParams.priority = 4;9 D2 y4 U3 w" @) c# j3 @. g
myHwi = Hwi_create(8, ad7606_busy_hwi, &hwiParams, &eb); //注册BANK5中断处理函数
& x" C L. X7 f3 g6 k" c1 C2 r8 l if (myHwi == NULL) # X, f+ h. h" Y; }# ?
LOG_FATAL("failed to create hwi");/ d {+ U5 m6 R5 H V& O
9 v( F4 z) T. {6 R0 b /* enable both interrupts */
) e- R% n& Q/ z2 [) o, k4 T Hwi_enableInterrupt(ad->irq_event);) y, X+ W( I0 Z, s) B2 Q
}0 [$ J& _7 t8 | B! R; }* h
$ ~6 C K& q5 }- U; l3 W
: L) k. f7 |* [# j- O! y( Z- h: T' Sstatic void ad7606_gpio_pinmux_setup(ad7606 *ad) {* {' p& k5 B9 `* l( |, `
volatile unsigned int savePinMux = 0;* S, C1 u$ U) r9 f* H
//初始化5.11、5.9 、 5.5为GPIO口
& H _+ F! z e* U3 s5 ~ J savePinMux = HWREG(SOC_SYSCFG_0_REGS + SYSCFG0_PINMUX(11)) & (~(SYSCFG_PINMUX11_PINMUX11_27_24 | SYSCFG_PINMUX11_PINMUX11_19_16));4 m3 H% n7 V! m' p, a& `
) ^/ ^3 C' u' s- K* I* O1 ? HWREG(SOC_SYSCFG_0_REGS + SYSCFG0_PINMUX(11)) = (PINMUX11_BUSY_V1_ENABLE | PINMUX11_BUSY_V2_ENABLE | savePinMux);3 t; R. m G) A/ z% W9 A. E. o
9 R* z- |6 {0 e9 Z$ D) L+ z9 P$ P6 S 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));
, R4 x1 H7 l: K/ y5 B5 Y7 I. K9 S
- P+ z$ N3 z; y' h, [+ V HWREG(SOC_SYSCFG_0_REGS + SYSCFG0_PINMUX(12)) = (PINMUX12_RESET_ENABLE | PINMUX12_CONVST_ENABLE | PINMUX12_RD_ENABLE | PINMUX12_BUSY_C_ENABLE | savePinMux);, B5 w* V6 j( G$ y# W
3 |( G7 w2 q. E4 e# q* g. P
}
3 d7 s, |$ d) h9 P- C6 V( p [+ G% r. R S* s
0 R8 ]. K( ?( j! w6 S
static void ad7606_gpio_setup(ad7606 *ad) {5 i" B8 c0 A) ^: z. z% x
/*Set the AD7606_PAR_BUSY to the input mode*/
% V0 E6 w6 G7 V( ] //初始化5.11、5.9 、 5.5为中断口* ?5 S; ?$ M [& \4 l
GPIODirModeSet(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_V1, GPIO_DIR_INPUT);! r4 k7 D1 V+ W T
GPIODirModeSet(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_V2, GPIO_DIR_INPUT);) ^- b9 T: i& m
GPIODirModeSet(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_C, GPIO_DIR_INPUT); C' H6 H) z* Z+ l3 r
//GPIODirModeSet(SOC_GPIO_0_REGS, AD7606_PAR_BUSY, GPIO_DIR_INPUT);
, C: D) ~: k& T/ @4 g+ q /*Set the AD7606_PAR_BUSY to the Falling Edge Interrupt*/
1 K) ?1 e H S4 M) v$ J A' y GPIOIntTypeSet(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_V1, GPIO_INT_TYPE_FALLEDGE);% [' I, _" M% C
GPIOIntTypeSet(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_V2, GPIO_INT_TYPE_FALLEDGE);
( y# N1 }+ |0 t) X3 u u2 F GPIOIntTypeSet(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_C, GPIO_INT_TYPE_FALLEDGE);8 E7 T- v. m% D' Y g7 B. h
//GPIOIntTypeSet(SOC_GPIO_0_REGS, AD7606_PAR_BUSY, GPIO_INT_TYPE_FALLEDGE);! A! Z1 V- W0 j$ e0 G3 c' W
/*The interrupt setting allows AD7606_PAR_BUSY_GPIO_BANK*/! u6 z5 Y1 K2 E# C1 H+ Z* U4 S
GPIOBankIntEnable(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_GPIO_BANK);: t6 ~) H( b) L5 u9 o( }
3 l) Z) A9 v w' I; f" C& y GPIODirModeSet(SOC_GPIO_0_REGS, AD7606_PAR_RESET, GPIO_DIR_OUTPUT);
4 G; J$ `- d7 G: `* ]" d | GPIOPinWrite(SOC_GPIO_0_REGS, AD7606_PAR_RESET, GPIO_PIN_HIGH); a3 M+ O: s, M
Task_sleep(1000);& w" G1 K( [6 ?4 ?1 a
GPIOPinWrite(SOC_GPIO_0_REGS, AD7606_PAR_RESET, GPIO_PIN_LOW);3 z# x4 h# T; P* U! l! y- U/ f
Task_sleep(1000);: J7 w5 k, u0 O5 Q' W
9 O/ O$ Z* P; j) o }
/*Set the AD7606_PAR_CONVST to output mode*/
4 @6 `) x" h7 E% ~$ o GPIODirModeSet(SOC_GPIO_0_REGS, AD7606_PAR_CONVST, GPIO_DIR_OUTPUT);: g( T3 r5 Q8 R. s' T, W9 v
GPIOPinWrite(SOC_GPIO_0_REGS, AD7606_PAR_CONVST, GPIO_PIN_LOW);! }" g: x4 O& E) {
3 j& Z- `& a2 N% I9 a+ {
GPIODirModeSet(SOC_GPIO_0_REGS, AD7606_PAR_RD, GPIO_DIR_OUTPUT);3 S5 f& N. u: D
GPIOPinWrite(SOC_GPIO_0_REGS, AD7606_PAR_RD, GPIO_PIN_HIGH);1 s' a8 k0 E1 q; G2 r' k5 }" J5 p, ]6 u
0 B) I; F) Z7 s% {5 g" L# E" x}1 T) {0 p( G1 Z8 H5 N, d
r: v p4 Y" p" x Y' D6 m" H! c- ~1 _5 q, H! ^: Z
static void ad7606_busy_hwi(UArg ad_addr) {0 ]4 ]( E; [+ R
& E1 j' c" k, a: h v3 ]% B2 o# x* u4 A9 U; `: H
/* Disable the interrupts for pins of bank AD7606_PAR_BUSY in GPIO.*/4 M- P. w/ k0 J" B* ^: K, N+ r
GPIOBankIntDisable(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_GPIO_BANK); //用仿真器debug,发现程序能进入这里。
^/ {& x' b# @% e, e+ a6 d9 o; [- p5 t
if(GPIOPinIntStatus(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_V1) == GPIO_INT_PEND) _. X4 H q& R
{
( l9 i$ L+ j) G. b8 s- K5 q GPIOPinIntClear(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_V1); //问题是:用仿真器debug,发现程序不能进入这里。& I, |1 t+ H+ A7 v. G2 R0 s
cs_addr = SOC_EMIFA_CS5_ADDR ;
4 Y8 T3 ]# F1 j internal = 0 ;# z/ w$ z" s. e* x* Y
int_flag[0] = 1 ;
; o$ h* M* O2 r! w }; c& M. L" m8 ^$ d0 b
if(GPIOPinIntStatus(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_V2) == GPIO_INT_PEND)4 t. ?- T _9 L
{* S9 d# z! c( a. d8 |) D6 c
GPIOPinIntClear(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_V2); //问题是:用仿真器debug,发现程序不能进入这里。0 w/ S$ Y0 t2 |% J6 }7 ?
cs_addr = SOC_EMIFA_CS4_ADDR ;+ w1 Q) G; O0 d* X
internal = 6 ;
9 P' {! q" @9 w8 \2 O! S int_flag[1] = 1 ;! }4 f; ]! E- H& J3 h( |
}& Z# t% L* F9 C* o: y
if(GPIOPinIntStatus(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_C) == GPIO_INT_PEND)
- r. o/ n% Q; }1 E) ^: s {" p) K2 ]5 C% d9 t& q( C
GPIOPinIntClear(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_C); //问题是:用仿真器debug,发现程序不能进入这里。: i; p. P, n1 r- E+ d, F
cs_addr = SOC_EMIFA_CS2_ADDR ;
" P6 F& j1 V$ z" ], J+ ? internal = 12 ;4 y8 \9 {8 J/ A: T8 U7 G$ n! U* r
int_flag[2] = 1 ;' e) `7 B; ~" a* i; ~
}2 D8 e- e; |% L6 o) i9 ^
]6 [( l9 E$ t/ s8 ]2 s GPIOPinWrite(SOC_GPIO_0_REGS, AD7606_PAR_CONVST, GPIO_PIN_LOW);, J! G8 s. y, S6 p
, ]+ B) k( f, m
GPIOBankIntEnable(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_GPIO_BANK);+ U f$ y& X, v8 H( l
}
0 q& w& a. _# t
. m6 R Q$ X# l# P4 s' N |
|