|
|
您好。使用GPIO中断时,中断能进入ISR,但是不能区分具体的GPIO端口。程序如下:
" ?8 Z0 G9 {4 L( L. j" J' a. t#define AD7606_PAR_BUSY_GPIO_BANK 5. ^" y! S4 `+ _ r% N- `+ Z
#define AD7606_PAR_BUSY_GPIO_BANK_INT SYS_INT_GPIO_B5INT
4 c S6 `1 a o) k+ Q0 o8 k
4 I& X% V1 A. \#define AD7606_PAR_BUSY_V1 GPIO_TO_PIN(5, 11) //BANK5的中断口5.11( w$ o: [1 r) N% o
#define AD7606_PAR_BUSY_V2 GPIO_TO_PIN(5, 9) //BANK5的中断口5.9
" x; k, J b& `0 d0 `8 |#define AD7606_PAR_BUSY_C GPIO_TO_PIN(5, 5) //BANK5的中断口5.5
! Y$ i' d5 u7 P% D2 U; s. ^$ \: M#define AD7606_PAR_BUSY GPIO_TO_PIN(5, 4)
* G" V0 V. x3 I" H1 L; ~5 X
8 q, A4 F% O/ F# l- b1 p1 h#define AD7606_PAR_CONVST GPIO_TO_PIN(5, 1)
2 R: N A; b0 u3 [#define AD7606_PAR_RD GPIO_TO_PIN(5, 2)) M9 `8 d- y1 p+ o2 y
#define AD7606_PAR_RESET GPIO_TO_PIN(5, 0) F" @% ^3 W0 Q: [3 Y8 m) H; T
$ A' z5 K; i2 F9 [
, W1 H, j0 y; `
9 `5 I3 `$ a# R8 l0 j
static void ad7606_irq_setup(ad7606 *ad) {
( h, K% |: s3 C, n. h Hwi_Params hwiParams;4 {. G: @* o# y! C1 Q E, s, @
Hwi_Handle myHwi;
( M/ c7 t% G, v. M8 E* ^2 [ Error_Block eb;
' c7 }2 p& O8 p, F B0 k/ s
/ {# j4 E0 Z; x" B8 Y) w Error_init(&eb);
: r O7 e8 h; C! V9 [ Hwi_Params_init(&hwiParams);
4 m5 ~2 x! ], B$ G1 l hwiParams.arg = (unsigned int)ad;
) u' ~7 F# F* e1 O! N hwiParams.enableInt = FALSE;7 k. k1 @% i# G' w! H
hwiParams.eventId = SYS_INT_GPIO_B5INT;
) r0 i6 b$ y/ A hwiParams.priority = 4;5 h6 j- q, _/ b; r g/ L1 t+ m
myHwi = Hwi_create(8, ad7606_busy_hwi, &hwiParams, &eb); //注册BANK5中断处理函数9 K: K( w" G O6 b+ l. q, ?
if (myHwi == NULL) : `. z# w. b! I* Q* ]. I: V
LOG_FATAL("failed to create hwi");8 Q- v+ }/ `* A7 [$ p/ p
0 s- U" L, v$ s2 y9 O+ E /* enable both interrupts */
g( K$ O! T# C" U6 k7 x' Z Hwi_enableInterrupt(ad->irq_event);# o+ Y/ V; n7 D3 U" e- x
}
! r3 a6 _0 ~3 g5 S' U6 J$ i6 L, R3 O* c/ W( i4 {6 Y6 d
' T: A+ _# o7 \* ^% V$ ^static void ad7606_gpio_pinmux_setup(ad7606 *ad) {3 H: W% s$ [1 a) I3 A4 V, k) \
volatile unsigned int savePinMux = 0;5 t+ e+ p4 h! k2 b ^# D
//初始化5.11、5.9 、 5.5为GPIO口
& o* r9 q: {7 x" B, m. U savePinMux = HWREG(SOC_SYSCFG_0_REGS + SYSCFG0_PINMUX(11)) & (~(SYSCFG_PINMUX11_PINMUX11_27_24 | SYSCFG_PINMUX11_PINMUX11_19_16));
( r0 [! v8 W- Z; E
* o$ ^7 b% ]6 [ q7 H- L9 K HWREG(SOC_SYSCFG_0_REGS + SYSCFG0_PINMUX(11)) = (PINMUX11_BUSY_V1_ENABLE | PINMUX11_BUSY_V2_ENABLE | savePinMux);! P' D1 v2 _1 J p2 |2 f
- d g7 h$ h; k/ E$ 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));
/ ]! {$ M! ]% z1 H
! d, U5 f, H% S1 S HWREG(SOC_SYSCFG_0_REGS + SYSCFG0_PINMUX(12)) = (PINMUX12_RESET_ENABLE | PINMUX12_CONVST_ENABLE | PINMUX12_RD_ENABLE | PINMUX12_BUSY_C_ENABLE | savePinMux);
+ {; [6 z4 B. O+ ` M2 ^
- g% v6 G8 i( P2 j' o* \' [7 n6 T5 @5 r}8 P! Y) p d9 r1 `8 G) B
0 f3 v$ f9 ^7 T% i+ w
* |3 B3 a$ u+ h) @/ x5 d
static void ad7606_gpio_setup(ad7606 *ad) {
+ K+ D1 c# y1 V( i /*Set the AD7606_PAR_BUSY to the input mode*/% A; i. K$ J- k8 U, X2 Z3 o
//初始化5.11、5.9 、 5.5为中断口* m) @! h. Z6 r0 T. h' ^
GPIODirModeSet(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_V1, GPIO_DIR_INPUT);- ]2 \* v! U7 Z, d0 ]
GPIODirModeSet(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_V2, GPIO_DIR_INPUT);
) x9 S( \, K/ B7 m1 K GPIODirModeSet(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_C, GPIO_DIR_INPUT);( ?3 n) ~% ^: C
//GPIODirModeSet(SOC_GPIO_0_REGS, AD7606_PAR_BUSY, GPIO_DIR_INPUT);1 U. V* e$ S* r* w3 U* P4 f
/*Set the AD7606_PAR_BUSY to the Falling Edge Interrupt*/0 ]) h# ^/ ]. S+ j" K
GPIOIntTypeSet(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_V1, GPIO_INT_TYPE_FALLEDGE);
* E" m( a0 D% j GPIOIntTypeSet(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_V2, GPIO_INT_TYPE_FALLEDGE);
& B! a: D0 R- {; K' M3 g. L- d# _6 P GPIOIntTypeSet(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_C, GPIO_INT_TYPE_FALLEDGE);3 r( `+ V+ g4 U1 z. f' s4 O
//GPIOIntTypeSet(SOC_GPIO_0_REGS, AD7606_PAR_BUSY, GPIO_INT_TYPE_FALLEDGE); d' h* ]- H1 S2 Q, X$ R
/*The interrupt setting allows AD7606_PAR_BUSY_GPIO_BANK*/
6 a; A3 ]7 n* r. r4 n' b) j! ^3 b7 L. k GPIOBankIntEnable(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_GPIO_BANK);
1 Y" p4 g6 p/ p/ N2 a8 p4 W) P" v) q% n& d3 ^2 B
GPIODirModeSet(SOC_GPIO_0_REGS, AD7606_PAR_RESET, GPIO_DIR_OUTPUT);! c4 T6 }5 D+ C! V
GPIOPinWrite(SOC_GPIO_0_REGS, AD7606_PAR_RESET, GPIO_PIN_HIGH);% m# j& ^3 f, s I
Task_sleep(1000);
; W# r4 }1 |( T0 B% p GPIOPinWrite(SOC_GPIO_0_REGS, AD7606_PAR_RESET, GPIO_PIN_LOW);
7 S6 F' e7 f, ~4 t Task_sleep(1000);$ O+ `5 X8 X' y% P8 z g# d$ d1 ?
5 ?7 m: \0 @, m
/*Set the AD7606_PAR_CONVST to output mode*/
* {$ _, V$ W+ c& Y) L GPIODirModeSet(SOC_GPIO_0_REGS, AD7606_PAR_CONVST, GPIO_DIR_OUTPUT);
7 j8 s4 L9 n, i, _" l. e- i GPIOPinWrite(SOC_GPIO_0_REGS, AD7606_PAR_CONVST, GPIO_PIN_LOW);
) d& D1 u4 o3 i) L) [; F- B
" W, m/ u& C, r7 U3 ~8 K% z6 K GPIODirModeSet(SOC_GPIO_0_REGS, AD7606_PAR_RD, GPIO_DIR_OUTPUT);
* l3 p: B; T* f6 Q% H3 ?- N GPIOPinWrite(SOC_GPIO_0_REGS, AD7606_PAR_RD, GPIO_PIN_HIGH);
8 d" M2 Q4 X' K
7 _/ f' Z* [" x6 V, K}
2 K, y" W5 |7 |: t+ [/ g" T/ k
9 h8 i: u4 [9 D# d" J% }
& m! J6 Y) j6 @: l" j0 Q6 y: e) n. Rstatic void ad7606_busy_hwi(UArg ad_addr) {
9 T; d0 b1 K8 ~, Z. h# C% R, X
) y7 L6 |. [6 {0 D6 S. }& ~/ ?" W" m; N; H* s% O5 h
/* Disable the interrupts for pins of bank AD7606_PAR_BUSY in GPIO.*/' i5 G) V1 Z% [- o! O! `$ O6 y
GPIOBankIntDisable(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_GPIO_BANK); //用仿真器debug,发现程序能进入这里。. j6 A8 Q2 `3 j( a+ K3 ^
1 {: D; R) [) t1 F if(GPIOPinIntStatus(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_V1) == GPIO_INT_PEND)3 C9 ]$ h5 V7 p* U( |- J+ t
{
* j& f6 v- E' b. a6 P GPIOPinIntClear(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_V1); //问题是:用仿真器debug,发现程序不能进入这里。
6 S! ~/ K) J- y: ~* E( g( ~ cs_addr = SOC_EMIFA_CS5_ADDR ;# I# `3 p e6 m! A
internal = 0 ;2 {" y( u- X2 n S
int_flag[0] = 1 ;
2 j- c1 _6 |( i; s }
$ P( F' X& z K, H# N if(GPIOPinIntStatus(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_V2) == GPIO_INT_PEND)' e9 M7 Y; ^% e
{
3 o3 M$ F6 J, ]6 N GPIOPinIntClear(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_V2); //问题是:用仿真器debug,发现程序不能进入这里。
' z5 s1 D5 O3 }* m( G cs_addr = SOC_EMIFA_CS4_ADDR ;. f- h; H& J- B& O1 D& _
internal = 6 ;
4 e. B, t7 ]( C int_flag[1] = 1 ;" ~- c" a) ?" |+ @/ |5 a
}
$ k) L8 i. h& K! _' U if(GPIOPinIntStatus(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_C) == GPIO_INT_PEND)) b- U. H- u6 Q! r0 i
{
$ z T T: C9 \. a: }# a9 T GPIOPinIntClear(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_C); //问题是:用仿真器debug,发现程序不能进入这里。& g. D; w" @0 r; l! p3 T$ S
cs_addr = SOC_EMIFA_CS2_ADDR ;/ }9 b5 R6 e" w- Z$ o4 ]( z
internal = 12 ;# O9 |. C3 y9 L- I- Q/ R; |! l& Q
int_flag[2] = 1 ; ~& J6 F0 y* h8 S' F8 U8 f j/ m4 R
}
6 e" g: t5 H/ n8 o6 ^
" L% u5 w% A- K2 s GPIOPinWrite(SOC_GPIO_0_REGS, AD7606_PAR_CONVST, GPIO_PIN_LOW);
2 {/ f4 w9 A1 e) a& \' _ . d: V1 U9 p4 ~9 \% R0 l2 A* w
GPIOBankIntEnable(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_GPIO_BANK);# v/ C0 z4 T/ d% k$ ^* A, O, X
}) z( T& i/ W. ^, a- a
7 m; I2 o, Z" U5 E) H |
|