嵌入式开发者社区
标题:
sysbios hwi 问题
[打印本页]
作者:
vtinf
时间:
2016-8-31 16:23
标题:
sysbios hwi 问题
您好。使用GPIO中断时,中断能进入ISR,但是不能区分具体的GPIO端口。程序如下:
; n- @* P8 f5 j4 s
#define AD7606_PAR_BUSY_GPIO_BANK 5
. B4 h7 Y. J2 g6 c. n4 D
#define AD7606_PAR_BUSY_GPIO_BANK_INT SYS_INT_GPIO_B5INT
0 H" y% Z5 D3 p& {! i+ u, O- h, M$ ^
, ~2 T3 K( o" e' `" [) ~
#define AD7606_PAR_BUSY_V1 GPIO_TO_PIN(5, 11)
//BANK5的中断口5.11
. p, d5 p* P( ]7 u: ?
#define AD7606_PAR_BUSY_V2 GPIO_TO_PIN(5, 9)
//BANK5的中断口5.9
: Q( {$ a' {2 c2 E
#define AD7606_PAR_BUSY_C GPIO_TO_PIN(5, 5)
//BANK5的中断口5.5
! G4 N2 Z/ }; J. r$ v
#define AD7606_PAR_BUSY GPIO_TO_PIN(5, 4)
( F4 u" P( a2 Q, M7 H/ ~0 r
$ `4 `+ I K; `
#define AD7606_PAR_CONVST GPIO_TO_PIN(5, 1)
3 h6 D c0 V5 `# `& V2 E! q3 u& z D
#define AD7606_PAR_RD GPIO_TO_PIN(5, 2)
. C# p4 r" \; }0 V* s
#define AD7606_PAR_RESET GPIO_TO_PIN(5, 0)
* {% D9 b4 @: Q( e( _: u9 W
( v' h3 s& j2 q
2 [4 E0 p7 u* H' y6 g$ S( M
+ B$ R2 ?5 T0 m" d# {
static void ad7606_irq_setup(ad7606 *ad) {
1 r0 U1 c- c* W" i! ]
Hwi_Params hwiParams;
1 I3 y* K# _; J' D5 H
Hwi_Handle myHwi;
7 @: B; O1 r) C4 ^! F0 R! W# a4 W5 ~
Error_Block eb;
n2 Z9 E& e) C" P% o' [
" ?* X; Z$ k2 V( o
Error_init(&eb);
' o8 K ?( Q1 s* D. Q: J
Hwi_Params_init(&hwiParams);
- Y. V+ q w; ?( c" K# z6 \
hwiParams.arg = (unsigned int)ad;
/ k* A8 g0 r0 ~9 V$ M( m" X$ Z) F
hwiParams.enableInt = FALSE;
& D9 P$ t8 B' `7 W+ L8 Q$ V
hwiParams.eventId = SYS_INT_GPIO_B5INT;
1 q& t k" s- f
hwiParams.priority = 4;
6 g1 `# J/ Q) P5 c o! M0 A3 H
myHwi = Hwi_create(8, ad7606_busy_hwi, &hwiParams, &eb);
//注册BANK5中断处理函数
5 _* M& ?0 I2 w5 d5 a( S3 K
if (myHwi == NULL)
! K7 f9 S- S% L! k. O; i5 ~
LOG_FATAL("failed to create hwi");
' T! ]0 H. k, ~, e# ~* n
! d- N8 b* V9 B- a
/* enable both interrupts */
; S1 l- o9 A( w
Hwi_enableInterrupt(ad->irq_event);
5 j2 O6 `0 [! k/ T) \
}
3 ?+ s' P: y: u0 M+ ^# W+ d
& R4 {8 n* o0 `3 C
3 h4 m% C# f7 }' \2 Q0 b6 D
static void ad7606_gpio_pinmux_setup(ad7606 *ad) {
, C/ d. j" F0 W- U, T& l2 y
volatile unsigned int savePinMux = 0;
; T" q( g. q8 K
//初始化
5.11、5.9 、 5.5为GPIO口
4 |9 C6 h# ]2 u" T5 S. v) P
savePinMux = HWREG(SOC_SYSCFG_0_REGS + SYSCFG0_PINMUX(11)) & (~(SYSCFG_PINMUX11_PINMUX11_27_24 | SYSCFG_PINMUX11_PINMUX11_19_16));
, w' l- }% {4 J
% A. g: c4 c1 Z) \& }
HWREG(SOC_SYSCFG_0_REGS + SYSCFG0_PINMUX(11)) = (PINMUX11_BUSY_V1_ENABLE | PINMUX11_BUSY_V2_ENABLE | savePinMux);
$ J8 E8 l: j9 M0 K4 t0 B/ H
1 _, Y* h% h4 W: E
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));
/ w8 K5 z6 Z+ ?4 Y* G/ h3 x; P& c
: X+ w2 Y$ }, U3 d, N* C* V
HWREG(SOC_SYSCFG_0_REGS + SYSCFG0_PINMUX(12)) = (PINMUX12_RESET_ENABLE | PINMUX12_CONVST_ENABLE | PINMUX12_RD_ENABLE | PINMUX12_BUSY_C_ENABLE | savePinMux);
& j, H' z/ R( Z8 y5 r; {9 O4 a
3 I, N% S5 w* T) c) I2 ~* r; l3 ~
}
8 F) ?4 \% w5 D& `
& }8 [7 O0 |0 X
3 X; v9 d* H: I, Z, e+ @; t( V9 M
static void ad7606_gpio_setup(ad7606 *ad) {
) B3 M/ O: q; A% J
/*Set the AD7606_PAR_BUSY to the input mode*/
6 i7 u/ `' a- N
//初始化
5.11、5.9 、 5.5为中断口
" F1 M! q$ V. R: ^8 q4 P7 \ x
GPIODirModeSet(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_V1, GPIO_DIR_INPUT);
+ D+ L6 s, y8 O
GPIODirModeSet(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_V2, GPIO_DIR_INPUT);
3 Y6 M5 t& b X6 _
GPIODirModeSet(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_C, GPIO_DIR_INPUT);
! U0 j/ S( P5 j. O, I
//GPIODirModeSet(SOC_GPIO_0_REGS, AD7606_PAR_BUSY, GPIO_DIR_INPUT);
6 v& S. N% _( C k6 }$ i4 P
/*Set the AD7606_PAR_BUSY to the Falling Edge Interrupt*/
: J; {4 h/ D, e( c% `; Z: t/ ~
GPIOIntTypeSet(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_V1, GPIO_INT_TYPE_FALLEDGE);
" r6 a/ Z& X: V# |
GPIOIntTypeSet(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_V2, GPIO_INT_TYPE_FALLEDGE);
6 P: o: @& O( K5 b7 B2 }( h
GPIOIntTypeSet(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_C, GPIO_INT_TYPE_FALLEDGE);
& l$ E; b& `6 m
//GPIOIntTypeSet(SOC_GPIO_0_REGS, AD7606_PAR_BUSY, GPIO_INT_TYPE_FALLEDGE);
- U8 q& y* `7 q8 N) c8 X8 V/ R
/*The interrupt setting allows AD7606_PAR_BUSY_GPIO_BANK*/
8 [0 P$ Q6 d: o }
GPIOBankIntEnable(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_GPIO_BANK);
8 X" k# z. M8 k( n3 z3 @
" |" G* z4 X0 O( d* C6 b& c
GPIODirModeSet(SOC_GPIO_0_REGS, AD7606_PAR_RESET, GPIO_DIR_OUTPUT);
: Y* d! [9 n2 ?+ k
GPIOPinWrite(SOC_GPIO_0_REGS, AD7606_PAR_RESET, GPIO_PIN_HIGH);
5 f3 _- _& O) A
Task_sleep(1000);
$ Q, B# s1 d+ p8 Q3 i& j9 ?
GPIOPinWrite(SOC_GPIO_0_REGS, AD7606_PAR_RESET, GPIO_PIN_LOW);
7 t. Q5 M7 y" s+ Y j0 v; |
Task_sleep(1000);
4 F3 s* r9 b" t0 s: e$ e2 u8 U
4 h$ ^8 q- c: ?% b
/*Set the AD7606_PAR_CONVST to output mode*/
1 I& `3 o3 t5 t# P. [
GPIODirModeSet(SOC_GPIO_0_REGS, AD7606_PAR_CONVST, GPIO_DIR_OUTPUT);
; `, j3 T" N, Z
GPIOPinWrite(SOC_GPIO_0_REGS, AD7606_PAR_CONVST, GPIO_PIN_LOW);
; c7 R" J/ r/ \
* `$ V# t6 ]- h2 Z6 Y/ g# _
GPIODirModeSet(SOC_GPIO_0_REGS, AD7606_PAR_RD, GPIO_DIR_OUTPUT);
7 _1 G+ H7 w& @& z, Z3 X) r9 F+ [
GPIOPinWrite(SOC_GPIO_0_REGS, AD7606_PAR_RD, GPIO_PIN_HIGH);
# e4 V" i0 c5 Q+ k
, B- S9 S9 u+ t
}
+ ^- j) M* V1 r' b. |) N
% j( I2 w# e8 k' l0 Q# {
% b4 L% Z, m6 Y, e9 i
static void ad7606_busy_hwi(UArg ad_addr) {
, s3 C5 ^( S1 J
! v8 ]; u6 l# X: [+ L
7 G/ L6 k: ~: w7 d
/* Disable the interrupts for pins of bank AD7606_PAR_BUSY in GPIO.*/
) \. w0 k9 r8 ^4 U7 z% c
GPIOBankIntDisable(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_GPIO_BANK);
//用仿真器debug,发现程序能进入这里。
& @: h' |1 G0 z. P( B
3 _0 z( V5 Q3 |7 t9 |! W
if(GPIOPinIntStatus(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_V1) == GPIO_INT_PEND)
9 G5 w% J) }0 O- s0 Q7 s; J; I
{
+ s9 u; V# e* t7 m: k
GPIOPinIntClear(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_V1);
//问题是:用仿真器debug,发现程序不能进入这里。
4 C+ ^0 c! k) _
cs_addr = SOC_EMIFA_CS5_ADDR ;
3 m5 v% a B- e& L3 `* x% ?
internal = 0 ;
3 a3 d- Y- c7 t; W! H+ P2 {
int_flag[0] = 1 ;
# [ o1 F- S. S: x, a; U. R6 w
}
3 o+ |7 W4 |# H2 N
if(GPIOPinIntStatus(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_V2) == GPIO_INT_PEND)
) U. w/ S: Z% {! f; L C' v* s: V
{
1 x$ r. _7 d7 ^) o& v
GPIOPinIntClear(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_V2);
//问题是:用仿真器debug,发现程序不能进入这里。
' D, f: I7 W, T( b& b' G
cs_addr = SOC_EMIFA_CS4_ADDR ;
1 \" \9 R& q! f9 R: q) N5 l
internal = 6 ;
& j. a: ]1 N: V$ ?$ R: I
int_flag[1] = 1 ;
1 f8 o( p6 d" T1 l" I) Z! M" h
}
* E% ?+ J; z; X) p
if(GPIOPinIntStatus(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_C) == GPIO_INT_PEND)
+ N0 @3 J4 [! }
{
2 L! G3 l& Y; `
GPIOPinIntClear(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_C);
//问题是:用仿真器debug,发现程序不能进入这里。
( A& q, E9 G5 ]' O
cs_addr = SOC_EMIFA_CS2_ADDR ;
) X# [! t+ d* V1 T. l! q# @& ]
internal = 12 ;
0 z* x$ E/ J" s9 a" f3 h, }
int_flag[2] = 1 ;
) d% Z9 F" y. ]# n! \
}
. m s& I( `0 w: q i. M6 ]4 o
0 L. [9 ` C9 h
GPIOPinWrite(SOC_GPIO_0_REGS, AD7606_PAR_CONVST, GPIO_PIN_LOW);
, G2 X, L1 p/ K5 ^
2 V2 ?- w7 ?0 ]$ S. z7 |
GPIOBankIntEnable(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_GPIO_BANK);
7 ?8 v5 R# I- q9 k- [
}
8 ?% O! ~( c/ e% i% x G
2 z1 ?) }+ i8 t+ ?5 A
作者:
vtinf
时间:
2016-8-31 16:53
INTSTAT45状态如图
0 r. ~% B$ l" i
[attach]1368[/attach]
6 b& `1 R$ F, c# H5 y
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4