|
|
您好。使用GPIO中断时,中断能进入ISR,但是不能区分具体的GPIO端口。程序如下:
1 ?8 |: a! {# d, c#define AD7606_PAR_BUSY_GPIO_BANK 5
4 n% @% K/ h' `6 g# q#define AD7606_PAR_BUSY_GPIO_BANK_INT SYS_INT_GPIO_B5INT
# j0 h I# Y' I& @1 O/ _* T' q
#define AD7606_PAR_BUSY_V1 GPIO_TO_PIN(5, 11) //BANK5的中断口5.114 @3 u! U6 }5 z, F. i7 E' Y
#define AD7606_PAR_BUSY_V2 GPIO_TO_PIN(5, 9) //BANK5的中断口5.97 X6 }/ Q* `0 M9 h
#define AD7606_PAR_BUSY_C GPIO_TO_PIN(5, 5) //BANK5的中断口5.5
+ e* q: B2 a$ g. u' p) S$ O#define AD7606_PAR_BUSY GPIO_TO_PIN(5, 4)
" w% b9 E+ B. M, }3 N# a: R; h! K1 i2 T B! z+ U( C( \
#define AD7606_PAR_CONVST GPIO_TO_PIN(5, 1)
( a0 h8 u+ E' U/ H#define AD7606_PAR_RD GPIO_TO_PIN(5, 2)
+ c V* I& q. I" E#define AD7606_PAR_RESET GPIO_TO_PIN(5, 0)
- s% B4 o( s1 V: X
/ y& o. B% L9 {' @; {
8 _) b" A# E* p! {+ l; @( r' q* v1 ]- \& k0 H7 O& l4 Z" T7 J. p
static void ad7606_irq_setup(ad7606 *ad) {1 R, }* k; Q# E# |6 T i
Hwi_Params hwiParams;* b S. O% k1 m7 V% ~
Hwi_Handle myHwi;
0 g6 Q8 t) d: g& ^ Error_Block eb;6 u8 S4 |- ? b. d) l8 p
0 l# p* M! k8 S, V% w0 m7 S# C Error_init(&eb);
8 Y: {! K7 R' ^+ S @ ^( J; v Hwi_Params_init(&hwiParams);
9 Q4 {% ?- T1 r9 k- j" q hwiParams.arg = (unsigned int)ad;' {! H6 n( _5 ~, E% j
hwiParams.enableInt = FALSE;) z% o& [0 ~2 E! b% Y4 \
hwiParams.eventId = SYS_INT_GPIO_B5INT;
, K! N3 l" o! b9 u( } hwiParams.priority = 4;
' `1 _4 R2 X( V0 K myHwi = Hwi_create(8, ad7606_busy_hwi, &hwiParams, &eb); //注册BANK5中断处理函数
! M% p( F8 w9 p8 y: O if (myHwi == NULL)
$ o) c1 x8 L. M LOG_FATAL("failed to create hwi");% m! A# w. T& Q0 @1 c& \! Z% \5 Y
# e5 a( ]5 {8 U2 H; f) t /* enable both interrupts */
/ @) ^. P2 g0 C4 R Hwi_enableInterrupt(ad->irq_event);
. o/ |8 `5 B2 S" E}, x/ C8 z: H$ y! f8 L
5 c7 x, `" m: j& M: z
, P$ `- P" n+ ^# c2 m- }3 Bstatic void ad7606_gpio_pinmux_setup(ad7606 *ad) {, m+ _, |* ?% |( V9 |# C
volatile unsigned int savePinMux = 0;4 k; ^, z/ T! Y( C4 Y- L
//初始化5.11、5.9 、 5.5为GPIO口
2 K& j; | O, }; G- M* _, A% K savePinMux = HWREG(SOC_SYSCFG_0_REGS + SYSCFG0_PINMUX(11)) & (~(SYSCFG_PINMUX11_PINMUX11_27_24 | SYSCFG_PINMUX11_PINMUX11_19_16));
; W! v6 i9 d: ^, g3 T2 Z. P6 I C" b- I) O3 p
HWREG(SOC_SYSCFG_0_REGS + SYSCFG0_PINMUX(11)) = (PINMUX11_BUSY_V1_ENABLE | PINMUX11_BUSY_V2_ENABLE | savePinMux);$ n2 M# S) \" a% U) ]
5 t6 P) n6 d( n/ g2 w! p
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));
, E1 Z. s& G2 `
: Y$ @! u2 J4 J7 D2 {0 c HWREG(SOC_SYSCFG_0_REGS + SYSCFG0_PINMUX(12)) = (PINMUX12_RESET_ENABLE | PINMUX12_CONVST_ENABLE | PINMUX12_RD_ENABLE | PINMUX12_BUSY_C_ENABLE | savePinMux);& S7 ?2 X6 ~1 F5 q
5 p( K6 p& ]2 B" a/ U}
0 {# _- H$ n' [8 n4 k8 _1 o0 P$ c' I& M1 M# ]8 M
8 i: R$ i" e4 L; ~) G2 Y# \/ P2 ]
static void ad7606_gpio_setup(ad7606 *ad) {
% G; @/ l' G2 ^$ C /*Set the AD7606_PAR_BUSY to the input mode*/
3 C/ c+ z+ L5 w+ v' \7 `' N //初始化5.11、5.9 、 5.5为中断口
" d7 X. f5 {+ P# K( x GPIODirModeSet(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_V1, GPIO_DIR_INPUT);
5 C6 [, k9 z- P$ [5 [; @) N0 g& u" i GPIODirModeSet(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_V2, GPIO_DIR_INPUT);& a @4 p% R3 x0 p3 _0 \+ X9 j
GPIODirModeSet(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_C, GPIO_DIR_INPUT);2 H1 I7 D4 W) _( h$ k
//GPIODirModeSet(SOC_GPIO_0_REGS, AD7606_PAR_BUSY, GPIO_DIR_INPUT);0 C0 E; H$ k5 ~9 O
/*Set the AD7606_PAR_BUSY to the Falling Edge Interrupt*/
2 z, X, p2 m! d" c. w2 W GPIOIntTypeSet(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_V1, GPIO_INT_TYPE_FALLEDGE);& ]0 c, y. ^, p, l- l
GPIOIntTypeSet(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_V2, GPIO_INT_TYPE_FALLEDGE);% w$ m4 w! E( X/ J7 V
GPIOIntTypeSet(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_C, GPIO_INT_TYPE_FALLEDGE);
0 Z& a, n( k5 N F; m& N //GPIOIntTypeSet(SOC_GPIO_0_REGS, AD7606_PAR_BUSY, GPIO_INT_TYPE_FALLEDGE);
' F! S4 E( P' V3 E( b0 b3 p /*The interrupt setting allows AD7606_PAR_BUSY_GPIO_BANK*/
~& J6 f7 ]: a7 x5 H' y GPIOBankIntEnable(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_GPIO_BANK);
" @ x0 H* N: ?9 K' r6 Y0 Q. ^2 U( x/ p% b" \. g7 u# [
GPIODirModeSet(SOC_GPIO_0_REGS, AD7606_PAR_RESET, GPIO_DIR_OUTPUT);
; x2 j( |1 k0 F, N2 v/ v GPIOPinWrite(SOC_GPIO_0_REGS, AD7606_PAR_RESET, GPIO_PIN_HIGH);9 v( q' A. v, z [2 Y2 u$ ^
Task_sleep(1000);
/ t7 P- H" m% m4 n# I6 J+ m GPIOPinWrite(SOC_GPIO_0_REGS, AD7606_PAR_RESET, GPIO_PIN_LOW);
1 x5 J7 |/ o* q" o Task_sleep(1000);; {5 w D) V) }6 N( e8 q4 m) A
8 X% m! Z W( r, J* u4 s+ t7 G
/*Set the AD7606_PAR_CONVST to output mode*/: z3 ^1 q" B0 M0 ^. V
GPIODirModeSet(SOC_GPIO_0_REGS, AD7606_PAR_CONVST, GPIO_DIR_OUTPUT);# r, v* I: s8 I' L, Y
GPIOPinWrite(SOC_GPIO_0_REGS, AD7606_PAR_CONVST, GPIO_PIN_LOW);
/ f& v( }3 w4 q* K1 ?- ^0 A
5 ~5 l8 W3 P I( J0 h6 ] GPIODirModeSet(SOC_GPIO_0_REGS, AD7606_PAR_RD, GPIO_DIR_OUTPUT);
" j: e d: x/ t3 Q6 f GPIOPinWrite(SOC_GPIO_0_REGS, AD7606_PAR_RD, GPIO_PIN_HIGH);
: T2 }, j7 E2 r( |8 x9 G' ?" {( M! V( k9 W
}4 ]6 j. W9 l# d( `! X T! _+ m. a
3 U6 d& U0 G2 s4 E- ^" q" H
0 n2 u' F/ }& E) I9 `# r
static void ad7606_busy_hwi(UArg ad_addr) { H y4 _& K v Z+ y
; |( g* q4 e' q* T
1 g4 m1 T) n/ q' v6 a# A /* Disable the interrupts for pins of bank AD7606_PAR_BUSY in GPIO.*/' z3 c' M' l8 g" w6 s
GPIOBankIntDisable(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_GPIO_BANK); //用仿真器debug,发现程序能进入这里。
) D9 l: Y' X6 U- J7 ]7 j
9 P% c3 R, x* l# Z3 W5 Y6 w if(GPIOPinIntStatus(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_V1) == GPIO_INT_PEND)
2 D3 K4 k# d5 ?, c {: M0 |) C5 @# c
GPIOPinIntClear(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_V1); //问题是:用仿真器debug,发现程序不能进入这里。
: x: l: E0 I4 e& f; b cs_addr = SOC_EMIFA_CS5_ADDR ;( }4 Z, [# l! p, {
internal = 0 ;
- u! ~4 a$ S: i7 V+ C/ u9 I int_flag[0] = 1 ;! m3 `7 ?0 \% \; {. ~7 |4 c7 U
}
0 d k$ F- o( B5 |; l/ \ if(GPIOPinIntStatus(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_V2) == GPIO_INT_PEND)
) t. Z; E8 i; K5 e, C3 ~ {( F" _2 J; ~; L6 t( O
GPIOPinIntClear(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_V2); //问题是:用仿真器debug,发现程序不能进入这里。, \1 R0 c- D8 J9 c8 `
cs_addr = SOC_EMIFA_CS4_ADDR ;, ^+ W, l& g2 N
internal = 6 ;& [' g3 b( s1 |% w2 X, u& V T
int_flag[1] = 1 ;1 W7 I0 M) A2 q H
}
+ n) r3 \4 y: o! q if(GPIOPinIntStatus(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_C) == GPIO_INT_PEND)& \1 z p8 n3 B& k
{
( q2 v1 m& b- V9 t/ g GPIOPinIntClear(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_C); //问题是:用仿真器debug,发现程序不能进入这里。
6 w5 B; ]( W3 l. Z5 Y' t: x cs_addr = SOC_EMIFA_CS2_ADDR ;
2 E. Z$ ~$ \) n( a, F4 A internal = 12 ;4 j! l* K4 x* G
int_flag[2] = 1 ;, u- _* r) [- c: p; Q p
}9 C A, V) @: V; `& A* u$ x
8 e( N: Q& D2 E' P* C
GPIOPinWrite(SOC_GPIO_0_REGS, AD7606_PAR_CONVST, GPIO_PIN_LOW);1 u$ R [/ o9 t: t. C$ y. A
! l' r/ z# Y a* L GPIOBankIntEnable(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_GPIO_BANK);
: v: ~$ k. K# F3 V8 f}4 d q- z- p6 O" n
}3 \( B: q/ T4 C. i- u4 W* o( Y3 w3 ?4 G3 Y/ i$ l
$ z i$ }4 R% k% }/ E( |6 @# W) s% j+ B& h
|
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
|