|
您好。使用GPIO中断时,中断能进入ISR,但是不能区分具体的GPIO端口。程序如下:
, ~& n% P6 o3 y8 {#define AD7606_PAR_BUSY_GPIO_BANK 59 |# i" k& ]4 i
#define AD7606_PAR_BUSY_GPIO_BANK_INT SYS_INT_GPIO_B5INT; i; g; X, J1 G4 q/ @! t2 M
n% i- A# O) s; K- o#define AD7606_PAR_BUSY_V1 GPIO_TO_PIN(5, 11) //BANK5的中断口5.11
4 B7 `! X: Y* T' |#define AD7606_PAR_BUSY_V2 GPIO_TO_PIN(5, 9) //BANK5的中断口5.9. |' ^1 f0 Z$ Z
#define AD7606_PAR_BUSY_C GPIO_TO_PIN(5, 5) //BANK5的中断口5.5
/ @4 X4 n% |# S4 ?7 x0 I#define AD7606_PAR_BUSY GPIO_TO_PIN(5, 4); v' D, z# U _' R. X2 V) U# j
3 E- k1 A9 O. s# q9 r; _
#define AD7606_PAR_CONVST GPIO_TO_PIN(5, 1)
3 f& L u, L& _2 j0 n#define AD7606_PAR_RD GPIO_TO_PIN(5, 2)" b- ^$ T- g" L( e4 b) r
#define AD7606_PAR_RESET GPIO_TO_PIN(5, 0)" _ S. }$ ]' P2 s. M x
$ Z" e d* p$ v0 v* O
7 o6 n3 Z7 J" Z& h, }
' V( i1 g, r! j! U1 z. Bstatic void ad7606_irq_setup(ad7606 *ad) {
. H( g% j+ i# C* Z" K Hwi_Params hwiParams;
6 i0 P& p+ q9 }% s Hwi_Handle myHwi;
$ X2 o9 e8 j+ j5 D* B Error_Block eb;
7 _7 g2 e+ a' E4 @: o
( J6 t3 k# w% a6 f* G# D Error_init(&eb);' R3 x* |7 a/ t" |, `) v5 [0 [3 q
Hwi_Params_init(&hwiParams);+ ~: P$ J9 t# t* x" V) ?! M
hwiParams.arg = (unsigned int)ad;
+ U- z9 b7 m7 ~% u hwiParams.enableInt = FALSE;
% y+ n7 Y3 I9 H hwiParams.eventId = SYS_INT_GPIO_B5INT;
8 q" X) s6 q3 ~; Z; j6 [5 _1 J5 W' C hwiParams.priority = 4;: L1 A8 g% M6 i k0 z
myHwi = Hwi_create(8, ad7606_busy_hwi, &hwiParams, &eb); //注册BANK5中断处理函数. k; d5 Y+ j. y" {
if (myHwi == NULL)
) V1 @# l7 u* q# C2 H9 f- c LOG_FATAL("failed to create hwi");
, D! [! g/ K9 T1 u* S7 D0 v
! z7 ^* q O7 h /* enable both interrupts */
+ H" Q# x- k9 o. A Hwi_enableInterrupt(ad->irq_event);9 U" X0 H& Y0 S8 `) o
}
) S9 c) }* e6 h3 p/ m' A* O
: i- l% W; A" J( h( _/ M
~, ~ I% c5 y- M% @4 ]6 D8 `: pstatic void ad7606_gpio_pinmux_setup(ad7606 *ad) {
* j3 p3 v6 G8 g+ A" i( m3 m volatile unsigned int savePinMux = 0;4 X- @7 ^# T9 E
//初始化5.11、5.9 、 5.5为GPIO口
" A+ W( r( E; w# L0 A2 ^ savePinMux = HWREG(SOC_SYSCFG_0_REGS + SYSCFG0_PINMUX(11)) & (~(SYSCFG_PINMUX11_PINMUX11_27_24 | SYSCFG_PINMUX11_PINMUX11_19_16));
4 S$ F ~' `. b% g2 J, Y+ {* D K: L+ S7 p! a2 N& p
HWREG(SOC_SYSCFG_0_REGS + SYSCFG0_PINMUX(11)) = (PINMUX11_BUSY_V1_ENABLE | PINMUX11_BUSY_V2_ENABLE | savePinMux);" j* W6 t4 [" G" G, x1 E8 `5 C
0 e# Q) ^ w w- C3 }- w6 k) m1 I
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));
2 g. l& i( b# L* a# u6 A! d5 x$ w4 L) s! D% o
HWREG(SOC_SYSCFG_0_REGS + SYSCFG0_PINMUX(12)) = (PINMUX12_RESET_ENABLE | PINMUX12_CONVST_ENABLE | PINMUX12_RD_ENABLE | PINMUX12_BUSY_C_ENABLE | savePinMux);
( o }7 t" Y& f+ w; R0 U. B8 r6 S2 ]' C& v% t/ s
}
& X7 F) r0 i1 F5 s" u$ @8 I9 l; U$ V
4 _1 i+ Z! U% P+ E* O
static void ad7606_gpio_setup(ad7606 *ad) {! c+ H# y* B* i4 h9 j: K j
/*Set the AD7606_PAR_BUSY to the input mode*/
, ?0 ^" K, \3 v2 V! E9 Q; Y: Y //初始化5.11、5.9 、 5.5为中断口8 v+ K: z1 ]. O- H7 ?4 C y4 @
GPIODirModeSet(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_V1, GPIO_DIR_INPUT);0 h9 [* F- B% T* v- l
GPIODirModeSet(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_V2, GPIO_DIR_INPUT);
& b: L1 `2 ~0 L5 A3 l GPIODirModeSet(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_C, GPIO_DIR_INPUT);
4 [* }, p; }) C8 y% J( k& c+ R //GPIODirModeSet(SOC_GPIO_0_REGS, AD7606_PAR_BUSY, GPIO_DIR_INPUT);
4 Q$ H3 `; Y- O; G /*Set the AD7606_PAR_BUSY to the Falling Edge Interrupt*/
/ i1 A( ^! o6 g, m( r9 G- S; | GPIOIntTypeSet(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_V1, GPIO_INT_TYPE_FALLEDGE);
2 h. A7 s L. l0 \ GPIOIntTypeSet(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_V2, GPIO_INT_TYPE_FALLEDGE);: K: Y8 W4 H3 U# B$ V0 P# K
GPIOIntTypeSet(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_C, GPIO_INT_TYPE_FALLEDGE);/ l: E# A* S0 y c3 Q) Y
//GPIOIntTypeSet(SOC_GPIO_0_REGS, AD7606_PAR_BUSY, GPIO_INT_TYPE_FALLEDGE); U1 i# j: ^# z4 W
/*The interrupt setting allows AD7606_PAR_BUSY_GPIO_BANK*/
3 Z; G* R+ b3 s5 ~, r& L# b6 A GPIOBankIntEnable(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_GPIO_BANK);
2 T' q' ?$ I6 M# F% O+ [' n( i& e2 I# j8 z# ]
GPIODirModeSet(SOC_GPIO_0_REGS, AD7606_PAR_RESET, GPIO_DIR_OUTPUT);4 h j6 |) R; N4 P+ o% c
GPIOPinWrite(SOC_GPIO_0_REGS, AD7606_PAR_RESET, GPIO_PIN_HIGH);6 O; p- H# ?6 n: A8 i% B: J# _
Task_sleep(1000);
+ G4 A' ~: |$ @( g" y& y2 @ GPIOPinWrite(SOC_GPIO_0_REGS, AD7606_PAR_RESET, GPIO_PIN_LOW);
# V! b* f) b4 j. ^) q4 h4 B! V Task_sleep(1000);
: w% a& L: ~ s) T e3 N
( R: ~3 K. T( j /*Set the AD7606_PAR_CONVST to output mode*/
( ^+ Q; l8 Q' e" A) H6 J8 |( q" i# d GPIODirModeSet(SOC_GPIO_0_REGS, AD7606_PAR_CONVST, GPIO_DIR_OUTPUT);" ?% ]. J. l: B: _0 z
GPIOPinWrite(SOC_GPIO_0_REGS, AD7606_PAR_CONVST, GPIO_PIN_LOW);, K4 E6 O6 M, Z. |2 F! c3 n. |, }
5 V o6 q% p- e9 H4 \9 K; E+ N GPIODirModeSet(SOC_GPIO_0_REGS, AD7606_PAR_RD, GPIO_DIR_OUTPUT);
5 [0 r0 L2 W% p4 c, U GPIOPinWrite(SOC_GPIO_0_REGS, AD7606_PAR_RD, GPIO_PIN_HIGH);
9 E9 m3 Y* G& l7 y4 X- k8 T( F0 V8 l
}
: O6 ?" i# o/ a: M# p
_9 {! P& v9 g. E, o, C4 |# l$ G& y; B1 F! [% O6 r
static void ad7606_busy_hwi(UArg ad_addr) {5 y2 G9 l4 ~- N J* Q& b# N6 J# j# M
& s2 K* N6 I0 p# i) C$ z! A# k! \
+ s% x& J1 C" ` /* Disable the interrupts for pins of bank AD7606_PAR_BUSY in GPIO.*/
1 _# X+ l. ` s% Y3 T7 v- [6 T" l; I GPIOBankIntDisable(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_GPIO_BANK); //用仿真器debug,发现程序能进入这里。
7 r- s H0 l4 w+ z# H$ y+ g# P4 ^0 W7 j }; y' K' I( D: `' Y
if(GPIOPinIntStatus(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_V1) == GPIO_INT_PEND)! v8 @0 T8 e2 A
{
7 U8 M* X* a$ ~ GPIOPinIntClear(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_V1); //问题是:用仿真器debug,发现程序不能进入这里。
6 A8 H) a# t' n: \! _7 {; ]& [ cs_addr = SOC_EMIFA_CS5_ADDR ;
* f1 U1 ^3 b5 x. m internal = 0 ;
# I% Q$ E% P5 }) S; ^6 [% @ d' u3 { int_flag[0] = 1 ;) N9 U3 [! O9 O' P7 D1 f
}- W: h; K5 e: H8 Q8 \" k; M
if(GPIOPinIntStatus(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_V2) == GPIO_INT_PEND)
7 i3 I' |1 d6 }( A {' g( k/ H0 H$ ?! e' ]
GPIOPinIntClear(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_V2); //问题是:用仿真器debug,发现程序不能进入这里。 k2 b/ J1 X/ w. B* W2 ~
cs_addr = SOC_EMIFA_CS4_ADDR ;
5 m" F0 f( M$ ]2 j4 n- @ internal = 6 ;8 x3 ?0 T4 E4 {# h
int_flag[1] = 1 ;( L+ P# p8 f8 ~8 t
}
* S0 v3 s( W2 J+ }8 ~+ s; G if(GPIOPinIntStatus(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_C) == GPIO_INT_PEND)
$ u0 y x6 q" j, R- L; ^) {2 p/ P {
) q' O8 P0 r p; } GPIOPinIntClear(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_C); //问题是:用仿真器debug,发现程序不能进入这里。' Y+ g k- p& Y0 E
cs_addr = SOC_EMIFA_CS2_ADDR ;) K' ^, }' w2 \4 e) i t8 _( a* u* r
internal = 12 ;
' e2 P" I: x* W int_flag[2] = 1 ;9 [; c% e& f; P
}9 |) ~4 G5 n( i9 w
1 K: y! A5 P7 X9 H* i' P' ~ GPIOPinWrite(SOC_GPIO_0_REGS, AD7606_PAR_CONVST, GPIO_PIN_LOW);" j. l& N7 M+ P# b; S! e$ o
1 B/ s. }! [/ p0 e GPIOBankIntEnable(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_GPIO_BANK);
0 i8 E- E4 j$ \3 L# D}- C/ }, n, e% P% k. H+ O; ?; j( X( o
: L! @% @8 u) R& f/ f% ]! c" l U
. Q0 v9 E$ U9 Q% n2 i8 k4 a
) `# C7 A/ j7 p ^' c% {" v4 ]# I* P4 b, z( T7 d/ X
|
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
|