|
您好。使用GPIO中断时,中断能进入ISR,但是不能区分具体的GPIO端口。程序如下:
0 \6 J; {3 ]* e#define AD7606_PAR_BUSY_GPIO_BANK 5) v: n) H( T* d2 ]3 Y, G
#define AD7606_PAR_BUSY_GPIO_BANK_INT SYS_INT_GPIO_B5INT
( U. q2 l4 k% N4 i' E0 ] [: s r9 Q" P, \- u
#define AD7606_PAR_BUSY_V1 GPIO_TO_PIN(5, 11) //BANK5的中断口5.11/ |3 _) H# w* v* O1 @# h1 R
#define AD7606_PAR_BUSY_V2 GPIO_TO_PIN(5, 9) //BANK5的中断口5.9
9 E5 p' e- }) S$ F; k#define AD7606_PAR_BUSY_C GPIO_TO_PIN(5, 5) //BANK5的中断口5.5
& m* |3 n- i! U#define AD7606_PAR_BUSY GPIO_TO_PIN(5, 4)
) r( g: n; G2 w3 k% }5 m
. [" n# V* ?# c( m6 J! Q) y5 v#define AD7606_PAR_CONVST GPIO_TO_PIN(5, 1)
+ u$ N4 i r/ W/ |( O#define AD7606_PAR_RD GPIO_TO_PIN(5, 2)% `- ]6 j0 z0 b! o+ h
#define AD7606_PAR_RESET GPIO_TO_PIN(5, 0)) J8 J4 |+ e: Y0 d% S: T n
/ q% O) |3 [0 @. O1 h" Q4 j) A0 R: H$ L1 c
' K3 h2 a# K( Jstatic void ad7606_irq_setup(ad7606 *ad) {5 p, h+ S. l( n
Hwi_Params hwiParams;5 ]3 |" S/ ]* L& ^+ o
Hwi_Handle myHwi;
/ d0 E3 m4 |$ L( K. L Error_Block eb;
) h) b: \0 X( y3 Q" Y# ~
7 Y8 [" f/ _ p) l* e Error_init(&eb);
$ ?" c6 o+ ~6 m7 Y9 a Hwi_Params_init(&hwiParams);7 [+ f4 H/ @( w6 R2 d( O j
hwiParams.arg = (unsigned int)ad;
0 B6 W& @4 u" T/ _( n; G: H( { hwiParams.enableInt = FALSE;2 E3 h7 ]( u0 U2 S5 @* K& l
hwiParams.eventId = SYS_INT_GPIO_B5INT;9 W v- Q* K4 r
hwiParams.priority = 4;, p! @. }( h* B& h
myHwi = Hwi_create(8, ad7606_busy_hwi, &hwiParams, &eb); //注册BANK5中断处理函数+ J& E) s* y- q$ f; D8 u
if (myHwi == NULL) , P4 o1 _- [ L X( S
LOG_FATAL("failed to create hwi");- O, q6 f# ^) N) }6 Q) w( I/ ?
& ]2 Q; _$ y3 K% }" Q /* enable both interrupts */
# v' M( I, G5 N1 \5 J; T Hwi_enableInterrupt(ad->irq_event);
! c O! B; Q" h/ x3 \}; ?! c% m! R' a0 q* u
/ Z* j* O( y9 [% q
! [7 w/ w4 d) y/ V9 Rstatic void ad7606_gpio_pinmux_setup(ad7606 *ad) {
9 I" {' l) |4 q2 s& I4 L1 L) _# O volatile unsigned int savePinMux = 0;
- m0 C8 x3 D0 V# d8 y( l9 w //初始化5.11、5.9 、 5.5为GPIO口' f. T0 @/ w8 o+ b% K
savePinMux = HWREG(SOC_SYSCFG_0_REGS + SYSCFG0_PINMUX(11)) & (~(SYSCFG_PINMUX11_PINMUX11_27_24 | SYSCFG_PINMUX11_PINMUX11_19_16));: V# E$ G& k% V0 N1 C% V, n# b
) q% @) s% q, ]" p0 M HWREG(SOC_SYSCFG_0_REGS + SYSCFG0_PINMUX(11)) = (PINMUX11_BUSY_V1_ENABLE | PINMUX11_BUSY_V2_ENABLE | savePinMux);
' f- u# d. v$ v9 H8 V
6 z/ E: `! n% @2 p 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));
5 l" {! V: c2 F0 K- A7 ~* _9 k! c
% [- R8 q6 d% \' {7 _# f* I HWREG(SOC_SYSCFG_0_REGS + SYSCFG0_PINMUX(12)) = (PINMUX12_RESET_ENABLE | PINMUX12_CONVST_ENABLE | PINMUX12_RD_ENABLE | PINMUX12_BUSY_C_ENABLE | savePinMux);! l# f( r! B0 E
; n' J& Y" Y/ p3 E}
1 S d8 g: V" Q& x4 L9 E' x- f/ b% o1 Z* F
/ j5 m, x+ y$ ~1 I; h) l5 fstatic void ad7606_gpio_setup(ad7606 *ad) { ^" ]( C: M5 x$ W
/*Set the AD7606_PAR_BUSY to the input mode*/% g, e/ a* L! ?5 @' J: j2 F% H
//初始化5.11、5.9 、 5.5为中断口
' z; h4 W1 d* R- M ?5 f. A; R+ z( I- n GPIODirModeSet(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_V1, GPIO_DIR_INPUT);
* t4 n, E7 W. P9 Q GPIODirModeSet(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_V2, GPIO_DIR_INPUT);# a Y" i7 Y& w) K
GPIODirModeSet(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_C, GPIO_DIR_INPUT);2 d8 Q7 E% q, }9 V% F
//GPIODirModeSet(SOC_GPIO_0_REGS, AD7606_PAR_BUSY, GPIO_DIR_INPUT);. Y# \4 b8 J8 a$ f6 K, B, D
/*Set the AD7606_PAR_BUSY to the Falling Edge Interrupt*/# g9 E1 o ?$ M/ b" l$ l
GPIOIntTypeSet(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_V1, GPIO_INT_TYPE_FALLEDGE);
9 G% |! J5 V$ T$ E) O5 W- m3 | GPIOIntTypeSet(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_V2, GPIO_INT_TYPE_FALLEDGE);
7 v; W8 @4 H0 f' `; y- ]8 n! [ GPIOIntTypeSet(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_C, GPIO_INT_TYPE_FALLEDGE);5 u% _; X+ c* W* K" F2 A3 N
//GPIOIntTypeSet(SOC_GPIO_0_REGS, AD7606_PAR_BUSY, GPIO_INT_TYPE_FALLEDGE);
% U3 L }1 L4 X1 c9 `- n /*The interrupt setting allows AD7606_PAR_BUSY_GPIO_BANK*/# w! {) f$ s; {; G K+ L
GPIOBankIntEnable(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_GPIO_BANK);
+ {# o. A3 k/ c2 w0 a! D3 n, S0 A! o# f, w( l
GPIODirModeSet(SOC_GPIO_0_REGS, AD7606_PAR_RESET, GPIO_DIR_OUTPUT);
- ^/ z& }$ E7 O, N4 k GPIOPinWrite(SOC_GPIO_0_REGS, AD7606_PAR_RESET, GPIO_PIN_HIGH);
" I$ o: H- r V m Task_sleep(1000);
8 D) c4 a! H: z7 V GPIOPinWrite(SOC_GPIO_0_REGS, AD7606_PAR_RESET, GPIO_PIN_LOW);
6 v: ]& C, Z ~' ~4 s6 C$ b7 | Task_sleep(1000);. F' i$ |9 V; J" o3 D+ A
: ]' @/ G( w5 _ /*Set the AD7606_PAR_CONVST to output mode*/
# ]5 ^- l' @- i& ^ GPIODirModeSet(SOC_GPIO_0_REGS, AD7606_PAR_CONVST, GPIO_DIR_OUTPUT);. }8 B3 b1 R: y: y) n# x
GPIOPinWrite(SOC_GPIO_0_REGS, AD7606_PAR_CONVST, GPIO_PIN_LOW);
, K2 @) C8 H, r; N$ Q3 k+ k# b" u' V; F5 X$ e" A, [7 G! i/ ^
GPIODirModeSet(SOC_GPIO_0_REGS, AD7606_PAR_RD, GPIO_DIR_OUTPUT);
( h' \1 o5 Y" m m# B GPIOPinWrite(SOC_GPIO_0_REGS, AD7606_PAR_RD, GPIO_PIN_HIGH);' @! M( i+ z. a1 V0 S9 d, J
) d" }( Y8 E& k1 |9 E4 O}
) n+ k' l, a( \; A! h; }8 m! H7 S" V S2 u( E+ C
$ q0 S( }4 Q/ ~' R4 G7 [- Bstatic void ad7606_busy_hwi(UArg ad_addr) {2 d3 Q* @0 `+ C! ?7 h6 d! d5 d
Z2 N, X0 a/ f+ ^/ w8 ^, ~1 X! [! C+ z% `: o' [6 e- s
/* Disable the interrupts for pins of bank AD7606_PAR_BUSY in GPIO.*/
4 O' m) z3 O% ^$ Q GPIOBankIntDisable(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_GPIO_BANK); //用仿真器debug,发现程序能进入这里。
1 K( }/ P9 S; i6 r
1 T; S1 x/ s" B. {& f5 ?( ` if(GPIOPinIntStatus(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_V1) == GPIO_INT_PEND) a, v) `! K" e+ {' H# R3 U
{
4 s, T' B2 [$ W G/ k GPIOPinIntClear(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_V1); //问题是:用仿真器debug,发现程序不能进入这里。, Y$ i/ [$ x' F1 B# n
cs_addr = SOC_EMIFA_CS5_ADDR ;1 e9 \7 Y' I" @8 ]0 w# |
internal = 0 ;
& [. n; K$ V L9 F int_flag[0] = 1 ;& C) q9 O n! `- X. X8 a0 S
}
2 B2 v0 _2 t; l. ?9 @" t8 o/ u if(GPIOPinIntStatus(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_V2) == GPIO_INT_PEND)
& V$ H. w; V1 N& t {
5 k9 b& D6 b! b/ V, C$ A GPIOPinIntClear(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_V2); //问题是:用仿真器debug,发现程序不能进入这里。
& ]/ Y6 C' S# w, p8 o$ x cs_addr = SOC_EMIFA_CS4_ADDR ;
6 z* ], ^8 g/ T. `3 o6 b$ _# u8 G internal = 6 ;3 m: _5 m* u8 A+ j
int_flag[1] = 1 ;
5 Y3 G/ u/ m, L, M }
2 t- q" M( R2 t5 \' M" ?& G if(GPIOPinIntStatus(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_C) == GPIO_INT_PEND)
& Z, V, I/ u; d4 z8 x( v {
' L2 Y2 j9 {$ F GPIOPinIntClear(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_C); //问题是:用仿真器debug,发现程序不能进入这里。! s3 n' A0 i! w' t8 H6 I* D0 ?
cs_addr = SOC_EMIFA_CS2_ADDR ;
, k7 i! T# f3 r7 [1 e( V5 E internal = 12 ;
3 C% _! U8 w5 j9 o l int_flag[2] = 1 ;9 k, ^; j" y$ @6 X' e
}. L8 k' P2 T$ T6 x6 f
4 d4 K0 Z' P' O4 E8 Y
GPIOPinWrite(SOC_GPIO_0_REGS, AD7606_PAR_CONVST, GPIO_PIN_LOW);; p _) K6 L' _ z9 L P g
8 C9 [, j: n& D" p. G8 H8 F9 @
GPIOBankIntEnable(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_GPIO_BANK);
4 ~# M- F4 c5 I8 B, O}
+ w8 Y8 p9 |; h' b9 V; n
" Q9 E1 H! E/ u4 Q: P2 m
) a; `. q0 o7 w/ D1 L, `
- p3 B5 t. ~. @8 t2 X6 y, m0 ~7 W% E! D$ `" |" Y' F8 G/ J
|
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
|