嵌入式开发者社区
标题:
sysbios hwi 问题
[打印本页]
作者:
vtinf
时间:
2016-8-31 16:23
标题:
sysbios hwi 问题
您好。使用GPIO中断时,中断能进入ISR,但是不能区分具体的GPIO端口。程序如下:
9 {1 `$ ]$ b8 b6 r; l
#define AD7606_PAR_BUSY_GPIO_BANK 5
/ ?8 j$ q( c# p1 t
#define AD7606_PAR_BUSY_GPIO_BANK_INT SYS_INT_GPIO_B5INT
6 r& B1 T- \9 E+ M
/ i3 `1 E. T. R) x" B
#define AD7606_PAR_BUSY_V1 GPIO_TO_PIN(5, 11)
//BANK5的中断口5.11
, E1 W* Z4 c& H4 q+ b4 B( X
#define AD7606_PAR_BUSY_V2 GPIO_TO_PIN(5, 9)
//BANK5的中断口5.9
( T" ^, f; N; Z
#define AD7606_PAR_BUSY_C GPIO_TO_PIN(5, 5)
//BANK5的中断口5.5
6 M o- v) c! Y0 g( h l* r1 m
#define AD7606_PAR_BUSY GPIO_TO_PIN(5, 4)
+ ^; o+ r1 R# w) H, g7 ~; M
2 W7 h3 h- [: P( d5 F
#define AD7606_PAR_CONVST GPIO_TO_PIN(5, 1)
: Q, ?- S( V5 Y7 s# }5 H' K, E& h
#define AD7606_PAR_RD GPIO_TO_PIN(5, 2)
; w; a+ D0 k7 K% y
#define AD7606_PAR_RESET GPIO_TO_PIN(5, 0)
7 f u! N( {3 f+ i0 b `
, a$ |& }1 m) s0 h5 z; R
$ {5 p5 U( B' Z
4 _* _) y/ E# J7 `- [0 f7 X
static void ad7606_irq_setup(ad7606 *ad) {
. M+ B' `$ s. r, M1 d; I. p
Hwi_Params hwiParams;
6 q2 Z% h7 f' ?) n7 K' R' u
Hwi_Handle myHwi;
- K; ~( G. v) R& }
Error_Block eb;
( t8 l& h8 e1 f* t
) D4 y: {( r F0 g
Error_init(&eb);
3 Z. c3 S& T2 L" c. D9 m' T1 b
Hwi_Params_init(&hwiParams);
% E- E O5 b3 c
hwiParams.arg = (unsigned int)ad;
$ [; H) \$ R! y4 U& _( V
hwiParams.enableInt = FALSE;
* x3 b. M i _: Z) n- o
hwiParams.eventId = SYS_INT_GPIO_B5INT;
" w! z! O. D9 E) }* T) J J/ I6 o
hwiParams.priority = 4;
' U; S7 U8 R+ k: ?% r. c7 ~/ V" b
myHwi = Hwi_create(8, ad7606_busy_hwi, &hwiParams, &eb);
//注册BANK5中断处理函数
. C1 G; x5 y) k& b" P% B0 R
if (myHwi == NULL)
0 ~1 x1 H6 [1 K. J% m# J
LOG_FATAL("failed to create hwi");
9 P2 N) c8 K, Y9 ]6 R5 ]4 \
" a- u/ r4 N4 ^2 {8 U
/* enable both interrupts */
6 T0 O+ `! Q w5 G
Hwi_enableInterrupt(ad->irq_event);
# |. Y7 o' N2 x8 }% Z( ]
}
# X5 l1 z4 J$ \" i* W7 g' T6 o j
2 \2 w0 h- J; I O
' z) a) m0 [1 f. Z: Y# X% k
static void ad7606_gpio_pinmux_setup(ad7606 *ad) {
( _1 M E+ Z2 J% G) ^
volatile unsigned int savePinMux = 0;
! ]/ F& y7 [' E8 _
//初始化
5.11、5.9 、 5.5为GPIO口
4 D0 t2 o% b/ W4 W
savePinMux = HWREG(SOC_SYSCFG_0_REGS + SYSCFG0_PINMUX(11)) & (~(SYSCFG_PINMUX11_PINMUX11_27_24 | SYSCFG_PINMUX11_PINMUX11_19_16));
+ W; y D( C4 b5 X$ F8 G8 ~
" ]& n2 d7 f: [3 X0 n% Y. k
HWREG(SOC_SYSCFG_0_REGS + SYSCFG0_PINMUX(11)) = (PINMUX11_BUSY_V1_ENABLE | PINMUX11_BUSY_V2_ENABLE | savePinMux);
# ]3 P/ z; H! Z* \ l( W1 N
& n9 y, D7 [0 z% _# A$ i* d8 ~
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));
8 U, g w, H" \/ F+ v
# I2 K0 S5 ]) n3 X
HWREG(SOC_SYSCFG_0_REGS + SYSCFG0_PINMUX(12)) = (PINMUX12_RESET_ENABLE | PINMUX12_CONVST_ENABLE | PINMUX12_RD_ENABLE | PINMUX12_BUSY_C_ENABLE | savePinMux);
; {5 ?9 K# h1 G: M9 D9 R0 m# s
- G) c$ F9 R, ]2 L# \
}
1 s# P% ]( B# t( s
/ V* _$ `% I% m0 e! w
8 E2 r1 `8 K& V+ W3 q
static void ad7606_gpio_setup(ad7606 *ad) {
$ s4 o" J% \: A& Z
/*Set the AD7606_PAR_BUSY to the input mode*/
# J! u5 M; l$ g: Y
//初始化
5.11、5.9 、 5.5为中断口
* [/ I: J% _7 d. T9 Y& W5 o! T
GPIODirModeSet(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_V1, GPIO_DIR_INPUT);
z* o6 i) ]0 B; ~* b' o
GPIODirModeSet(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_V2, GPIO_DIR_INPUT);
7 h5 [1 `6 f! P2 f
GPIODirModeSet(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_C, GPIO_DIR_INPUT);
* O$ ^8 `4 O3 A
//GPIODirModeSet(SOC_GPIO_0_REGS, AD7606_PAR_BUSY, GPIO_DIR_INPUT);
% {% |' Y) A) R* E
/*Set the AD7606_PAR_BUSY to the Falling Edge Interrupt*/
, v; S; S; {7 b" X, l1 {
GPIOIntTypeSet(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_V1, GPIO_INT_TYPE_FALLEDGE);
v9 S; w) J! p3 ~1 T; C) V9 }7 Q
GPIOIntTypeSet(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_V2, GPIO_INT_TYPE_FALLEDGE);
+ z/ L: w2 D& h# F# Z }, J
GPIOIntTypeSet(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_C, GPIO_INT_TYPE_FALLEDGE);
$ p+ \/ F! m& B6 Z' P- U
//GPIOIntTypeSet(SOC_GPIO_0_REGS, AD7606_PAR_BUSY, GPIO_INT_TYPE_FALLEDGE);
0 l- i2 p8 Y3 a9 L
/*The interrupt setting allows AD7606_PAR_BUSY_GPIO_BANK*/
6 R7 @- m) Z( M7 _
GPIOBankIntEnable(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_GPIO_BANK);
9 b, l6 D. o' v% h+ I8 h
# q: r6 o4 {2 z0 W5 A
GPIODirModeSet(SOC_GPIO_0_REGS, AD7606_PAR_RESET, GPIO_DIR_OUTPUT);
* \- C) c/ P* x( f' m, T
GPIOPinWrite(SOC_GPIO_0_REGS, AD7606_PAR_RESET, GPIO_PIN_HIGH);
5 d2 g1 s/ j5 u% M( L, p
Task_sleep(1000);
3 T; K7 @; b) y) O& z/ V h! J
GPIOPinWrite(SOC_GPIO_0_REGS, AD7606_PAR_RESET, GPIO_PIN_LOW);
# Y+ M) X( ~9 h
Task_sleep(1000);
% G" n4 q; q* _/ v/ H) ]- C
: U. E5 |! O3 X- d" r
/*Set the AD7606_PAR_CONVST to output mode*/
9 x; f7 @; o9 C! |* J$ m
GPIODirModeSet(SOC_GPIO_0_REGS, AD7606_PAR_CONVST, GPIO_DIR_OUTPUT);
+ I% c: f, M, O: t
GPIOPinWrite(SOC_GPIO_0_REGS, AD7606_PAR_CONVST, GPIO_PIN_LOW);
% T; ?: c2 {0 Y' |9 E
$ P, K3 D7 d2 N6 S8 L9 r* n
GPIODirModeSet(SOC_GPIO_0_REGS, AD7606_PAR_RD, GPIO_DIR_OUTPUT);
9 @: r# q1 `6 W0 {( H1 F8 S- l
GPIOPinWrite(SOC_GPIO_0_REGS, AD7606_PAR_RD, GPIO_PIN_HIGH);
. Z C4 T0 F$ v( o5 s3 A% y! h. a9 v
6 E: L8 k- l+ D. l. t4 h; o/ h
}
2 t9 w/ F& Y: h% {9 Q
% l/ r2 S+ }# S& V) S* k% ?+ H
( E) t; m D) B7 a
static void ad7606_busy_hwi(UArg ad_addr) {
7 s/ Z' R7 \3 x, }" }
9 y( ]* V5 e# ~, v- k) J; E
! }& y9 h$ U& J6 i( }- V+ s9 X0 c
/* Disable the interrupts for pins of bank AD7606_PAR_BUSY in GPIO.*/
; Y7 x \8 Y, D8 c/ i& @2 k
GPIOBankIntDisable(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_GPIO_BANK);
//用仿真器debug,发现程序能进入这里。
+ q. M# V, [2 @5 \( ?4 V* d3 `8 p$ |4 a I
5 x8 C/ l& J1 b! ^: K
if(GPIOPinIntStatus(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_V1) == GPIO_INT_PEND)
! m' ?: H, M$ _7 W; c( ^* m& P
{
# Q3 S2 z! L, ?* a, J
GPIOPinIntClear(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_V1);
//问题是:用仿真器debug,发现程序不能进入这里。
% d, w& x# D$ O
cs_addr = SOC_EMIFA_CS5_ADDR ;
3 R' o- d$ |3 q6 C. ]9 W
internal = 0 ;
5 F, ?: {; m) B
int_flag[0] = 1 ;
+ q: L# u8 A" {; n: m" V
}
; y$ t7 g( ^9 b' z6 |9 i1 B
if(GPIOPinIntStatus(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_V2) == GPIO_INT_PEND)
8 h2 M9 w! ^" k6 t/ y6 B5 S5 @
{
1 W0 R, c k& n; F. A/ x) F3 o
GPIOPinIntClear(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_V2);
//问题是:用仿真器debug,发现程序不能进入这里。
- k4 \% W( S& ?6 r
cs_addr = SOC_EMIFA_CS4_ADDR ;
0 t4 u4 S L- S M
internal = 6 ;
3 s3 p& @$ a0 ], A* a
int_flag[1] = 1 ;
& k# _0 s% [& C/ v `# t9 y1 H
}
$ R8 G0 J, F/ _ e) ^7 ~" X% t$ E* _
if(GPIOPinIntStatus(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_C) == GPIO_INT_PEND)
( j4 _: T J. }4 V
{
9 s( }0 Y% L3 c( G
GPIOPinIntClear(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_C);
//问题是:用仿真器debug,发现程序不能进入这里。
: e9 p3 `, X) ~' J7 f4 s; I) `
cs_addr = SOC_EMIFA_CS2_ADDR ;
* F g0 }! ^+ a7 K) ?4 H
internal = 12 ;
% K- Y. ` y6 {
int_flag[2] = 1 ;
7 S$ H) I" q! p, t5 B
}
& Q- `% w4 t" b
+ F2 o$ A! b* f
GPIOPinWrite(SOC_GPIO_0_REGS, AD7606_PAR_CONVST, GPIO_PIN_LOW);
4 }. u% r- Z3 r- c# |2 D
+ Q: x# ~& S: ^( H5 r H
GPIOBankIntEnable(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_GPIO_BANK);
4 \( n/ |& ^6 I8 D" c/ E
}
D2 f- i: `; _) n) O; B
" ?+ F' f6 b8 E
作者:
vtinf
时间:
2016-8-31 16:53
INTSTAT45状态如图
5 y& D* ^+ j4 y! N
[attach]1368[/attach]
8 X9 e) I. O9 T/ V1 h e
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4