|
|
您好。使用GPIO中断时,中断能进入ISR,但是不能区分具体的GPIO端口。程序如下:) F \0 j: @' K2 U- i" e0 v1 u7 A
#define AD7606_PAR_BUSY_GPIO_BANK 54 s6 G# V, H! p4 _
#define AD7606_PAR_BUSY_GPIO_BANK_INT SYS_INT_GPIO_B5INT# x' y! O; v* u% D0 O
, _2 }7 L5 S! b& a, V2 k#define AD7606_PAR_BUSY_V1 GPIO_TO_PIN(5, 11) //BANK5的中断口5.11
' |: O2 x0 M& n6 c/ ~+ E5 x0 {& @#define AD7606_PAR_BUSY_V2 GPIO_TO_PIN(5, 9) //BANK5的中断口5.92 J' G! X3 c$ f( N. z+ I
#define AD7606_PAR_BUSY_C GPIO_TO_PIN(5, 5) //BANK5的中断口5.5
M4 e9 J( A+ C#define AD7606_PAR_BUSY GPIO_TO_PIN(5, 4)
# y3 f- o& _5 h" p" j+ a$ h2 P/ X5 R2 T) q8 G6 |3 l8 x
#define AD7606_PAR_CONVST GPIO_TO_PIN(5, 1)- u9 X' c2 P: \0 d
#define AD7606_PAR_RD GPIO_TO_PIN(5, 2)/ U/ T0 @) n# N; U2 b
#define AD7606_PAR_RESET GPIO_TO_PIN(5, 0)
0 {* V" F* o: r- ?# ?+ @" I }1 s0 g# f0 H8 p, Q; b& X
4 `6 |3 H0 |7 m
9 U% ?0 H# s) H9 A5 Wstatic void ad7606_irq_setup(ad7606 *ad) {, t4 n7 p. `& a
Hwi_Params hwiParams;
# U0 Z3 b# F, g6 D2 p- Y8 v Hwi_Handle myHwi;
' }& _, I( d2 S0 a4 M" }2 e Error_Block eb;
; @& s! s( a1 X) @1 ?( j0 u
2 M) P5 c7 g) v' ^: } Error_init(&eb);
% _/ `1 d/ @' U9 \ Hwi_Params_init(&hwiParams);
2 f! f/ L$ e( w8 K/ C+ Q hwiParams.arg = (unsigned int)ad;
! k" D- Y( ~ A6 h hwiParams.enableInt = FALSE;
& l# [6 \% x9 Q U' h* @& B) I hwiParams.eventId = SYS_INT_GPIO_B5INT;4 C1 O: w8 ?, w4 `+ r" N- _$ @! ~
hwiParams.priority = 4;
. ]2 V) Y7 c3 x% _ myHwi = Hwi_create(8, ad7606_busy_hwi, &hwiParams, &eb); //注册BANK5中断处理函数
. J9 V) I) p7 d0 n if (myHwi == NULL)
$ K* R! K% f7 w5 j6 ?9 R LOG_FATAL("failed to create hwi");
! ~ _/ W* M; {! Z! m w
! U' [/ h- z6 N. n3 c /* enable both interrupts */
$ k6 C1 x1 U, }; T/ W! ~5 P Hwi_enableInterrupt(ad->irq_event);
9 s8 I8 P5 |' _' U: @) I; D6 F' W8 C}* E; C* |1 ?! _. ?
. S7 D, L8 ]" F& p% r0 X
- p' i5 a z$ s* c4 Fstatic void ad7606_gpio_pinmux_setup(ad7606 *ad) {
z( T# B1 a" K( K9 ~% L# d' Q" } volatile unsigned int savePinMux = 0;0 [! g$ V/ _0 k2 P, w2 V
//初始化5.11、5.9 、 5.5为GPIO口
( O) S. ^ z$ s9 r8 y$ }2 @ savePinMux = HWREG(SOC_SYSCFG_0_REGS + SYSCFG0_PINMUX(11)) & (~(SYSCFG_PINMUX11_PINMUX11_27_24 | SYSCFG_PINMUX11_PINMUX11_19_16));
6 t1 v5 U9 m: T; S! \+ u2 Z% ^8 g
HWREG(SOC_SYSCFG_0_REGS + SYSCFG0_PINMUX(11)) = (PINMUX11_BUSY_V1_ENABLE | PINMUX11_BUSY_V2_ENABLE | savePinMux);7 b# C- Z1 ?* R Q9 h& g; U0 `
5 e6 [7 I7 B, }3 \8 d 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));
. B$ I+ a" {& n( q3 L9 d; N8 ^
1 A+ W2 F- k6 E0 P* H# Z% D HWREG(SOC_SYSCFG_0_REGS + SYSCFG0_PINMUX(12)) = (PINMUX12_RESET_ENABLE | PINMUX12_CONVST_ENABLE | PINMUX12_RD_ENABLE | PINMUX12_BUSY_C_ENABLE | savePinMux);7 C- T. C/ H: i6 _. G; U
$ h' j6 r5 C8 S
}" v6 V6 {- T* e6 J* _% i; |. H) F
" a( T: K5 s6 `6 U
1 d, U3 w. a; D+ k. hstatic void ad7606_gpio_setup(ad7606 *ad) {
# _: Y$ _; G) D" l6 F /*Set the AD7606_PAR_BUSY to the input mode*/& o# G; q; T/ ?: x
//初始化5.11、5.9 、 5.5为中断口) C2 S. t# y( h8 t
GPIODirModeSet(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_V1, GPIO_DIR_INPUT);
. O# F, W. x/ P GPIODirModeSet(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_V2, GPIO_DIR_INPUT);$ u( w3 f/ ~8 c' r% f! ?4 z
GPIODirModeSet(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_C, GPIO_DIR_INPUT);
6 [6 N3 k& t3 x! C //GPIODirModeSet(SOC_GPIO_0_REGS, AD7606_PAR_BUSY, GPIO_DIR_INPUT); c% N$ Q' d$ G+ r
/*Set the AD7606_PAR_BUSY to the Falling Edge Interrupt*/" C& V1 e0 ^5 [# A' l
GPIOIntTypeSet(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_V1, GPIO_INT_TYPE_FALLEDGE);; F- x3 {( O8 F- T/ p! ~# Z% |
GPIOIntTypeSet(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_V2, GPIO_INT_TYPE_FALLEDGE);
3 `' z! z9 c, ^& n4 h& y GPIOIntTypeSet(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_C, GPIO_INT_TYPE_FALLEDGE);6 R3 H1 g: L7 k' x9 ]
//GPIOIntTypeSet(SOC_GPIO_0_REGS, AD7606_PAR_BUSY, GPIO_INT_TYPE_FALLEDGE);6 c$ W: s" U& i8 `2 T
/*The interrupt setting allows AD7606_PAR_BUSY_GPIO_BANK*/
/ M! Q' z- l+ e8 ^' m1 A1 Y& Y0 U GPIOBankIntEnable(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_GPIO_BANK);
6 K1 p2 E! J* h" C5 o. W
6 [) [4 j% L- `6 F; u0 Y GPIODirModeSet(SOC_GPIO_0_REGS, AD7606_PAR_RESET, GPIO_DIR_OUTPUT);
+ ~: K) U7 l6 e. X0 C, o GPIOPinWrite(SOC_GPIO_0_REGS, AD7606_PAR_RESET, GPIO_PIN_HIGH);
$ t. f6 k' y3 ~1 v0 J9 {1 V Task_sleep(1000);
$ e' O5 |/ U1 M. U- j/ r R7 z GPIOPinWrite(SOC_GPIO_0_REGS, AD7606_PAR_RESET, GPIO_PIN_LOW);
- B1 v% J& [; r) A7 c! Z# s, W Task_sleep(1000);
& d( G0 \* Z4 ?' _2 Q) ?' R1 ]) t6 X0 d6 A% | E. N2 \, h
/*Set the AD7606_PAR_CONVST to output mode*/# A: K8 e( o0 d1 z
GPIODirModeSet(SOC_GPIO_0_REGS, AD7606_PAR_CONVST, GPIO_DIR_OUTPUT);! H2 L- Y0 l! R; g! r$ O* H
GPIOPinWrite(SOC_GPIO_0_REGS, AD7606_PAR_CONVST, GPIO_PIN_LOW);
) q) t/ }+ a4 ] A2 @& Z
6 j- ~" m, F4 L: l! ]( h# B! t GPIODirModeSet(SOC_GPIO_0_REGS, AD7606_PAR_RD, GPIO_DIR_OUTPUT);
e: @# j$ D' @8 ] GPIOPinWrite(SOC_GPIO_0_REGS, AD7606_PAR_RD, GPIO_PIN_HIGH);6 f& r5 \. R1 E$ f& m* S6 V
! ]' _$ k m9 R H9 D" E& ~}. v( y% M, D8 F6 p2 W
) e+ g; ^7 |% q& X6 P# d& I
. g; O7 v. l2 @) wstatic void ad7606_busy_hwi(UArg ad_addr) {# R: y( U L9 Q8 p6 r. z' O$ c
4 ^! Z/ c# ]- K O7 `) k
/ N9 i$ `; F$ u) b* U: s /* Disable the interrupts for pins of bank AD7606_PAR_BUSY in GPIO.*/; r0 D X6 y6 y. X( n
GPIOBankIntDisable(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_GPIO_BANK); //用仿真器debug,发现程序能进入这里。. L+ U- X5 G$ t4 W5 Q4 m- L
) J, [! e; N h3 Q8 R1 A
if(GPIOPinIntStatus(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_V1) == GPIO_INT_PEND). x. u6 ]" V4 R' g. e, v
{; ?) A1 D: c9 d% K' h
GPIOPinIntClear(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_V1); //问题是:用仿真器debug,发现程序不能进入这里。
' W% {6 o8 N4 ]4 N cs_addr = SOC_EMIFA_CS5_ADDR ;! K! m: L/ p, X6 o- w/ ^
internal = 0 ;
1 V0 X1 |3 c4 \8 [ int_flag[0] = 1 ;
/ H# D4 @: x9 I% X$ n9 \8 `0 { I }
# ^) n7 E3 M9 s& O if(GPIOPinIntStatus(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_V2) == GPIO_INT_PEND)3 e# z& R0 l$ m1 C; z
{: J, E- c7 ^6 Z
GPIOPinIntClear(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_V2); //问题是:用仿真器debug,发现程序不能进入这里。7 v% L* b/ v7 C1 Q$ w
cs_addr = SOC_EMIFA_CS4_ADDR ;# s' B! k7 j9 a) w- U0 S
internal = 6 ;
/ w+ L/ J+ I$ W" @3 X. ? int_flag[1] = 1 ;8 ^' L) i: e( b) c' P
}+ B8 ]& _( r/ Q8 D0 s
if(GPIOPinIntStatus(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_C) == GPIO_INT_PEND)
( Q7 M5 r; {; x3 A: H9 \0 l+ E {
- A/ _) J5 Q! D) ~ GPIOPinIntClear(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_C); //问题是:用仿真器debug,发现程序不能进入这里。
9 }6 K3 S7 P& X2 E cs_addr = SOC_EMIFA_CS2_ADDR ;6 [- b+ _( @- c+ }2 D) i% i, O7 O0 X
internal = 12 ;9 t0 x' x5 W! o2 T0 z: K
int_flag[2] = 1 ;
7 [ j4 A: J$ ]7 ]$ U }
, _/ r0 _/ j0 C1 x1 [" e6 q" X ' g' @ E ~+ y3 J9 \6 `% p
GPIOPinWrite(SOC_GPIO_0_REGS, AD7606_PAR_CONVST, GPIO_PIN_LOW);
* h2 V6 P: v. u8 h3 p; K& L* V+ w
, d. ]' l/ n. Y GPIOBankIntEnable(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_GPIO_BANK);
9 ~7 h: h3 v5 S R5 D/ k' e}
- c9 G6 ?; e f* E* E# h7 }3 [9 p
4 H0 W$ g% s! Q5 h( K
# ]& a, O6 z! S2 t- A
# N9 p T$ u. W1 z9 A1 N |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
|