|
|
您好。使用GPIO中断时,中断能进入ISR,但是不能区分具体的GPIO端口。程序如下:2 {3 {% V% E& J# L6 x8 c# y
#define AD7606_PAR_BUSY_GPIO_BANK 5
M3 g! Q( {: M/ Q/ C' h" e; c3 o#define AD7606_PAR_BUSY_GPIO_BANK_INT SYS_INT_GPIO_B5INT
: i" J" o9 @4 Z: q* @ }
8 n7 e# V* j* w6 Y#define AD7606_PAR_BUSY_V1 GPIO_TO_PIN(5, 11) //BANK5的中断口5.11
% _3 P# `* B( c$ U5 J* v% ]#define AD7606_PAR_BUSY_V2 GPIO_TO_PIN(5, 9) //BANK5的中断口5.96 U! ^. r8 v6 q- Z- h! d! O
#define AD7606_PAR_BUSY_C GPIO_TO_PIN(5, 5) //BANK5的中断口5.5
: |4 n) n- }5 w9 S1 O$ X#define AD7606_PAR_BUSY GPIO_TO_PIN(5, 4)
- P3 L) i& \! _$ ^. }2 w# ^ h+ K5 E( e( t- s1 m2 }. Z7 F& w5 {7 T: X5 m! U
#define AD7606_PAR_CONVST GPIO_TO_PIN(5, 1)" d: R4 i0 g) E7 r4 b* R$ u
#define AD7606_PAR_RD GPIO_TO_PIN(5, 2)
7 c4 g+ h; s6 b8 \6 S1 N#define AD7606_PAR_RESET GPIO_TO_PIN(5, 0)
! c- o5 c. C% n$ f9 @* R1 h' q' b
$ T" M. U- B4 `& v& @" O- @
* S+ Q$ r: A' c$ X" w5 X( ~4 K$ w4 H, J" x) l; f' h
static void ad7606_irq_setup(ad7606 *ad) {1 a3 N4 ?- p8 }1 z" \0 P
Hwi_Params hwiParams;
* Z( s5 S( q8 P+ ~ Hwi_Handle myHwi;
6 c; B; j2 C. w Error_Block eb;5 w b, z; F4 v6 P4 a5 _3 W
8 f. F# t* G+ L9 {4 P7 V( N6 V Error_init(&eb);2 g( J' V/ X' o! U$ I V
Hwi_Params_init(&hwiParams);
/ s- z s8 x* H. F2 p1 K hwiParams.arg = (unsigned int)ad;
& |0 R3 w6 v- _0 w d0 b/ K+ N hwiParams.enableInt = FALSE;+ G* [3 U! Z: k9 ]: P
hwiParams.eventId = SYS_INT_GPIO_B5INT;+ r: B- x4 g( [* m6 @ L( O2 p- z
hwiParams.priority = 4;+ I" W. _; v* h! M
myHwi = Hwi_create(8, ad7606_busy_hwi, &hwiParams, &eb); //注册BANK5中断处理函数, f5 b5 ^! Q( [. _& j
if (myHwi == NULL) % Z' i9 [- K0 S0 @/ Q
LOG_FATAL("failed to create hwi");- l9 r; ]; m$ N7 L1 x8 Y+ p
/ Q4 y; S, ~/ z0 K+ g& d8 x# f
/* enable both interrupts */$ ^# |- y! \ a0 P
Hwi_enableInterrupt(ad->irq_event);
2 W. D# `+ o# d}
% F2 D% u+ `) f6 B0 y- W6 b6 m; @+ V
: N9 p9 t: N7 a6 e4 f& G; ^
7 x+ F( C% b; m4 qstatic void ad7606_gpio_pinmux_setup(ad7606 *ad) {" G& d$ k7 E d7 u; g2 y; `# h
volatile unsigned int savePinMux = 0;6 Y+ N. b2 c+ }$ V* T; W
//初始化5.11、5.9 、 5.5为GPIO口7 m; e* O2 y" D; A S3 @
savePinMux = HWREG(SOC_SYSCFG_0_REGS + SYSCFG0_PINMUX(11)) & (~(SYSCFG_PINMUX11_PINMUX11_27_24 | SYSCFG_PINMUX11_PINMUX11_19_16));% g* M7 A+ D6 k& P# V" \* ^
, f$ [+ r6 M! u8 m5 `" j; i# F
HWREG(SOC_SYSCFG_0_REGS + SYSCFG0_PINMUX(11)) = (PINMUX11_BUSY_V1_ENABLE | PINMUX11_BUSY_V2_ENABLE | savePinMux); m% @' o3 z& e6 }+ m8 B
3 R. v# q7 D9 `* Y 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));
7 J5 x' S+ M- a- _$ V4 ~
; v! ~9 W, \6 J' |" d- \6 i HWREG(SOC_SYSCFG_0_REGS + SYSCFG0_PINMUX(12)) = (PINMUX12_RESET_ENABLE | PINMUX12_CONVST_ENABLE | PINMUX12_RD_ENABLE | PINMUX12_BUSY_C_ENABLE | savePinMux);/ ^6 _3 s2 H/ B6 n2 E% v
2 ~8 h, m9 P W3 o, A
}
( b3 q2 q+ q: V/ g7 B8 n) `8 P B3 U
3 k) K1 {% A! _& `/ o
" B2 g3 U5 k ^static void ad7606_gpio_setup(ad7606 *ad) {, i5 U$ x$ [% n8 W4 K0 b
/*Set the AD7606_PAR_BUSY to the input mode*/: [7 L! Q4 P" A- n7 A+ G3 {
//初始化5.11、5.9 、 5.5为中断口# `. [. `# V% |% E: z$ p& ` P
GPIODirModeSet(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_V1, GPIO_DIR_INPUT);$ d* K# P% v% [
GPIODirModeSet(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_V2, GPIO_DIR_INPUT);
; \; m$ i) |, V( o GPIODirModeSet(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_C, GPIO_DIR_INPUT);+ |6 t$ \, b0 S1 z
//GPIODirModeSet(SOC_GPIO_0_REGS, AD7606_PAR_BUSY, GPIO_DIR_INPUT);
7 q# ~! e! x, ^- Q /*Set the AD7606_PAR_BUSY to the Falling Edge Interrupt*/
! i8 J) t/ `2 V w GPIOIntTypeSet(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_V1, GPIO_INT_TYPE_FALLEDGE);0 F' b2 g& e! ]; ?
GPIOIntTypeSet(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_V2, GPIO_INT_TYPE_FALLEDGE);# W! r9 m0 y1 X: j0 W
GPIOIntTypeSet(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_C, GPIO_INT_TYPE_FALLEDGE);
0 G2 Z: q& `1 w$ H( _ //GPIOIntTypeSet(SOC_GPIO_0_REGS, AD7606_PAR_BUSY, GPIO_INT_TYPE_FALLEDGE);% P9 z! j7 c, }, P4 x
/*The interrupt setting allows AD7606_PAR_BUSY_GPIO_BANK*/. _, r0 A% S- h! p* @
GPIOBankIntEnable(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_GPIO_BANK);7 R3 d3 X3 j7 }" s" ]9 m
0 [* k0 S- y% l4 W GPIODirModeSet(SOC_GPIO_0_REGS, AD7606_PAR_RESET, GPIO_DIR_OUTPUT); B$ K2 V3 ?5 a4 U$ K9 g7 p
GPIOPinWrite(SOC_GPIO_0_REGS, AD7606_PAR_RESET, GPIO_PIN_HIGH);
! V: c' `- F7 ~" ] Task_sleep(1000);/ {+ i6 Z/ f) p1 H1 w9 [
GPIOPinWrite(SOC_GPIO_0_REGS, AD7606_PAR_RESET, GPIO_PIN_LOW);: T9 F4 z+ t6 i9 s# q+ n" K+ D. R7 V
Task_sleep(1000);
z3 L" ?; R, p8 c- p Z) b* {, J4 E+ i/ a( N6 N3 y; P
/*Set the AD7606_PAR_CONVST to output mode*/
) B% b& t4 [" v% I/ E3 i GPIODirModeSet(SOC_GPIO_0_REGS, AD7606_PAR_CONVST, GPIO_DIR_OUTPUT);
2 Q8 M/ f; |( ^0 k# K GPIOPinWrite(SOC_GPIO_0_REGS, AD7606_PAR_CONVST, GPIO_PIN_LOW);. k4 Z; {" C6 j h+ w
3 P6 J' w. J% b% r& ~+ `
GPIODirModeSet(SOC_GPIO_0_REGS, AD7606_PAR_RD, GPIO_DIR_OUTPUT);% P3 s. H% u- I# I( l. |
GPIOPinWrite(SOC_GPIO_0_REGS, AD7606_PAR_RD, GPIO_PIN_HIGH);
7 n" I- u8 b5 ?
( D+ p6 c- M, d# n6 I# U+ e! B}
- k# [, Z0 A8 p1 N$ L2 k$ e0 u6 `# Y0 N* p. h5 x3 j
! M. P8 c& G* D5 c7 G
static void ad7606_busy_hwi(UArg ad_addr) {
* L) t: e0 b5 V ^( m; w3 z7 S/ I; c3 {9 m
. a! J- [7 g- d- z6 X /* Disable the interrupts for pins of bank AD7606_PAR_BUSY in GPIO.*/, n: q. V4 `5 F! ]6 g2 b Y
GPIOBankIntDisable(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_GPIO_BANK); //用仿真器debug,发现程序能进入这里。
) ^$ K. h4 s8 m/ Y6 [9 {/ I; ^. J4 q1 y
if(GPIOPinIntStatus(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_V1) == GPIO_INT_PEND)
8 j& E( _: ?7 _5 b+ n& b {3 s) w9 @4 W! j% e V! ^% i1 y0 P
GPIOPinIntClear(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_V1); //问题是:用仿真器debug,发现程序不能进入这里。) w' r" I, a3 a- h
cs_addr = SOC_EMIFA_CS5_ADDR ;& V. |# _9 W4 ]$ j: M$ U8 A1 C
internal = 0 ;- C% \% C# N$ \5 U* K1 W; N1 R- ?
int_flag[0] = 1 ;+ x$ E$ x) Y9 e& u! N1 V, s
}
. V. L% x0 O6 n, u5 E( T if(GPIOPinIntStatus(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_V2) == GPIO_INT_PEND) }6 r# u: G3 ?: X& o6 n" p
{" `0 s7 z9 l. R/ x' h) L$ k
GPIOPinIntClear(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_V2); //问题是:用仿真器debug,发现程序不能进入这里。
# m6 J' ^$ E- {7 n6 L& n( z cs_addr = SOC_EMIFA_CS4_ADDR ;7 a1 n; }2 x* c5 N- o/ d) h
internal = 6 ;" k# c- o" D9 E t ^- n% H: S' }9 q
int_flag[1] = 1 ;
1 F3 E4 |2 Y4 }) z4 d }
$ z4 `5 D9 ^& B: }' {2 I if(GPIOPinIntStatus(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_C) == GPIO_INT_PEND)
8 B: L7 Y9 L9 t/ R* e6 k {
9 Y8 W" t+ t0 s; ~8 x; d GPIOPinIntClear(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_C); //问题是:用仿真器debug,发现程序不能进入这里。- N5 D, `8 C2 R; M
cs_addr = SOC_EMIFA_CS2_ADDR ;
$ E% `) i& N- @4 }8 T* X. c internal = 12 ;
% @3 N* q! ?5 y2 F' e8 n int_flag[2] = 1 ;7 O9 ^6 o0 f2 s7 R
}
/ l8 E9 u/ F/ x0 q+ U- |
- Z% ^1 C4 A8 ] v9 X GPIOPinWrite(SOC_GPIO_0_REGS, AD7606_PAR_CONVST, GPIO_PIN_LOW);$ ]. f5 y7 x1 Y) L8 D/ R2 C A. c
4 V# J5 |! H7 b0 D! d
GPIOBankIntEnable(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_GPIO_BANK);
i6 v0 l$ b% Q/ u}
6 q7 D$ x! x6 U+ v0 i R/ q1 \5 i5 x6 K( P V. R+ k! _
|
|