|
|
您好。使用GPIO中断时,中断能进入ISR,但是不能区分具体的GPIO端口。程序如下:
( r2 o2 [7 ?0 `) h+ ?' h#define AD7606_PAR_BUSY_GPIO_BANK 5
8 G3 _( o* n5 e* R+ X* f: m#define AD7606_PAR_BUSY_GPIO_BANK_INT SYS_INT_GPIO_B5INT3 J: g U, C: b' ~6 U
5 ^# d. b' I/ f" t* i( [) _
#define AD7606_PAR_BUSY_V1 GPIO_TO_PIN(5, 11) //BANK5的中断口5.11
! V+ J1 e; H9 a/ n3 x i#define AD7606_PAR_BUSY_V2 GPIO_TO_PIN(5, 9) //BANK5的中断口5.9& G( P. p9 u2 R8 D
#define AD7606_PAR_BUSY_C GPIO_TO_PIN(5, 5) //BANK5的中断口5.53 [6 c+ i8 s) F: z
#define AD7606_PAR_BUSY GPIO_TO_PIN(5, 4)3 s1 f7 s" u5 q3 O/ l! i9 h
# | w: r( l& A#define AD7606_PAR_CONVST GPIO_TO_PIN(5, 1)' j/ |0 w7 Y8 @2 K; k$ R
#define AD7606_PAR_RD GPIO_TO_PIN(5, 2)/ W: a# u% @6 ~* n8 L
#define AD7606_PAR_RESET GPIO_TO_PIN(5, 0)
& V+ J, \0 b5 i5 }; W# y
! Q: C6 f! d2 A# l& t4 v/ m' I) b) l7 W9 b! P h
5 w4 l- f/ ]% astatic void ad7606_irq_setup(ad7606 *ad) {+ h8 r. ] B+ ~. [( [! {) y
Hwi_Params hwiParams;
% ~! A( B" {9 Q a Hwi_Handle myHwi;8 ?3 k) v2 V$ W/ a: B. q
Error_Block eb;" ?3 `- h u' X" R1 O
- f" N- U+ T( B
Error_init(&eb);8 Z) L* M3 [) K5 n4 Z8 z3 e
Hwi_Params_init(&hwiParams);
7 t' N: t3 E. Q1 q+ E0 m hwiParams.arg = (unsigned int)ad;7 X @. W6 N$ u
hwiParams.enableInt = FALSE;8 I3 _- w* _; R. l% n
hwiParams.eventId = SYS_INT_GPIO_B5INT;
( M4 c* m' ]; y3 `( J h6 e hwiParams.priority = 4;) G: g9 {. m0 d$ P
myHwi = Hwi_create(8, ad7606_busy_hwi, &hwiParams, &eb); //注册BANK5中断处理函数+ M2 Q. ?5 g9 @! B7 D! Y
if (myHwi == NULL)
& z E- _! u5 G- u; | LOG_FATAL("failed to create hwi");& y+ w: |- T' W6 e- W: s( U
2 j0 M, P. [+ X9 N7 H, e3 y
/* enable both interrupts */& j( N6 p/ }5 y$ a7 T# }: B
Hwi_enableInterrupt(ad->irq_event); P' q+ @2 i) q7 T$ f3 W( O& @
}
2 R( [! w0 b n, V4 f
8 Q( r" n% J. `' V( d& a8 S. U( P" b# E3 J: W7 @2 K+ k
static void ad7606_gpio_pinmux_setup(ad7606 *ad) {
0 d1 _7 ?( r1 W8 B volatile unsigned int savePinMux = 0;" r4 u$ e- b5 u6 e M# w- b0 U
//初始化5.11、5.9 、 5.5为GPIO口4 U: y, X& m# ]* J
savePinMux = HWREG(SOC_SYSCFG_0_REGS + SYSCFG0_PINMUX(11)) & (~(SYSCFG_PINMUX11_PINMUX11_27_24 | SYSCFG_PINMUX11_PINMUX11_19_16));
4 u+ D* y! t' m7 E2 e. t; }; Q; \, r. J$ ]& r) u& O
HWREG(SOC_SYSCFG_0_REGS + SYSCFG0_PINMUX(11)) = (PINMUX11_BUSY_V1_ENABLE | PINMUX11_BUSY_V2_ENABLE | savePinMux);. L. X; B3 ~( L5 V; Q$ t% H2 c
6 I- g& A5 B$ e" d6 l. b7 Q I
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 g+ E/ x1 g5 f: J. `4 h& Y
2 p# _8 ?( W/ U! m2 S" M HWREG(SOC_SYSCFG_0_REGS + SYSCFG0_PINMUX(12)) = (PINMUX12_RESET_ENABLE | PINMUX12_CONVST_ENABLE | PINMUX12_RD_ENABLE | PINMUX12_BUSY_C_ENABLE | savePinMux);
- y5 \; z. n& A4 L# s7 O& Z9 _6 i0 x
}
F; g6 p* s/ P/ l8 [& r8 f+ P1 f( _2 M$ J9 H6 Y
5 J$ Q$ S# b# z; N+ S( N
static void ad7606_gpio_setup(ad7606 *ad) {, k3 a3 d0 [& z* K6 t
/*Set the AD7606_PAR_BUSY to the input mode*/6 A2 W9 A: w: Y2 p2 T7 ~3 O& _( h
//初始化5.11、5.9 、 5.5为中断口+ l9 H4 Y+ X- H1 Y7 l
GPIODirModeSet(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_V1, GPIO_DIR_INPUT);
2 Y; v! y0 Z4 p6 v/ g0 E# `2 } GPIODirModeSet(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_V2, GPIO_DIR_INPUT);
9 d7 N9 G" M. _( v% r `; n GPIODirModeSet(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_C, GPIO_DIR_INPUT); ~. O4 |- O! T" F; |
//GPIODirModeSet(SOC_GPIO_0_REGS, AD7606_PAR_BUSY, GPIO_DIR_INPUT);
5 n. w, P! ~$ a5 V0 C+ X! B /*Set the AD7606_PAR_BUSY to the Falling Edge Interrupt*/
) v) B9 X' R$ d+ R6 N N- u GPIOIntTypeSet(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_V1, GPIO_INT_TYPE_FALLEDGE);
! Z D" i5 k/ @ GPIOIntTypeSet(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_V2, GPIO_INT_TYPE_FALLEDGE);
# w G. R8 b' i" | GPIOIntTypeSet(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_C, GPIO_INT_TYPE_FALLEDGE);3 C9 D! g( ]6 `
//GPIOIntTypeSet(SOC_GPIO_0_REGS, AD7606_PAR_BUSY, GPIO_INT_TYPE_FALLEDGE);3 i9 q2 n+ |( x
/*The interrupt setting allows AD7606_PAR_BUSY_GPIO_BANK*/. s$ d! I: D+ w* R( W
GPIOBankIntEnable(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_GPIO_BANK);
- H$ `3 a# t& G/ k" ?: s9 w- }) c3 @- u$ t
GPIODirModeSet(SOC_GPIO_0_REGS, AD7606_PAR_RESET, GPIO_DIR_OUTPUT);: w, n2 t5 l" i
GPIOPinWrite(SOC_GPIO_0_REGS, AD7606_PAR_RESET, GPIO_PIN_HIGH);' z# n0 i( k; q, ~. r1 \" q
Task_sleep(1000);
! ~, U7 \( j* e- s GPIOPinWrite(SOC_GPIO_0_REGS, AD7606_PAR_RESET, GPIO_PIN_LOW);
! b0 g8 j) T: n e; { Task_sleep(1000);6 }4 M4 _0 k$ z. m% S& u! {; D
: x9 n6 R+ N/ `8 c
/*Set the AD7606_PAR_CONVST to output mode*/9 |6 M' a& ~" w- X6 c- U% c
GPIODirModeSet(SOC_GPIO_0_REGS, AD7606_PAR_CONVST, GPIO_DIR_OUTPUT);* t6 z8 z; `0 E, r4 I& }9 S# h6 {
GPIOPinWrite(SOC_GPIO_0_REGS, AD7606_PAR_CONVST, GPIO_PIN_LOW);/ x# E1 R% R+ ~1 h% ^# z* v
# b9 |9 s! g0 L6 p6 p
GPIODirModeSet(SOC_GPIO_0_REGS, AD7606_PAR_RD, GPIO_DIR_OUTPUT);* e9 ]1 X6 a& M) f7 N5 D O
GPIOPinWrite(SOC_GPIO_0_REGS, AD7606_PAR_RD, GPIO_PIN_HIGH);
) j. _- p5 z4 h8 K b% c
% s8 _+ s2 \* j' ?}4 |$ A2 @: z1 q1 P
( A# B% {+ r# X6 h& O5 |) u6 q* j
! Z/ _0 q/ I/ e& @static void ad7606_busy_hwi(UArg ad_addr) {- b; e! n, \' I6 p
# F; y1 l1 ~' }8 R0 l' Z# v* r
, j1 _' }% j' r: Y. z' u; U /* Disable the interrupts for pins of bank AD7606_PAR_BUSY in GPIO.*/ F# s( [# h2 Y2 X, D: F
GPIOBankIntDisable(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_GPIO_BANK); //用仿真器debug,发现程序能进入这里。6 [" e% F6 _# G+ ~, {7 L2 `
3 w6 }5 K5 L( z6 [0 f* }8 O0 }; t8 m
if(GPIOPinIntStatus(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_V1) == GPIO_INT_PEND)
% c( x! g& g8 b7 F K( G( J {% l3 r: {) ], D& j
GPIOPinIntClear(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_V1); //问题是:用仿真器debug,发现程序不能进入这里。0 C* v6 b% J6 C- w% I' Z5 n# k; d
cs_addr = SOC_EMIFA_CS5_ADDR ;& t1 H8 `6 n s6 O+ e3 E% |- \: J
internal = 0 ;
/ w- ]' a6 P2 _2 }3 } int_flag[0] = 1 ;) z: z4 x5 y5 q6 a: p% L3 N
}
6 p$ N) F* G) ^8 { if(GPIOPinIntStatus(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_V2) == GPIO_INT_PEND)
1 v% v1 N0 p* i. F1 P3 [ {9 i9 E: Y6 A) G6 g
GPIOPinIntClear(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_V2); //问题是:用仿真器debug,发现程序不能进入这里。
- z$ c( ~# L0 m4 y. M1 _ cs_addr = SOC_EMIFA_CS4_ADDR ;
1 X) s; u- t' q, T internal = 6 ;# _+ N' R! V6 r3 d: ^7 l
int_flag[1] = 1 ; ?3 [! K6 Q5 w6 o9 }
}
' S& o2 K" I/ h: O m$ A+ X if(GPIOPinIntStatus(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_C) == GPIO_INT_PEND) A% q' \$ n, V$ H& K
{
; V! x9 e& z0 ?. a4 _ GPIOPinIntClear(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_C); //问题是:用仿真器debug,发现程序不能进入这里。
% s) V4 ]: r, F: c$ { cs_addr = SOC_EMIFA_CS2_ADDR ;
) ^. W1 U5 Z1 S3 d! @ internal = 12 ;
* ^" W4 W+ R( P0 R. v" f int_flag[2] = 1 ;+ p* Z, e, t9 O6 H7 z
}& Q# F9 v4 N' b2 F* _( N `6 T
9 F3 L& r* z+ O! @" r GPIOPinWrite(SOC_GPIO_0_REGS, AD7606_PAR_CONVST, GPIO_PIN_LOW);4 b h% v* ^$ w& m) \
* N9 i. V. l' F GPIOBankIntEnable(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_GPIO_BANK);# q( E/ E/ i F- P+ W. Z: I
}1 K$ |: f! k& P
0 l& l& D% v/ h/ E+ d. b0 r6 F7 C' G& U+ \' U
( m5 Q3 R& U Q
h8 q. r0 ~6 @2 a |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
|