|
您好。使用GPIO中断时,中断能进入ISR,但是不能区分具体的GPIO端口。程序如下:
0 ~ N4 G" S+ n7 _! ~: V" I#define AD7606_PAR_BUSY_GPIO_BANK 5+ c# p0 k! u" E
#define AD7606_PAR_BUSY_GPIO_BANK_INT SYS_INT_GPIO_B5INT9 R: c3 b! Y& q- W, X( B) Y
1 I$ W; b8 x1 `+ Y) k3 U#define AD7606_PAR_BUSY_V1 GPIO_TO_PIN(5, 11) //BANK5的中断口5.118 J4 f- g. a. }. m
#define AD7606_PAR_BUSY_V2 GPIO_TO_PIN(5, 9) //BANK5的中断口5.9; q0 \; B5 d, D* R, i8 [
#define AD7606_PAR_BUSY_C GPIO_TO_PIN(5, 5) //BANK5的中断口5.5! R3 ~ {+ M* D! Z. E6 N9 y! q( Y4 }. B
#define AD7606_PAR_BUSY GPIO_TO_PIN(5, 4)
7 s; E: t5 M* V- ?, A3 W. o' V2 L+ r5 {8 `7 `! N1 Y# _
#define AD7606_PAR_CONVST GPIO_TO_PIN(5, 1)
2 M5 q% c7 ? @#define AD7606_PAR_RD GPIO_TO_PIN(5, 2)
4 Z9 M6 h2 y+ a6 t- j#define AD7606_PAR_RESET GPIO_TO_PIN(5, 0)' i" N2 L# ~) J" V U% }
0 u) |3 R& {6 o1 q! l2 X+ g: k2 W
" f* Y- u7 }! o8 ^
) h$ G) {% |; _; S' d6 A- M! E3 Vstatic void ad7606_irq_setup(ad7606 *ad) {. c8 Q2 H) {. |# h4 H2 J
Hwi_Params hwiParams;4 G& L9 h" `5 `# v! c
Hwi_Handle myHwi;5 T) F& b9 C' F" G0 E9 @( j
Error_Block eb;
; y# K, x( ?8 E8 X$ V E6 [; r) A8 F+ O+ n/ T
Error_init(&eb);
. f: a: C" d M9 F2 J4 g2 j# d Hwi_Params_init(&hwiParams);
" {% ]+ F+ @7 D ?4 w hwiParams.arg = (unsigned int)ad;
) N7 n8 [2 [6 h1 y3 ?4 f9 r hwiParams.enableInt = FALSE;4 _- a) P% A8 ^( U" Q: G. t
hwiParams.eventId = SYS_INT_GPIO_B5INT;
; L+ ]4 @2 B' E$ t2 ?% V hwiParams.priority = 4;6 E* x1 s& A8 t! i
myHwi = Hwi_create(8, ad7606_busy_hwi, &hwiParams, &eb); //注册BANK5中断处理函数
- Q! W. G' }3 z8 A" t if (myHwi == NULL)
: i. E7 K* m1 F w8 k9 q8 U2 w/ } LOG_FATAL("failed to create hwi");
9 s% B- L0 A7 W; z, {
+ e; x4 s2 r( ] /* enable both interrupts */
8 ~5 P: J0 K: D) w Hwi_enableInterrupt(ad->irq_event);
. j0 F8 h' d+ q}9 n' m, Y! @& ^& U! F+ s& ?9 J
% s2 _6 a6 b. a+ O) J8 u$ _$ l+ y( T) r4 Q' b; s% H3 B! c
static void ad7606_gpio_pinmux_setup(ad7606 *ad) {4 y, l' Z9 S9 V; ?6 z% V! P
volatile unsigned int savePinMux = 0;
, }* o- k3 p: v# o) a" B( h: ` //初始化5.11、5.9 、 5.5为GPIO口; f9 L/ v' P' o3 L0 J
savePinMux = HWREG(SOC_SYSCFG_0_REGS + SYSCFG0_PINMUX(11)) & (~(SYSCFG_PINMUX11_PINMUX11_27_24 | SYSCFG_PINMUX11_PINMUX11_19_16));! W6 Y* T4 h5 F1 L
' R3 C; ^* V6 g3 ^
HWREG(SOC_SYSCFG_0_REGS + SYSCFG0_PINMUX(11)) = (PINMUX11_BUSY_V1_ENABLE | PINMUX11_BUSY_V2_ENABLE | savePinMux);
! a& R2 H) W# @
; u6 }2 I! \/ s 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));
" }( s4 i" [- Y0 t! } P
/ H; h$ D) ^ ?; O# l HWREG(SOC_SYSCFG_0_REGS + SYSCFG0_PINMUX(12)) = (PINMUX12_RESET_ENABLE | PINMUX12_CONVST_ENABLE | PINMUX12_RD_ENABLE | PINMUX12_BUSY_C_ENABLE | savePinMux);
2 D8 Y9 o% E2 ?. e( a& d9 C6 A; ?( Z) h
}/ a' N# H3 y: S
6 l7 P# R) q' m
' _ [' p2 K" _) ~" N* x
static void ad7606_gpio_setup(ad7606 *ad) {
' v% s5 y6 K0 V /*Set the AD7606_PAR_BUSY to the input mode*/
6 I# m4 N C' V. U //初始化5.11、5.9 、 5.5为中断口1 a/ j' B& m t: s* C- Q5 k
GPIODirModeSet(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_V1, GPIO_DIR_INPUT);; I+ p `# J2 U* o. j g7 D. A# E) e6 q
GPIODirModeSet(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_V2, GPIO_DIR_INPUT);
5 H$ }; ~, U: j- v GPIODirModeSet(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_C, GPIO_DIR_INPUT);
( d" \" |3 t. G+ c. ^( U, [" W //GPIODirModeSet(SOC_GPIO_0_REGS, AD7606_PAR_BUSY, GPIO_DIR_INPUT);+ r! i4 K5 i7 p0 T5 \( ]. ~9 C
/*Set the AD7606_PAR_BUSY to the Falling Edge Interrupt*/5 Q) a& ?) y7 K1 U; }
GPIOIntTypeSet(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_V1, GPIO_INT_TYPE_FALLEDGE);& |0 a( N7 E& e9 y
GPIOIntTypeSet(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_V2, GPIO_INT_TYPE_FALLEDGE);; C0 U4 u% a7 T
GPIOIntTypeSet(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_C, GPIO_INT_TYPE_FALLEDGE);
7 ]& L/ z% t- X; O //GPIOIntTypeSet(SOC_GPIO_0_REGS, AD7606_PAR_BUSY, GPIO_INT_TYPE_FALLEDGE);2 q9 x$ h# r( i* ?* x
/*The interrupt setting allows AD7606_PAR_BUSY_GPIO_BANK*/; E* B9 O; `2 H( o# i, |- i S
GPIOBankIntEnable(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_GPIO_BANK);+ Y" b" z: F* o
$ c3 ?- x4 J( h9 y GPIODirModeSet(SOC_GPIO_0_REGS, AD7606_PAR_RESET, GPIO_DIR_OUTPUT);) ` }! P) g& J) v
GPIOPinWrite(SOC_GPIO_0_REGS, AD7606_PAR_RESET, GPIO_PIN_HIGH);8 f2 r, L7 ]+ N
Task_sleep(1000);0 C v* V) u4 g2 Z, Z
GPIOPinWrite(SOC_GPIO_0_REGS, AD7606_PAR_RESET, GPIO_PIN_LOW);" y8 N9 K; q/ ? n
Task_sleep(1000);
u/ d6 G; p/ i% a* c
5 q6 Q% {% w( o /*Set the AD7606_PAR_CONVST to output mode*/
9 |3 X# [- w. Z5 F! ~ GPIODirModeSet(SOC_GPIO_0_REGS, AD7606_PAR_CONVST, GPIO_DIR_OUTPUT);
9 v+ g$ O) {0 Y+ Z! z E0 x2 c GPIOPinWrite(SOC_GPIO_0_REGS, AD7606_PAR_CONVST, GPIO_PIN_LOW);
5 k+ Y' r7 x6 w% T9 |7 Y0 M% m6 C! o8 Q! Q& Z' \
GPIODirModeSet(SOC_GPIO_0_REGS, AD7606_PAR_RD, GPIO_DIR_OUTPUT);2 j+ K* m1 K& s
GPIOPinWrite(SOC_GPIO_0_REGS, AD7606_PAR_RD, GPIO_PIN_HIGH);7 B2 d7 L# _: v/ q/ A
4 G7 i! G) b7 k: o4 l( a, i8 Z
}
7 G# w( [5 E1 o* Z% ~
. g2 w# @- M! k0 ~# \# x$ M
6 M+ Z! ^+ C/ lstatic void ad7606_busy_hwi(UArg ad_addr) {* w3 H7 \: Q, S. i8 A) a% k
+ B9 H d6 [9 K
8 _9 E; F* I+ M' V% P/ v0 n. S$ C& \
/* Disable the interrupts for pins of bank AD7606_PAR_BUSY in GPIO.*/
% x l: j: u+ N _ GPIOBankIntDisable(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_GPIO_BANK); //用仿真器debug,发现程序能进入这里。
" ]; p# F) G4 \7 V6 j; p$ X8 s" C* b
6 `: _% @' p0 O- w, U1 O4 I if(GPIOPinIntStatus(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_V1) == GPIO_INT_PEND)
! D; F; `( g: g0 G' t2 u {! p' \+ B+ z3 t2 M6 z
GPIOPinIntClear(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_V1); //问题是:用仿真器debug,发现程序不能进入这里。" {, a# R3 U8 x, u& B9 R2 z
cs_addr = SOC_EMIFA_CS5_ADDR ;$ ^/ h5 z5 L( l/ j
internal = 0 ;4 q9 w+ Z7 U6 \/ U6 V! ^/ j# S
int_flag[0] = 1 ;
7 M$ q, P8 R$ e" u$ z }
* M, i4 j: D3 O Z0 t% Z0 o if(GPIOPinIntStatus(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_V2) == GPIO_INT_PEND)2 ]5 u- P' |! B* }- |
{# V D% e! ]8 W0 t$ x- a/ C' Z+ Z
GPIOPinIntClear(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_V2); //问题是:用仿真器debug,发现程序不能进入这里。
; {5 i1 {! M+ u; T cs_addr = SOC_EMIFA_CS4_ADDR ;
$ o, |, X: E" R' k0 X6 C* Q internal = 6 ;: u# X* a" f/ p! u, X0 Q$ b: I
int_flag[1] = 1 ;* Q1 i8 m4 Y5 g$ d2 i( V
}
' ]3 f" ]% l9 k* [ if(GPIOPinIntStatus(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_C) == GPIO_INT_PEND): w v2 ^( }5 |7 S8 B
{" {, g- U# X, r8 X, I! P
GPIOPinIntClear(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_C); //问题是:用仿真器debug,发现程序不能进入这里。; n$ W( i) G0 t
cs_addr = SOC_EMIFA_CS2_ADDR ;
, S0 d; j9 r9 G; E internal = 12 ;
0 z/ r3 ^1 n- o- ~ int_flag[2] = 1 ;
8 p2 I0 O5 i; @ }
& ]3 i$ x2 U) h * p; t) n+ S4 K, y' b3 X
GPIOPinWrite(SOC_GPIO_0_REGS, AD7606_PAR_CONVST, GPIO_PIN_LOW);
( J$ r2 U7 G3 E1 X f3 j) q
) p" F" ~. K7 f7 d u) Z5 ^6 R GPIOBankIntEnable(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_GPIO_BANK);
. N. j& ?7 P7 ^2 H}
# E; p. H, U# {7 A& p7 l5 F" `! U$ U* K
|
|