|
|
您好。使用GPIO中断时,中断能进入ISR,但是不能区分具体的GPIO端口。程序如下:/ W+ i8 v% b/ B! N' `
#define AD7606_PAR_BUSY_GPIO_BANK 5
5 \' a0 b# F% O#define AD7606_PAR_BUSY_GPIO_BANK_INT SYS_INT_GPIO_B5INT
1 S& V8 ?/ D, H6 b! ]5 ~! P$ d2 n6 C* U) l) u7 Y4 d: X9 Z
#define AD7606_PAR_BUSY_V1 GPIO_TO_PIN(5, 11) //BANK5的中断口5.11
0 `' C6 r% t0 l; O0 r0 Z: ?* @/ j#define AD7606_PAR_BUSY_V2 GPIO_TO_PIN(5, 9) //BANK5的中断口5.9* ~% G" N* s) \; l& ?' h ^! B
#define AD7606_PAR_BUSY_C GPIO_TO_PIN(5, 5) //BANK5的中断口5.54 S1 w p2 f' _7 A) z
#define AD7606_PAR_BUSY GPIO_TO_PIN(5, 4)
8 k. k7 N: L* ?5 W+ `; c8 L: d# ^+ F
#define AD7606_PAR_CONVST GPIO_TO_PIN(5, 1)4 Q3 [# H9 N( T; x# |* Y
#define AD7606_PAR_RD GPIO_TO_PIN(5, 2)
9 y: N9 o( {9 [& y! w! Y#define AD7606_PAR_RESET GPIO_TO_PIN(5, 0). S( D6 D3 w; v: A
4 C/ `+ A6 X+ b! B9 `7 ? B9 U# F# Z3 q p2 X" D/ V3 b
4 p3 t: R. U. _7 B* ?( Q
static void ad7606_irq_setup(ad7606 *ad) {
9 `* o6 d+ `- f3 u Hwi_Params hwiParams;. r0 r, X; W6 w0 |) S
Hwi_Handle myHwi;
% S& F& Q" J# g' l: U' D: H) t Error_Block eb;# u* |) _! [4 O5 _1 n0 R* V* B
' }/ t1 x0 h) }& J! l( Y
Error_init(&eb);
* @/ j8 I2 P, d \- U6 \0 s Hwi_Params_init(&hwiParams);
! ]3 S5 J+ f' O/ N: W, X hwiParams.arg = (unsigned int)ad;5 O u# u( \/ t; O
hwiParams.enableInt = FALSE;4 C( f7 u% |8 B$ a m# Y
hwiParams.eventId = SYS_INT_GPIO_B5INT;1 z0 q2 k( c: A, `9 m4 w& q
hwiParams.priority = 4;
& f. Z; P; W% }' o0 [: D1 H myHwi = Hwi_create(8, ad7606_busy_hwi, &hwiParams, &eb); //注册BANK5中断处理函数
5 a0 u8 w3 I4 ~% K N. C4 f if (myHwi == NULL)
5 l6 R" e& o& ^2 h' k) [* { LOG_FATAL("failed to create hwi");
. ?* K1 v. K+ |# [& }1 |4 c: b7 P3 t/ e0 S5 G( y( V
/* enable both interrupts */! I$ [# M& V* Y# x3 S& R" a
Hwi_enableInterrupt(ad->irq_event);
' H8 v) j2 C" x4 b$ i$ @' s}/ m+ r8 ~+ R, L8 F
4 G4 E n/ d* D* w( O4 a
" m+ a; R, r% }5 istatic void ad7606_gpio_pinmux_setup(ad7606 *ad) {8 G% s! S" i' b' o. ?
volatile unsigned int savePinMux = 0;! g: D. Z4 A+ M. [. K, a% C
//初始化5.11、5.9 、 5.5为GPIO口
: f% ^/ Y2 c9 _9 @' { savePinMux = HWREG(SOC_SYSCFG_0_REGS + SYSCFG0_PINMUX(11)) & (~(SYSCFG_PINMUX11_PINMUX11_27_24 | SYSCFG_PINMUX11_PINMUX11_19_16));
9 Z! z& Y: f4 W ]0 b0 ^) C- h: @) u+ X, G
HWREG(SOC_SYSCFG_0_REGS + SYSCFG0_PINMUX(11)) = (PINMUX11_BUSY_V1_ENABLE | PINMUX11_BUSY_V2_ENABLE | savePinMux);! `0 H8 c) u/ N% A p' h- E2 R! ]
! X _' z/ a) _/ Z/ ]
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));) ?: F/ h( M- I# i- N% V
4 B, |9 P, c5 U6 i( x
HWREG(SOC_SYSCFG_0_REGS + SYSCFG0_PINMUX(12)) = (PINMUX12_RESET_ENABLE | PINMUX12_CONVST_ENABLE | PINMUX12_RD_ENABLE | PINMUX12_BUSY_C_ENABLE | savePinMux);
+ D& q/ s* L) Y8 i* Z
+ l/ U+ p6 w4 R9 F8 D/ j* }0 `}
" }/ c9 y9 R i' l3 V2 W$ M v* _" k$ W& h# H% w3 G/ D7 e4 P
' M& r6 m! I2 Y8 A$ E
static void ad7606_gpio_setup(ad7606 *ad) {
8 L( v; ?8 M4 V. z" U /*Set the AD7606_PAR_BUSY to the input mode*/
: m# s. m; ~9 J //初始化5.11、5.9 、 5.5为中断口
: l! r/ W J+ r( L GPIODirModeSet(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_V1, GPIO_DIR_INPUT);
5 Y2 c# L& L% k5 [6 e* w. m GPIODirModeSet(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_V2, GPIO_DIR_INPUT);
5 P' Z j) J' o( \1 i6 H GPIODirModeSet(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_C, GPIO_DIR_INPUT);! Q" T# y& T- F
//GPIODirModeSet(SOC_GPIO_0_REGS, AD7606_PAR_BUSY, GPIO_DIR_INPUT);
' L- y' b! H7 F; X /*Set the AD7606_PAR_BUSY to the Falling Edge Interrupt*/- B' _6 y: Y% `5 ~& z' h
GPIOIntTypeSet(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_V1, GPIO_INT_TYPE_FALLEDGE);8 g! J& [4 `7 f0 _9 [; [% q: z
GPIOIntTypeSet(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_V2, GPIO_INT_TYPE_FALLEDGE);5 B7 @: j( G& N- q4 a" V T$ y: ~
GPIOIntTypeSet(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_C, GPIO_INT_TYPE_FALLEDGE);( B3 d: g- C p0 l
//GPIOIntTypeSet(SOC_GPIO_0_REGS, AD7606_PAR_BUSY, GPIO_INT_TYPE_FALLEDGE);/ C- V9 Z0 u# {5 x f9 Q) s5 }) Y
/*The interrupt setting allows AD7606_PAR_BUSY_GPIO_BANK*/
/ ]5 N5 k: W; e/ k5 H) \. X. P1 g GPIOBankIntEnable(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_GPIO_BANK);
& s- C6 e' E' Q0 Z
) E( A3 ^! p4 \- ~ h GPIODirModeSet(SOC_GPIO_0_REGS, AD7606_PAR_RESET, GPIO_DIR_OUTPUT);9 c. j9 e' c' S5 E x
GPIOPinWrite(SOC_GPIO_0_REGS, AD7606_PAR_RESET, GPIO_PIN_HIGH);% b- q1 o8 H$ |- Y( a6 Q4 M# F
Task_sleep(1000);5 o7 G* ?" w+ J3 ~9 x7 g: R. K% O
GPIOPinWrite(SOC_GPIO_0_REGS, AD7606_PAR_RESET, GPIO_PIN_LOW);
& V! X# s& F2 |& ~8 J/ u Task_sleep(1000);2 x- M; a) P) H' N- |; w
3 D6 A' f5 n+ w0 A, ?
/*Set the AD7606_PAR_CONVST to output mode*/8 R4 Z& E: z% c: ?
GPIODirModeSet(SOC_GPIO_0_REGS, AD7606_PAR_CONVST, GPIO_DIR_OUTPUT);
2 P- k; q' \( @' ?5 @) k; I GPIOPinWrite(SOC_GPIO_0_REGS, AD7606_PAR_CONVST, GPIO_PIN_LOW); Y/ i% w. \9 U) {2 z$ I* F% L. Y! b4 Z
* W0 v5 x5 }1 _ GPIODirModeSet(SOC_GPIO_0_REGS, AD7606_PAR_RD, GPIO_DIR_OUTPUT);
, k% R. J5 k/ F2 g, _1 e) u GPIOPinWrite(SOC_GPIO_0_REGS, AD7606_PAR_RD, GPIO_PIN_HIGH);) z% @) D1 H2 @) Q7 A
' g h/ j7 ^, s9 E}( |( Z8 W7 r/ F, c0 _: C$ J
) u& i' d( l$ c6 n4 X
, i) t8 V8 a Q7 a' K# O! H' N# ?static void ad7606_busy_hwi(UArg ad_addr) {
2 L3 ^8 R: Q7 K% O# r( F8 O2 m z+ ~+ [1 @
0 d/ I) |2 Q! d1 T$ _
/* Disable the interrupts for pins of bank AD7606_PAR_BUSY in GPIO.*/) U5 h% r2 C0 F- ~4 E0 E
GPIOBankIntDisable(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_GPIO_BANK); //用仿真器debug,发现程序能进入这里。, b$ u' s. B: A' v( J4 G0 g) x; w
- O; e5 v2 T( m- p1 t if(GPIOPinIntStatus(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_V1) == GPIO_INT_PEND)
- F1 V' o% f1 i) ^2 N6 s {
% c# E6 Z/ c( Z( O. Q GPIOPinIntClear(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_V1); //问题是:用仿真器debug,发现程序不能进入这里。
$ b0 [4 }) B1 @, M9 C9 z, f. T cs_addr = SOC_EMIFA_CS5_ADDR ;( L# C+ |. a9 n. Q% {0 ]; Q
internal = 0 ;; ]3 d0 ^: Z1 c0 d
int_flag[0] = 1 ;
* }1 l" G8 ?' G* K6 x ? }$ A+ V9 e. w7 c7 s/ Y4 Z
if(GPIOPinIntStatus(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_V2) == GPIO_INT_PEND)
; _3 b+ F) g) M6 D/ f9 t {" f2 \% \; m: Z- d6 H
GPIOPinIntClear(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_V2); //问题是:用仿真器debug,发现程序不能进入这里。) L3 R- ~. ~( | L3 O
cs_addr = SOC_EMIFA_CS4_ADDR ;
: z4 {" @ a- |* q* S internal = 6 ;7 i: y9 f, F6 P) e# S
int_flag[1] = 1 ;
: n4 E* ?. M8 T) w }
' B* {8 W! n! X3 i: G" ~ if(GPIOPinIntStatus(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_C) == GPIO_INT_PEND)3 l6 J% T" l% x6 b) i0 O* e' s7 O
{& [5 _. b! O8 V
GPIOPinIntClear(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_C); //问题是:用仿真器debug,发现程序不能进入这里。6 o! P; u9 |4 ]# o/ ~% x2 U3 _' D: s
cs_addr = SOC_EMIFA_CS2_ADDR ;
% b+ _; F$ `9 p5 [2 l( W3 j' B internal = 12 ;2 D2 y# x, |7 w
int_flag[2] = 1 ;* j. t1 F: u4 X* }; k; p# U5 x! C! `; k6 c
}, O1 ~1 m7 h) K% P5 A$ y
# O+ {$ [: Y4 D GPIOPinWrite(SOC_GPIO_0_REGS, AD7606_PAR_CONVST, GPIO_PIN_LOW);2 C$ y! d! n, k. i
; ^5 M4 h5 L: ]3 a9 V/ A5 g$ { GPIOBankIntEnable(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_GPIO_BANK);
- s/ E% o3 z0 b& I; }$ m5 W}
. b" Z! r6 O! L0 Q. @# F5 S; I3 _/ h' \. O' ^6 u1 G9 Z+ s, @
7 H: M; B5 G2 z
8 N2 |7 l3 |/ `4 r# Z5 i e6 R3 d+ Y1 U" H
|
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
|