|
您好。使用GPIO中断时,中断能进入ISR,但是不能区分具体的GPIO端口。程序如下:
6 @$ n4 i! e) l# d' p9 v#define AD7606_PAR_BUSY_GPIO_BANK 5# C; _' q/ ~7 l
#define AD7606_PAR_BUSY_GPIO_BANK_INT SYS_INT_GPIO_B5INT
: ~& X) V7 O# n3 y3 H+ i; {
3 D. w6 F, M/ j5 ]5 s8 W#define AD7606_PAR_BUSY_V1 GPIO_TO_PIN(5, 11) //BANK5的中断口5.11+ b. I1 \" @$ X& ^: N; H& F
#define AD7606_PAR_BUSY_V2 GPIO_TO_PIN(5, 9) //BANK5的中断口5.9* X5 A! k; }9 e
#define AD7606_PAR_BUSY_C GPIO_TO_PIN(5, 5) //BANK5的中断口5.5
& ]) |. c( Q$ s. N7 q% m#define AD7606_PAR_BUSY GPIO_TO_PIN(5, 4)
! u7 m, P8 I* S0 r8 E" T1 ~. @7 k1 v/ Y$ X% {+ y+ Y3 B" }
#define AD7606_PAR_CONVST GPIO_TO_PIN(5, 1)
" q5 ^* a* Y7 K' D: B% {. a/ r) Z4 o#define AD7606_PAR_RD GPIO_TO_PIN(5, 2)
, W- A: J h: h3 r#define AD7606_PAR_RESET GPIO_TO_PIN(5, 0)1 m% x0 p# N2 ^( s! y& m
6 g: T' ]2 B7 ^+ M1 @
& B9 P! e3 _( X; \5 n% }" i0 {. B7 A2 b$ t
static void ad7606_irq_setup(ad7606 *ad) {0 P% _7 J) `( u) g& d
Hwi_Params hwiParams;' `3 o$ k# N$ d, q
Hwi_Handle myHwi;
% x7 O2 s0 E- ]( S% L Error_Block eb;. X8 t1 Z X) U' O" L! |1 W
$ G5 B; ^/ ^. w$ m) X
Error_init(&eb);/ S; ^+ P( z1 j% |% X3 W& r$ K: i
Hwi_Params_init(&hwiParams);
4 o5 G3 g' A$ x5 f$ F hwiParams.arg = (unsigned int)ad;/ [+ o) n$ z$ p& B6 G+ y9 a4 a! d) Y* @
hwiParams.enableInt = FALSE;
' ?, f- _+ V( `; p' ~7 ?. y hwiParams.eventId = SYS_INT_GPIO_B5INT;
! G$ r+ V. ~2 u6 P1 ? hwiParams.priority = 4;
4 E' l: f' e$ Z, n5 T5 ^: R- Q# T myHwi = Hwi_create(8, ad7606_busy_hwi, &hwiParams, &eb); //注册BANK5中断处理函数
5 p/ P# l8 d3 U8 }0 f k+ H. h if (myHwi == NULL)
1 m! T& O& x9 T) n7 J LOG_FATAL("failed to create hwi");3 P7 d e6 V9 q/ E; Y, x, q0 s
3 w% d& ~" _/ z! C5 _2 M /* enable both interrupts */
}: M0 D3 t* |9 C Hwi_enableInterrupt(ad->irq_event);
/ N. \" x' d4 F8 y% {}
0 l; L! K$ \/ }% ~% t* Y- M; y
, J' H0 F6 u& F2 k- a% z' \8 m6 @9 ?: C1 W- |
static void ad7606_gpio_pinmux_setup(ad7606 *ad) {
. h9 o+ [9 V6 G. k" R& H volatile unsigned int savePinMux = 0;0 K5 ]' U; G: x& L) c* t# ~. u
//初始化5.11、5.9 、 5.5为GPIO口
' M. Z0 @/ }# R- J5 i3 ? savePinMux = HWREG(SOC_SYSCFG_0_REGS + SYSCFG0_PINMUX(11)) & (~(SYSCFG_PINMUX11_PINMUX11_27_24 | SYSCFG_PINMUX11_PINMUX11_19_16));
% D9 U+ U* \8 }7 d% W! E" W3 y" e1 K. s6 @5 L. a
HWREG(SOC_SYSCFG_0_REGS + SYSCFG0_PINMUX(11)) = (PINMUX11_BUSY_V1_ENABLE | PINMUX11_BUSY_V2_ENABLE | savePinMux);; `. t8 F8 R4 O1 F' s9 T$ p
% r" ^+ W5 T) L0 h+ q8 t" 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));* l4 y% u. \# ]( l: D3 M
7 q, h) T9 Q |# w HWREG(SOC_SYSCFG_0_REGS + SYSCFG0_PINMUX(12)) = (PINMUX12_RESET_ENABLE | PINMUX12_CONVST_ENABLE | PINMUX12_RD_ENABLE | PINMUX12_BUSY_C_ENABLE | savePinMux);; _# V+ J4 `0 e5 E1 v' Q/ L1 e
5 M. L1 {: N3 c P9 [
}# h4 M( g% n8 b: U0 o7 a
; f2 _+ G# d# R! c1 G0 T
+ `5 M W5 Q. O% s& A' w: ^
static void ad7606_gpio_setup(ad7606 *ad) {
% b* l X) @% P6 n /*Set the AD7606_PAR_BUSY to the input mode*/
- t# x: b* D W1 c" t+ \/ s //初始化5.11、5.9 、 5.5为中断口/ Z1 |# U" h( g; R) `
GPIODirModeSet(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_V1, GPIO_DIR_INPUT);
6 v0 r( |$ g4 U) T" e" J2 r( W GPIODirModeSet(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_V2, GPIO_DIR_INPUT);' r- Z& G( x. z) ]6 z
GPIODirModeSet(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_C, GPIO_DIR_INPUT);
7 m0 c& V0 F# @' G1 N. k2 ^ o5 f //GPIODirModeSet(SOC_GPIO_0_REGS, AD7606_PAR_BUSY, GPIO_DIR_INPUT);
" Q7 h) {; e+ }% D. t8 {' ^6 K1 i /*Set the AD7606_PAR_BUSY to the Falling Edge Interrupt*/
" }7 Z: v& n5 G$ e GPIOIntTypeSet(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_V1, GPIO_INT_TYPE_FALLEDGE);
3 n1 i* k$ {1 G8 }% k: A GPIOIntTypeSet(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_V2, GPIO_INT_TYPE_FALLEDGE);8 L% M1 a: ]6 Z# W8 |
GPIOIntTypeSet(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_C, GPIO_INT_TYPE_FALLEDGE);
' z/ M! d# x# y0 p B& ^ //GPIOIntTypeSet(SOC_GPIO_0_REGS, AD7606_PAR_BUSY, GPIO_INT_TYPE_FALLEDGE);7 K8 K5 \: \5 F: C. z5 t
/*The interrupt setting allows AD7606_PAR_BUSY_GPIO_BANK*/. Q; \) ~% [* _6 y, d4 j Q
GPIOBankIntEnable(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_GPIO_BANK);+ x! k: Q+ J5 _
5 y4 i. W+ X( u( \1 | w/ A
GPIODirModeSet(SOC_GPIO_0_REGS, AD7606_PAR_RESET, GPIO_DIR_OUTPUT);& z4 w. U1 E3 F. r( h2 P
GPIOPinWrite(SOC_GPIO_0_REGS, AD7606_PAR_RESET, GPIO_PIN_HIGH);/ {4 V: S9 Y' z. S8 ], I$ A, ?
Task_sleep(1000);
" r' u0 ?; `; x- i$ x GPIOPinWrite(SOC_GPIO_0_REGS, AD7606_PAR_RESET, GPIO_PIN_LOW);
5 \) y) `# @. y! r/ M* O& U0 d Task_sleep(1000);
9 @0 g- I) S$ p& \5 A
8 {( p& @$ }/ M1 ] /*Set the AD7606_PAR_CONVST to output mode*/! g3 ]8 Y+ K3 d6 |/ z$ {
GPIODirModeSet(SOC_GPIO_0_REGS, AD7606_PAR_CONVST, GPIO_DIR_OUTPUT);
# |/ w7 j/ g9 i GPIOPinWrite(SOC_GPIO_0_REGS, AD7606_PAR_CONVST, GPIO_PIN_LOW);
6 Q- Q- L" t3 \. W0 g- M1 O4 ]& O- P3 C3 A* ~) l# I4 |$ w1 y
GPIODirModeSet(SOC_GPIO_0_REGS, AD7606_PAR_RD, GPIO_DIR_OUTPUT);
" \- D2 [$ j5 _) c GPIOPinWrite(SOC_GPIO_0_REGS, AD7606_PAR_RD, GPIO_PIN_HIGH);
( O! s3 ?7 x# x; P) m3 h" q/ }9 ~; `
- c) i4 S* f* ^: Y}
( m3 E# u6 I0 U1 c/ \' e- u4 n
0 L# }1 G, n( Y# c P) t* z, n. w& d( { M( A: O7 w: o
static void ad7606_busy_hwi(UArg ad_addr) {- u1 D- E5 H5 c( g
4 ]- U% c' z$ U& F) B8 E' V
0 P1 w& [% i8 U
/* Disable the interrupts for pins of bank AD7606_PAR_BUSY in GPIO.*/$ S7 |" @; a+ X9 z
GPIOBankIntDisable(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_GPIO_BANK); //用仿真器debug,发现程序能进入这里。4 k# n2 B+ H2 ^: r
# K/ V0 D6 {8 p: X( C% ^3 p
if(GPIOPinIntStatus(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_V1) == GPIO_INT_PEND). N' r3 }6 P1 x! o
{
' {' b2 E6 h. f/ r3 ? GPIOPinIntClear(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_V1); //问题是:用仿真器debug,发现程序不能进入这里。
) s( a9 ~+ N$ ^: s1 j0 ]; z cs_addr = SOC_EMIFA_CS5_ADDR ;
# e) Q- U; h- D n% k- ^ internal = 0 ;; s9 w6 I! d+ n" ?: l. U' V8 y
int_flag[0] = 1 ;
% T+ g2 x5 Z' ? }8 v) K$ C0 e9 r" c8 O0 i5 i7 I- e
if(GPIOPinIntStatus(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_V2) == GPIO_INT_PEND)
, T' j' m: \2 `1 y- B {
8 c u9 P4 u9 r3 R9 R+ t GPIOPinIntClear(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_V2); //问题是:用仿真器debug,发现程序不能进入这里。; {$ x6 \- e6 l, h, ?' U5 _
cs_addr = SOC_EMIFA_CS4_ADDR ;/ V" F/ H$ e/ N. I- l; H F2 q, U
internal = 6 ;+ `4 V+ B) l& k# K
int_flag[1] = 1 ;. z) W0 c% g7 J) X4 ], j3 I w
}
6 z; E' @1 q4 e3 ^8 V! j+ M if(GPIOPinIntStatus(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_C) == GPIO_INT_PEND)
% x+ z# E# |5 w |, {6 h2 w& N1 y {
1 G3 C$ ~/ B4 x, f GPIOPinIntClear(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_C); //问题是:用仿真器debug,发现程序不能进入这里。3 H# l% h9 ^# e8 N% e
cs_addr = SOC_EMIFA_CS2_ADDR ;
) i! Q u4 u2 n5 y* \" S6 ` internal = 12 ;- d* v, C/ }; @9 \! v9 z; m2 |
int_flag[2] = 1 ;/ E2 n% T" R7 q/ G
}4 n* q5 x/ @2 H X9 \
. G" m7 E' i* W1 \. E: [
GPIOPinWrite(SOC_GPIO_0_REGS, AD7606_PAR_CONVST, GPIO_PIN_LOW);
! F" g" y: A) U0 A
1 ^5 c9 Z a$ t; Y% M- e8 S) l GPIOBankIntEnable(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_GPIO_BANK);( W; z. M, u& |9 ~8 B0 X
}
# S) t- W* A/ q0 l! }" N; c. i1 `
/ j5 o6 E8 E5 L
1 a V% h" ^- B0 s/ B k& ^6 R/ }+ A
/ o* `1 J: J0 Q- Z |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
|