|
|
您好。使用GPIO中断时,中断能进入ISR,但是不能区分具体的GPIO端口。程序如下:; l! V% `" H7 u4 n: J+ \/ X3 v
#define AD7606_PAR_BUSY_GPIO_BANK 5
% Y4 c- Y/ b. x0 g( I+ X; P#define AD7606_PAR_BUSY_GPIO_BANK_INT SYS_INT_GPIO_B5INT. n/ B& h/ X8 _0 M# Y
: o5 y) p! M( t- U
#define AD7606_PAR_BUSY_V1 GPIO_TO_PIN(5, 11) //BANK5的中断口5.11
M0 p% L D; n) ?9 w# b( a#define AD7606_PAR_BUSY_V2 GPIO_TO_PIN(5, 9) //BANK5的中断口5.9
1 Z! J' |; w, U' @0 z) ~/ a5 [# a#define AD7606_PAR_BUSY_C GPIO_TO_PIN(5, 5) //BANK5的中断口5.5
$ \/ }% o/ d" G3 C! O/ k; E6 L#define AD7606_PAR_BUSY GPIO_TO_PIN(5, 4) g. @$ W4 Q- t
3 |) a3 D7 [/ H* K$ q$ G$ V. Q
#define AD7606_PAR_CONVST GPIO_TO_PIN(5, 1)
8 b/ ]8 e7 e9 ~8 J$ I) k# r3 z#define AD7606_PAR_RD GPIO_TO_PIN(5, 2). Q' r) e5 K: o, N Y% T- [" V
#define AD7606_PAR_RESET GPIO_TO_PIN(5, 0)
# W; @; w* }$ n9 V! N( n$ Y9 z$ T/ y4 X, q
- G9 r- o; z7 l& w: D" V
% w3 Z |- ?1 B$ {' i- [3 Wstatic void ad7606_irq_setup(ad7606 *ad) {
1 {* P, |# h$ ^; h8 x Hwi_Params hwiParams;
( a- F' j! E2 Y) d Hwi_Handle myHwi;8 v2 E1 ?6 v: @6 E
Error_Block eb;
9 i" Z7 S! D- T
5 G% F. d! z: P9 e- Q& @ Error_init(&eb);. P0 c+ d5 G& N2 K, q
Hwi_Params_init(&hwiParams);
4 @3 D" W' p1 M/ k hwiParams.arg = (unsigned int)ad;. ]; k6 s: ~. v; I( Z
hwiParams.enableInt = FALSE;
# V4 c* Q. r9 B& n( f hwiParams.eventId = SYS_INT_GPIO_B5INT;" Y" P8 ]. z6 k( h% d2 F+ W
hwiParams.priority = 4;4 f2 ]- _% B2 k' o
myHwi = Hwi_create(8, ad7606_busy_hwi, &hwiParams, &eb); //注册BANK5中断处理函数, u1 `4 p3 k' w2 V& @
if (myHwi == NULL)
$ V0 r$ ?; ]' [, b. R LOG_FATAL("failed to create hwi");6 x4 \$ F, B! X
+ H$ q& o0 U2 ?! c( b1 t4 D6 a7 @
/* enable both interrupts */
4 _8 m7 [+ N/ p+ r7 w Hwi_enableInterrupt(ad->irq_event);
# [7 ]& _* ?3 O- q; x9 a) y- F}' k3 y3 s6 c- y7 {% }( e
3 k# ]5 e) i& x1 ~, Z% M F* R5 W) N( G
static void ad7606_gpio_pinmux_setup(ad7606 *ad) {- v, G6 L% q$ \% j- `8 [* W
volatile unsigned int savePinMux = 0;
$ o; ~8 C e9 f& H& ] //初始化5.11、5.9 、 5.5为GPIO口( w% g1 g5 H1 R6 q4 E
savePinMux = HWREG(SOC_SYSCFG_0_REGS + SYSCFG0_PINMUX(11)) & (~(SYSCFG_PINMUX11_PINMUX11_27_24 | SYSCFG_PINMUX11_PINMUX11_19_16));
8 l* W- }% H$ N/ e/ m# j5 p2 r% K2 k- A/ g$ [3 D
HWREG(SOC_SYSCFG_0_REGS + SYSCFG0_PINMUX(11)) = (PINMUX11_BUSY_V1_ENABLE | PINMUX11_BUSY_V2_ENABLE | savePinMux);% Y: F& M w Y2 T
0 D7 S2 H/ g. [" R0 E3 R" J" b
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));! M& q5 U/ ]) L* r4 h- K
+ g9 R8 N7 V+ p N# z
HWREG(SOC_SYSCFG_0_REGS + SYSCFG0_PINMUX(12)) = (PINMUX12_RESET_ENABLE | PINMUX12_CONVST_ENABLE | PINMUX12_RD_ENABLE | PINMUX12_BUSY_C_ENABLE | savePinMux);
7 a1 C3 t" o6 h( O% x8 T$ O3 h# k
, H1 x' e- p# Z T% p( J! x2 t! G6 w) Q}
8 d& |7 y. G4 a; J3 }' [" w5 @ i
4 ]9 i/ w5 U/ o. z7 _- [8 C# B$ b
static void ad7606_gpio_setup(ad7606 *ad) {- X0 K' G: e" g% t- ~* N
/*Set the AD7606_PAR_BUSY to the input mode*/
6 e/ z. i; K3 s# V* c* g' F! S //初始化5.11、5.9 、 5.5为中断口
6 X& V' z( [7 t; A' h; P4 g' r! v) Z; C GPIODirModeSet(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_V1, GPIO_DIR_INPUT);
7 h! J: {/ D+ w, l1 C" P GPIODirModeSet(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_V2, GPIO_DIR_INPUT);; \4 c2 D+ c6 c; v5 C1 L# n( d4 c: s
GPIODirModeSet(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_C, GPIO_DIR_INPUT);! M$ j( C; [7 d
//GPIODirModeSet(SOC_GPIO_0_REGS, AD7606_PAR_BUSY, GPIO_DIR_INPUT);
, ]5 \4 P- r& ]3 S /*Set the AD7606_PAR_BUSY to the Falling Edge Interrupt*/
" U( j4 i; y1 A8 c( Q GPIOIntTypeSet(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_V1, GPIO_INT_TYPE_FALLEDGE);
/ H8 a2 x; ?& l GPIOIntTypeSet(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_V2, GPIO_INT_TYPE_FALLEDGE);
( _. g! t1 ^* D. T/ ^ n' h' {5 O GPIOIntTypeSet(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_C, GPIO_INT_TYPE_FALLEDGE);
! L2 h% U6 e/ @0 p+ S4 d- g# ]/ a //GPIOIntTypeSet(SOC_GPIO_0_REGS, AD7606_PAR_BUSY, GPIO_INT_TYPE_FALLEDGE);
" J# K! O6 H0 f7 U8 \ /*The interrupt setting allows AD7606_PAR_BUSY_GPIO_BANK*/
4 I: s& ?% Q+ m# B! U GPIOBankIntEnable(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_GPIO_BANK);/ g) u, W8 M( q8 b* z
# B+ c, ]4 g! V GPIODirModeSet(SOC_GPIO_0_REGS, AD7606_PAR_RESET, GPIO_DIR_OUTPUT);$ C( Y* B4 d1 n. Y, f; z: v, v2 \9 T" L
GPIOPinWrite(SOC_GPIO_0_REGS, AD7606_PAR_RESET, GPIO_PIN_HIGH);/ v7 K0 ~ ]5 ]
Task_sleep(1000);
2 S0 }- {9 M5 O, b; o GPIOPinWrite(SOC_GPIO_0_REGS, AD7606_PAR_RESET, GPIO_PIN_LOW);
# N1 N9 j0 a3 k2 S. F Task_sleep(1000);7 Q# E6 i! Q. Y3 Q) U
/ V' O% M9 F* @! H) |" y /*Set the AD7606_PAR_CONVST to output mode*/( d- H4 u; h: V2 B6 f
GPIODirModeSet(SOC_GPIO_0_REGS, AD7606_PAR_CONVST, GPIO_DIR_OUTPUT); f A( o) i3 `" [ B4 C2 r* x1 b, t
GPIOPinWrite(SOC_GPIO_0_REGS, AD7606_PAR_CONVST, GPIO_PIN_LOW);
3 k* n. e+ w z% b) @8 t2 v2 r9 d
0 O9 N, @& [' _/ B# c% y& y8 b GPIODirModeSet(SOC_GPIO_0_REGS, AD7606_PAR_RD, GPIO_DIR_OUTPUT);
1 }, P& u9 w# }3 X" H GPIOPinWrite(SOC_GPIO_0_REGS, AD7606_PAR_RD, GPIO_PIN_HIGH);# P/ }% c$ Y- j6 X
9 }! x; P& P+ c4 A: x' |& U}3 Q) F% U8 X' R3 C
+ D! r( d4 H( C: {4 g, E4 g" ?* W3 ?( \/ N8 ]/ R
static void ad7606_busy_hwi(UArg ad_addr) {
( ?7 ~% V$ h0 h& g/ K$ M! S5 B9 s) q2 K0 x0 D' c+ D
& S# A. Y, ?. ?' ^
/* Disable the interrupts for pins of bank AD7606_PAR_BUSY in GPIO.*/- j! F+ A/ k5 ?* P4 x+ w# L8 [. W' e
GPIOBankIntDisable(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_GPIO_BANK); //用仿真器debug,发现程序能进入这里。2 U) v4 b- ^7 r* u" B
" s, d9 q9 t. @) V- K
if(GPIOPinIntStatus(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_V1) == GPIO_INT_PEND)/ z- X. }0 F! i! v0 y2 ?: d
{" S# p3 ^: y! c6 l: m! k
GPIOPinIntClear(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_V1); //问题是:用仿真器debug,发现程序不能进入这里。. a3 G, V: h5 x/ m3 y! l. p2 {
cs_addr = SOC_EMIFA_CS5_ADDR ;1 V! `3 h& U& Y1 H! b, G, y6 k
internal = 0 ;3 P' k1 p+ R) T( e* n
int_flag[0] = 1 ;
9 M" j) K8 `" M1 {! b# P" P }
o; {7 J4 q5 t: B% D if(GPIOPinIntStatus(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_V2) == GPIO_INT_PEND), ^9 N7 N6 d" a' q5 G( @, O
{
: m3 M: ]; q! q7 \ U' z GPIOPinIntClear(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_V2); //问题是:用仿真器debug,发现程序不能进入这里。. W8 P7 O7 d0 d* R
cs_addr = SOC_EMIFA_CS4_ADDR ;. N @. H; h+ C! X- N3 z
internal = 6 ;
7 a( N4 ^. J. J( E$ |* A int_flag[1] = 1 ;5 d/ `. E& S- x2 n7 }
}; } c9 [/ |5 T% `' `8 E
if(GPIOPinIntStatus(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_C) == GPIO_INT_PEND)
% i: N; C) d' M3 [* { {
5 |; W9 e0 _$ W! | GPIOPinIntClear(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_C); //问题是:用仿真器debug,发现程序不能进入这里。4 j# v4 l7 H, ?& K) u2 m; F
cs_addr = SOC_EMIFA_CS2_ADDR ;
( T/ d% a1 X, Y internal = 12 ;
4 x( B5 \% d# P, f* Q# [3 V int_flag[2] = 1 ;
# ]) k4 R# R: s4 W+ S* ? }
4 ]# m* C) {) p1 {3 b, J+ X
( k8 r4 O7 @2 U; _1 P! L r GPIOPinWrite(SOC_GPIO_0_REGS, AD7606_PAR_CONVST, GPIO_PIN_LOW);( F0 V6 w7 ^1 f( p3 c
" W' r- a* _8 O
GPIOBankIntEnable(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_GPIO_BANK);6 v+ ?0 Z, h5 }/ Y" ~
}9 p- ?; f- d: t; q4 r6 s8 v
0 G- o5 F# [2 U9 w5 N
; t8 o" ]" o0 {, g( T. v2 S5 `9 y, Z F% C& E0 }% u
4 @3 N( A& R* ]9 |* x- H* w |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
|