嵌入式开发者社区
标题:
sysbios hwi 问题
[打印本页]
作者:
vtinf
时间:
2016-8-31 16:23
标题:
sysbios hwi 问题
您好。使用GPIO中断时,中断能进入ISR,但是不能区分具体的GPIO端口。程序如下:
/ B2 f3 m6 I; f, L
#define AD7606_PAR_BUSY_GPIO_BANK 5
" G h, T6 r0 k; [. N* M. c. g
#define AD7606_PAR_BUSY_GPIO_BANK_INT SYS_INT_GPIO_B5INT
, r1 q Q7 ]" C! z1 |7 |
3 {8 X- Q; n+ D8 `9 Q+ l! \6 t4 n
#define AD7606_PAR_BUSY_V1 GPIO_TO_PIN(5, 11)
//BANK5的中断口5.11
! z. P+ O6 n/ f/ t+ L
#define AD7606_PAR_BUSY_V2 GPIO_TO_PIN(5, 9)
//BANK5的中断口5.9
! l1 f) S' k' F! _" \
#define AD7606_PAR_BUSY_C GPIO_TO_PIN(5, 5)
//BANK5的中断口5.5
# r+ x4 W7 \8 G' u$ p+ K3 n! h; L
#define AD7606_PAR_BUSY GPIO_TO_PIN(5, 4)
9 _; Z6 {5 g$ C
8 C9 X) }: {3 L' i
#define AD7606_PAR_CONVST GPIO_TO_PIN(5, 1)
, T9 F, J9 p* V: ~% \( x* C
#define AD7606_PAR_RD GPIO_TO_PIN(5, 2)
1 Z9 m% I( o( Z& b& v& X
#define AD7606_PAR_RESET GPIO_TO_PIN(5, 0)
: d# F* u6 O4 I3 A! J
m% C( {7 |8 b
0 z3 o, k* s, t9 d' N0 w6 T. a, ^
; c( X6 b8 u" w+ o& ?& v$ V
static void ad7606_irq_setup(ad7606 *ad) {
; _) s3 C2 \/ e4 h5 w+ `
Hwi_Params hwiParams;
& {' z9 q* \6 x: A: q
Hwi_Handle myHwi;
# Z& N0 k7 Y0 t; S, m8 ?( o
Error_Block eb;
* S" a; ~. z G; B+ t
% s% Q( T' Q1 K& R
Error_init(&eb);
+ l2 u. G$ ]3 b$ n4 u: L
Hwi_Params_init(&hwiParams);
$ u- a( i ^" ]
hwiParams.arg = (unsigned int)ad;
. \% ~( c7 g$ ]' g6 G
hwiParams.enableInt = FALSE;
/ a0 R3 z! Q0 u9 _' k
hwiParams.eventId = SYS_INT_GPIO_B5INT;
& Y" \% S; o* Z; s' R
hwiParams.priority = 4;
! ~6 n4 @8 v7 Y
myHwi = Hwi_create(8, ad7606_busy_hwi, &hwiParams, &eb);
//注册BANK5中断处理函数
+ J+ H( ?1 R( F' }/ b% B$ ^+ x
if (myHwi == NULL)
7 j7 n6 A! K7 M3 j7 r
LOG_FATAL("failed to create hwi");
4 f2 a2 t3 a# {
: n4 A7 v8 ?/ Q" v
/* enable both interrupts */
7 P6 _5 i8 |0 Q& i" H& Q7 y
Hwi_enableInterrupt(ad->irq_event);
6 [; `' R0 e$ P0 `; c7 M' T% v# l
}
2 \2 J. B' j$ ~0 G \
3 R7 c$ c6 {6 H5 A) N" b0 J2 F
+ l* Z4 D7 Y: X* x9 P
static void ad7606_gpio_pinmux_setup(ad7606 *ad) {
. E0 Q8 \1 }9 r1 c5 C/ |9 J
volatile unsigned int savePinMux = 0;
+ d `$ O$ o4 F/ d+ b S# u6 t% C
//初始化
5.11、5.9 、 5.5为GPIO口
# \. K& i: X* }2 ~
savePinMux = HWREG(SOC_SYSCFG_0_REGS + SYSCFG0_PINMUX(11)) & (~(SYSCFG_PINMUX11_PINMUX11_27_24 | SYSCFG_PINMUX11_PINMUX11_19_16));
8 k5 d* p7 K6 G- Q
8 z$ x$ W$ x% F6 B0 H
HWREG(SOC_SYSCFG_0_REGS + SYSCFG0_PINMUX(11)) = (PINMUX11_BUSY_V1_ENABLE | PINMUX11_BUSY_V2_ENABLE | savePinMux);
" d: i5 E; m" ^
) c: _" u2 _& n% ~. J
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));
1 m; W7 r- p& O/ S6 b3 P% B
* K9 t" C2 d2 f- v- X2 ~/ q
HWREG(SOC_SYSCFG_0_REGS + SYSCFG0_PINMUX(12)) = (PINMUX12_RESET_ENABLE | PINMUX12_CONVST_ENABLE | PINMUX12_RD_ENABLE | PINMUX12_BUSY_C_ENABLE | savePinMux);
2 g `( f9 N) v# x7 b' b
( X0 b) p0 _6 y3 X. W0 Y
}
- v9 W, `: H/ x8 v4 Y
- e' E; S1 }; F6 z
$ m5 h7 B( ]) p+ z0 X0 X
static void ad7606_gpio_setup(ad7606 *ad) {
4 U6 l8 Q% b* I0 \! \8 w3 d
/*Set the AD7606_PAR_BUSY to the input mode*/
# d& _, U5 g* J# s3 \
//初始化
5.11、5.9 、 5.5为中断口
# `, r8 U _ P! q
GPIODirModeSet(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_V1, GPIO_DIR_INPUT);
G+ L9 S7 |! S7 s; ~
GPIODirModeSet(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_V2, GPIO_DIR_INPUT);
) K% A& l( u6 E! ^( v8 M
GPIODirModeSet(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_C, GPIO_DIR_INPUT);
8 X. w+ f: A9 K1 O& [
//GPIODirModeSet(SOC_GPIO_0_REGS, AD7606_PAR_BUSY, GPIO_DIR_INPUT);
+ C) Z& r! v% B# A9 I
/*Set the AD7606_PAR_BUSY to the Falling Edge Interrupt*/
x, i3 Y& i6 L) `( j2 w
GPIOIntTypeSet(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_V1, GPIO_INT_TYPE_FALLEDGE);
' i- K. n+ I2 q/ o6 q. e- s6 Q" E
GPIOIntTypeSet(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_V2, GPIO_INT_TYPE_FALLEDGE);
0 Z0 c) w( w6 T
GPIOIntTypeSet(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_C, GPIO_INT_TYPE_FALLEDGE);
, w, L+ B9 W |
//GPIOIntTypeSet(SOC_GPIO_0_REGS, AD7606_PAR_BUSY, GPIO_INT_TYPE_FALLEDGE);
8 f. N; f5 P+ @4 Z" ~8 T+ o
/*The interrupt setting allows AD7606_PAR_BUSY_GPIO_BANK*/
; I3 B: @( ?' m/ d( H% T; W
GPIOBankIntEnable(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_GPIO_BANK);
' Y( p L2 x6 v: Y9 {7 j3 p
- \2 a6 W( y, r+ r8 d8 ~
GPIODirModeSet(SOC_GPIO_0_REGS, AD7606_PAR_RESET, GPIO_DIR_OUTPUT);
4 ?3 L& v: o! S
GPIOPinWrite(SOC_GPIO_0_REGS, AD7606_PAR_RESET, GPIO_PIN_HIGH);
* n5 l! Z$ N9 ]
Task_sleep(1000);
6 G' {, E* P" [6 o$ K7 \
GPIOPinWrite(SOC_GPIO_0_REGS, AD7606_PAR_RESET, GPIO_PIN_LOW);
: ^% B4 Y1 q! t: N% M2 t% i* N9 U8 E
Task_sleep(1000);
! o! E# O8 `1 L5 H
2 f. K2 p. L8 P4 A: D% d3 S) D+ u
/*Set the AD7606_PAR_CONVST to output mode*/
3 T8 ~; W- b/ D
GPIODirModeSet(SOC_GPIO_0_REGS, AD7606_PAR_CONVST, GPIO_DIR_OUTPUT);
6 Q7 T; |7 O: M( z* Z. L
GPIOPinWrite(SOC_GPIO_0_REGS, AD7606_PAR_CONVST, GPIO_PIN_LOW);
0 f6 K% p6 P6 ]; `, W( z
8 j7 K J1 I4 F) q$ t/ _
GPIODirModeSet(SOC_GPIO_0_REGS, AD7606_PAR_RD, GPIO_DIR_OUTPUT);
# |7 e- a0 e& e1 w/ K9 u
GPIOPinWrite(SOC_GPIO_0_REGS, AD7606_PAR_RD, GPIO_PIN_HIGH);
3 r( l U' K3 f: B1 j% |
' O* L7 W ~5 n# ?8 c0 B# h
}
4 K4 \+ K; z6 e& F7 a' i# O* m
" {0 {* K: @5 ?! a% L& h
3 o& X, I* K$ O
static void ad7606_busy_hwi(UArg ad_addr) {
2 L( e4 C0 p0 q2 I
: P& E$ f/ c% c$ t% M7 `/ |
+ B1 m/ v; h( }+ G) z* D+ M- w
/* Disable the interrupts for pins of bank AD7606_PAR_BUSY in GPIO.*/
: ^* Z0 a( H1 T0 k
GPIOBankIntDisable(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_GPIO_BANK);
//用仿真器debug,发现程序能进入这里。
+ r s: r" F. h" |; P1 M% r: W
& W1 D' z& W2 p9 r
if(GPIOPinIntStatus(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_V1) == GPIO_INT_PEND)
" ~1 y' w9 V! ?8 c
{
# T4 s+ a, P4 c. E% Z! T: k- {
GPIOPinIntClear(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_V1);
//问题是:用仿真器debug,发现程序不能进入这里。
U/ e4 p# m: V# e! V/ W% ?
cs_addr = SOC_EMIFA_CS5_ADDR ;
1 k8 z& l ~( B& G5 c
internal = 0 ;
# {4 ^8 K( |0 u. I" y
int_flag[0] = 1 ;
/ L' z" L, Q$ L/ p9 i
}
3 a, P+ Y+ P) B
if(GPIOPinIntStatus(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_V2) == GPIO_INT_PEND)
& R. p+ u5 A- K0 V
{
( l' h% d" L; A8 N7 m; S% q# \
GPIOPinIntClear(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_V2);
//问题是:用仿真器debug,发现程序不能进入这里。
" |$ Q5 x* h$ R7 g
cs_addr = SOC_EMIFA_CS4_ADDR ;
( e! u& n/ Z8 i$ H7 U, h: w. T' z
internal = 6 ;
$ X4 j" k6 ~7 M0 o& w) l
int_flag[1] = 1 ;
( R' e/ M, O& V7 u3 m D
}
6 y/ P' T1 O% n
if(GPIOPinIntStatus(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_C) == GPIO_INT_PEND)
9 f6 P) r) v9 L1 j# \$ g
{
3 F' r0 |( w: V; @4 \ ^
GPIOPinIntClear(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_C);
//问题是:用仿真器debug,发现程序不能进入这里。
2 r1 r7 Q5 O2 A! ~1 w+ V u5 S/ g
cs_addr = SOC_EMIFA_CS2_ADDR ;
$ f" Q, x& a' z7 E4 b
internal = 12 ;
1 H+ A1 x* M2 ~2 p- [2 b2 X5 K
int_flag[2] = 1 ;
) Z7 _+ M& A% H' E' n
}
5 }- T, q! q' t; V
* x: { m( ?/ @) S! E+ j0 C
GPIOPinWrite(SOC_GPIO_0_REGS, AD7606_PAR_CONVST, GPIO_PIN_LOW);
. Z! M- @, ^( y, e8 G2 p0 d
7 z- {$ ?0 x e5 t5 h* b
GPIOBankIntEnable(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_GPIO_BANK);
, P7 Y6 F( p) M9 _- K8 C2 k# O7 W7 U; c
}
; Q! I7 l* o9 X/ U0 w
6 n! n- [6 a, {1 G/ M, m
作者:
vtinf
时间:
2016-8-31 16:53
INTSTAT45状态如图
u) m8 t2 _9 m' j4 s. g. X% v4 i
[attach]1368[/attach]
5 u9 ~& r! z' U9 \* J1 I
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4