|
您好。使用GPIO中断时,中断能进入ISR,但是不能区分具体的GPIO端口。程序如下:- [1 G7 Z+ g0 W' T2 E5 ?' o
#define AD7606_PAR_BUSY_GPIO_BANK 5% t: a0 |4 Z5 h2 R0 @) E9 S$ G; N8 _
#define AD7606_PAR_BUSY_GPIO_BANK_INT SYS_INT_GPIO_B5INT
% U3 K2 I( m8 ^$ S' `/ _$ u* V& T
# k& ?4 ~$ x+ j" g#define AD7606_PAR_BUSY_V1 GPIO_TO_PIN(5, 11) //BANK5的中断口5.11% R Q9 T; W5 v4 N* G
#define AD7606_PAR_BUSY_V2 GPIO_TO_PIN(5, 9) //BANK5的中断口5.99 o( [5 ]7 c5 e3 |
#define AD7606_PAR_BUSY_C GPIO_TO_PIN(5, 5) //BANK5的中断口5.5
3 r2 r3 f6 `) B7 j" o* t#define AD7606_PAR_BUSY GPIO_TO_PIN(5, 4)
' h6 k1 p7 I1 _) n' L. G1 D$ t' ?. a7 f! {! Y
#define AD7606_PAR_CONVST GPIO_TO_PIN(5, 1)
7 W* B! f. y% E* f; h4 S M#define AD7606_PAR_RD GPIO_TO_PIN(5, 2)0 R2 U' \# l; {& K
#define AD7606_PAR_RESET GPIO_TO_PIN(5, 0)
2 ]: D7 m5 i& O9 ~3 o+ U
; g( i& m' D A
1 K3 p2 s2 T! Y. p& q/ X1 y: F$ ?9 p. z) f0 H0 L" R
static void ad7606_irq_setup(ad7606 *ad) {
* H. m& }( k8 i0 M) P* b8 b1 d2 f Hwi_Params hwiParams;
8 G# U6 y* h2 |0 z Hwi_Handle myHwi;
& ?+ N9 o2 M) M7 u4 I \8 Q Error_Block eb;5 W; B/ j R3 z
" _& E( V. w' ]2 ` [- ?' w. B Error_init(&eb);
1 J( H2 w$ E6 G7 S# B4 B: y+ Y Hwi_Params_init(&hwiParams);$ q% n$ w# B- L4 y5 `, t# h8 r+ _# s3 ]
hwiParams.arg = (unsigned int)ad;
6 X T$ d9 w. f' j U hwiParams.enableInt = FALSE;
R. O5 }. C6 I; f! M/ f7 l$ @% r+ ^5 [ hwiParams.eventId = SYS_INT_GPIO_B5INT;2 M3 d1 O# L9 r6 _# G# b( n' p$ P6 R
hwiParams.priority = 4;
! b9 M& y, b* C1 l myHwi = Hwi_create(8, ad7606_busy_hwi, &hwiParams, &eb); //注册BANK5中断处理函数
+ e$ f; o0 m- l# s if (myHwi == NULL)
7 q0 Q7 A+ k. C5 d6 E, M LOG_FATAL("failed to create hwi");' |- C/ S" P9 k, N; e' P8 B) l
: [, O2 K6 S/ F8 S
/* enable both interrupts */
7 L+ Y; }# z, b* Z Hwi_enableInterrupt(ad->irq_event);
( ^! ?8 P+ R. L, Z5 w, l}( A" s# B0 [( y* J) z" B
) m" k& h" U# p* Y ^
$ T- l0 t0 j. Q _2 o6 s0 ?0 zstatic void ad7606_gpio_pinmux_setup(ad7606 *ad) {
7 d8 G& Q' |. [/ V$ n5 l% `. z volatile unsigned int savePinMux = 0;
) D& h, G2 @8 _* H$ t6 \5 Q //初始化5.11、5.9 、 5.5为GPIO口
/ J$ k" x) ^5 H8 y4 J) d2 c savePinMux = HWREG(SOC_SYSCFG_0_REGS + SYSCFG0_PINMUX(11)) & (~(SYSCFG_PINMUX11_PINMUX11_27_24 | SYSCFG_PINMUX11_PINMUX11_19_16));, ?" C8 \5 x8 o, `2 @# L, a
* V& a9 Q3 t n9 u% s3 m! z! y HWREG(SOC_SYSCFG_0_REGS + SYSCFG0_PINMUX(11)) = (PINMUX11_BUSY_V1_ENABLE | PINMUX11_BUSY_V2_ENABLE | savePinMux);
5 \) d/ Z# Q, Y$ ]+ z! {
" n" B, b4 L* V# n) w/ F 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));
: u1 N/ J \. h9 _, x& @
+ m+ I' H n: @ HWREG(SOC_SYSCFG_0_REGS + SYSCFG0_PINMUX(12)) = (PINMUX12_RESET_ENABLE | PINMUX12_CONVST_ENABLE | PINMUX12_RD_ENABLE | PINMUX12_BUSY_C_ENABLE | savePinMux);
1 I4 c# D) G/ j; C7 r$ P6 L1 v% A* }& ?
}
- b/ ^) X; \/ [3 W& d% A; L, i" {8 Z$ J
4 Z, R1 S( Z( |# u( [
static void ad7606_gpio_setup(ad7606 *ad) {# }: f( S f" w ?* S; \. _
/*Set the AD7606_PAR_BUSY to the input mode*/9 E* X0 A& g% [' r* N1 J% u# {0 \! j
//初始化5.11、5.9 、 5.5为中断口+ L6 n# A/ o7 B3 S. Q. w. O. _
GPIODirModeSet(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_V1, GPIO_DIR_INPUT);
( q* V! a [3 l7 [ B GPIODirModeSet(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_V2, GPIO_DIR_INPUT);! S# h+ |+ x9 X7 N5 T
GPIODirModeSet(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_C, GPIO_DIR_INPUT);
4 b8 g" m4 u2 \' U6 V //GPIODirModeSet(SOC_GPIO_0_REGS, AD7606_PAR_BUSY, GPIO_DIR_INPUT);
f" l: }' u! N5 } /*Set the AD7606_PAR_BUSY to the Falling Edge Interrupt*/; f! a; |, H" v% n, y
GPIOIntTypeSet(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_V1, GPIO_INT_TYPE_FALLEDGE);$ r/ \6 ^* m+ m% H& I9 G. u" A
GPIOIntTypeSet(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_V2, GPIO_INT_TYPE_FALLEDGE);
& p% y9 U4 k/ x4 X GPIOIntTypeSet(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_C, GPIO_INT_TYPE_FALLEDGE);5 Q. b6 J! H. B
//GPIOIntTypeSet(SOC_GPIO_0_REGS, AD7606_PAR_BUSY, GPIO_INT_TYPE_FALLEDGE);
# q w) y! E5 S1 W+ r5 ]* a /*The interrupt setting allows AD7606_PAR_BUSY_GPIO_BANK*/
3 d2 v0 K6 t9 \7 y z4 W# p GPIOBankIntEnable(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_GPIO_BANK);0 P9 v6 X0 U2 r4 @% V" U
6 o! z7 t" M2 J0 X GPIODirModeSet(SOC_GPIO_0_REGS, AD7606_PAR_RESET, GPIO_DIR_OUTPUT);
; g, T1 |( ^" N% S0 h, @, \ GPIOPinWrite(SOC_GPIO_0_REGS, AD7606_PAR_RESET, GPIO_PIN_HIGH);; r, g) @$ l# A
Task_sleep(1000);
; v, d' T) B' b GPIOPinWrite(SOC_GPIO_0_REGS, AD7606_PAR_RESET, GPIO_PIN_LOW);& K \5 W; u9 I7 r6 N
Task_sleep(1000);1 ^5 t7 x! n8 \* W! J+ G" b
5 a+ y1 `( `9 a, _) [ /*Set the AD7606_PAR_CONVST to output mode*/
2 D4 L; T0 a- E2 {2 h8 C GPIODirModeSet(SOC_GPIO_0_REGS, AD7606_PAR_CONVST, GPIO_DIR_OUTPUT);; C! M8 x0 d; B* p0 L6 I% r8 V5 a
GPIOPinWrite(SOC_GPIO_0_REGS, AD7606_PAR_CONVST, GPIO_PIN_LOW);( d' U3 n4 D# R5 Z; k
' K& { s* Z! e5 t
GPIODirModeSet(SOC_GPIO_0_REGS, AD7606_PAR_RD, GPIO_DIR_OUTPUT);
0 y9 n7 U" g) O2 d9 Q! z4 N GPIOPinWrite(SOC_GPIO_0_REGS, AD7606_PAR_RD, GPIO_PIN_HIGH);( |4 U7 y- f: C0 s
" r. L9 C+ i' o! |
}/ m5 Q; C3 a, L8 R& X1 h0 F
e+ N3 `( i8 M6 `
l; x7 {. O s7 H9 z. c5 Q" z8 Ustatic void ad7606_busy_hwi(UArg ad_addr) {5 K9 q8 j! P% H M5 Y7 I& h7 D, Z8 B
5 |% e' K4 W% Z3 U6 O L9 g! X3 h7 [8 M! Z
/* Disable the interrupts for pins of bank AD7606_PAR_BUSY in GPIO.*/ L; v; B7 v- y0 W' V2 M
GPIOBankIntDisable(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_GPIO_BANK); //用仿真器debug,发现程序能进入这里。' X' Y* }$ Q/ r5 M1 G6 k
4 [: g2 P! I- b2 }( \& l if(GPIOPinIntStatus(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_V1) == GPIO_INT_PEND)
8 g4 w8 ^- o% x7 E {
) F2 t2 K3 C+ K- i6 c GPIOPinIntClear(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_V1); //问题是:用仿真器debug,发现程序不能进入这里。
( r- {' y- g! N3 u5 Q cs_addr = SOC_EMIFA_CS5_ADDR ;
# M0 b( a- v- s) [ internal = 0 ;
% Z! r6 J, C1 }& r( u0 ~ int_flag[0] = 1 ;) z1 n4 C, y: }+ G1 m( n
}
/ }5 l' E: S: H; j- e if(GPIOPinIntStatus(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_V2) == GPIO_INT_PEND)# s6 R; y& z8 F0 C% y
{% d8 y% Q( q# c/ D5 p6 z# l* m
GPIOPinIntClear(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_V2); //问题是:用仿真器debug,发现程序不能进入这里。6 j0 j Q' T4 l; f
cs_addr = SOC_EMIFA_CS4_ADDR ;+ ` y$ j4 c% }; w( [
internal = 6 ;
- u& y h$ K+ J& Z int_flag[1] = 1 ;4 V, m/ ]3 e% p! o
}
2 @: V9 N4 Y% H if(GPIOPinIntStatus(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_C) == GPIO_INT_PEND)2 _) Y& W# W! \
{' h( V/ [. }7 ?% s& B1 v& G
GPIOPinIntClear(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_C); //问题是:用仿真器debug,发现程序不能进入这里。. T7 ~7 w' R" t0 @$ T
cs_addr = SOC_EMIFA_CS2_ADDR ;
& B* [% D: s' i9 H: k8 [: E internal = 12 ;) D2 h6 j! u/ p' @, ^' {) N% A3 b' S% \
int_flag[2] = 1 ;
( X- H1 p; }$ @0 T }- j$ v' V; f- i) K# P& O
- `2 R N' n9 R9 m k6 w9 t; t
GPIOPinWrite(SOC_GPIO_0_REGS, AD7606_PAR_CONVST, GPIO_PIN_LOW);6 i2 P( r1 L6 P
0 _- c) Q! O! R3 k E5 w% h( Y& P
GPIOBankIntEnable(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_GPIO_BANK);+ z5 [7 j9 o5 C( p
}2 k3 `+ O2 i# `7 I. H% c/ ?$ N
7 G: c4 C7 R: q
- }4 D2 _& C0 h: B) S" B: D- S6 g+ Y
7 T/ F1 d- \9 r( d. f& N4 m+ ^- u( r2 w0 s4 S. T9 Z
|
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
|