嵌入式开发者社区
标题:
sysbios hwi 问题
[打印本页]
作者:
vtinf
时间:
2016-8-31 16:23
标题:
sysbios hwi 问题
您好。使用GPIO中断时,中断能进入ISR,但是不能区分具体的GPIO端口。程序如下:
~$ O- k; e: g5 E
#define AD7606_PAR_BUSY_GPIO_BANK 5
% ~4 E' x! K# H( {
#define AD7606_PAR_BUSY_GPIO_BANK_INT SYS_INT_GPIO_B5INT
: V8 \1 S7 s# `1 t
6 J' n' P& l( ]' ~9 [# ?
#define AD7606_PAR_BUSY_V1 GPIO_TO_PIN(5, 11)
//BANK5的中断口5.11
) \# ^& S) D4 `7 ^/ H& g
#define AD7606_PAR_BUSY_V2 GPIO_TO_PIN(5, 9)
//BANK5的中断口5.9
2 c* s/ G! p5 U/ m* } ^6 h
#define AD7606_PAR_BUSY_C GPIO_TO_PIN(5, 5)
//BANK5的中断口5.5
- X2 h) |8 `4 E1 |# g
#define AD7606_PAR_BUSY GPIO_TO_PIN(5, 4)
: V2 o5 C e n; n5 P6 ?5 M! ]
# @* M/ h% v% b W
#define AD7606_PAR_CONVST GPIO_TO_PIN(5, 1)
' `9 V u. w- h8 K
#define AD7606_PAR_RD GPIO_TO_PIN(5, 2)
u/ o2 V& Q" S; E
#define AD7606_PAR_RESET GPIO_TO_PIN(5, 0)
1 K; Y& P8 u6 t! I
% Y( X$ h2 v; l( Y, t2 ] _
) W5 \0 B8 \3 a% Y* L
2 _' x4 J. ?9 ^8 R/ D
static void ad7606_irq_setup(ad7606 *ad) {
, V" A1 L3 i: c
Hwi_Params hwiParams;
( M. F# I- B3 q9 _4 ~! G" `
Hwi_Handle myHwi;
* R2 m- i0 Z# _
Error_Block eb;
; [# ~5 l+ f) ~, b/ h2 c6 u; s
' H4 t1 Y6 n6 `8 i3 Y6 E0 m
Error_init(&eb);
) b: s6 [; r/ ], j
Hwi_Params_init(&hwiParams);
9 Z3 m! y9 Y; ?' R. x) ^
hwiParams.arg = (unsigned int)ad;
3 Z4 n7 T9 n: b# Y
hwiParams.enableInt = FALSE;
) q# _9 P* Y; \ G, S3 ?& P5 U. ~
hwiParams.eventId = SYS_INT_GPIO_B5INT;
5 d _5 a+ A, \8 P
hwiParams.priority = 4;
* n0 {4 \ C) o" y; S! v$ q
myHwi = Hwi_create(8, ad7606_busy_hwi, &hwiParams, &eb);
//注册BANK5中断处理函数
# }: Z! i- y' ?$ w! k0 H* X. P
if (myHwi == NULL)
1 e+ B0 D5 q. Z7 s3 q1 H% `, K" C% B
LOG_FATAL("failed to create hwi");
( X8 Y( C) Y4 c; U
6 L$ m7 B8 m+ W' V. S
/* enable both interrupts */
! U: j, \9 [* Z( q$ Z) @' N
Hwi_enableInterrupt(ad->irq_event);
1 m. E9 f( Z0 B* f
}
4 _. G1 p' l9 O7 `* T- m; Q
6 A; `6 a! U* |$ \
: d- ]+ A4 J* J1 e3 ]
static void ad7606_gpio_pinmux_setup(ad7606 *ad) {
1 F5 n5 @: N+ r) P2 R! q( ?) Y1 }- l1 u( ]
volatile unsigned int savePinMux = 0;
' t9 x+ o$ W2 \8 S; z+ R$ q' C
//初始化
5.11、5.9 、 5.5为GPIO口
8 x v8 c" p$ O# ]! z
savePinMux = HWREG(SOC_SYSCFG_0_REGS + SYSCFG0_PINMUX(11)) & (~(SYSCFG_PINMUX11_PINMUX11_27_24 | SYSCFG_PINMUX11_PINMUX11_19_16));
2 `( v: q2 Q Z8 J, P
: o6 j" w+ ^. K4 S. H( ~
HWREG(SOC_SYSCFG_0_REGS + SYSCFG0_PINMUX(11)) = (PINMUX11_BUSY_V1_ENABLE | PINMUX11_BUSY_V2_ENABLE | savePinMux);
; O& l. d, p* ^
# o% |2 Z( X. ^
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));
- |9 }% y! A( C4 t: g( {" c
4 f8 K5 h# u' y$ {+ l
HWREG(SOC_SYSCFG_0_REGS + SYSCFG0_PINMUX(12)) = (PINMUX12_RESET_ENABLE | PINMUX12_CONVST_ENABLE | PINMUX12_RD_ENABLE | PINMUX12_BUSY_C_ENABLE | savePinMux);
. A3 }4 _6 S, \2 H/ J5 Y
7 P1 ^ \. C2 k( E, J( B
}
6 l& t' N9 g9 @9 `9 ^6 L
; x7 [* E; F; K6 p# I5 F
_! m5 H ]' M7 @7 J2 O
static void ad7606_gpio_setup(ad7606 *ad) {
+ U8 G9 k" C# e! y% |% o4 L- w
/*Set the AD7606_PAR_BUSY to the input mode*/
# u2 A! t1 T) Q, E5 b3 Q
//初始化
5.11、5.9 、 5.5为中断口
3 ?3 D7 ?2 f* g2 |% J6 d
GPIODirModeSet(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_V1, GPIO_DIR_INPUT);
! R/ R$ D' E& {; p7 {0 w
GPIODirModeSet(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_V2, GPIO_DIR_INPUT);
0 P/ e& ~# O6 w- |
GPIODirModeSet(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_C, GPIO_DIR_INPUT);
B% v7 g- g( N
//GPIODirModeSet(SOC_GPIO_0_REGS, AD7606_PAR_BUSY, GPIO_DIR_INPUT);
. `" c# D, b) f7 s% Q* r B8 K) T
/*Set the AD7606_PAR_BUSY to the Falling Edge Interrupt*/
5 | A8 H; @9 `4 I* C" G
GPIOIntTypeSet(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_V1, GPIO_INT_TYPE_FALLEDGE);
4 X5 O* P, j) T9 F7 k6 O1 ]
GPIOIntTypeSet(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_V2, GPIO_INT_TYPE_FALLEDGE);
, k* W' N6 ?! M# Z: j
GPIOIntTypeSet(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_C, GPIO_INT_TYPE_FALLEDGE);
0 ~% c! W1 Z4 v4 c
//GPIOIntTypeSet(SOC_GPIO_0_REGS, AD7606_PAR_BUSY, GPIO_INT_TYPE_FALLEDGE);
* s' V& r2 j$ V- h7 |& f5 ]
/*The interrupt setting allows AD7606_PAR_BUSY_GPIO_BANK*/
3 k& @7 q: E% b2 t8 J9 |5 t
GPIOBankIntEnable(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_GPIO_BANK);
0 p0 c1 @0 s1 }- X& ^. ?
4 @/ G3 ?/ Y y& s% ]3 m
GPIODirModeSet(SOC_GPIO_0_REGS, AD7606_PAR_RESET, GPIO_DIR_OUTPUT);
/ H! p# C7 V T! s( h
GPIOPinWrite(SOC_GPIO_0_REGS, AD7606_PAR_RESET, GPIO_PIN_HIGH);
* T2 h% p9 }/ x6 H
Task_sleep(1000);
( w( K/ g/ w# Z' @& D/ O1 ?/ C
GPIOPinWrite(SOC_GPIO_0_REGS, AD7606_PAR_RESET, GPIO_PIN_LOW);
6 x8 y) Y9 R" i
Task_sleep(1000);
" @# ]* ?" ]; s' F7 ?& u
0 ?. J" `/ Q5 ]
/*Set the AD7606_PAR_CONVST to output mode*/
% N" z1 D0 g* ^( n0 Q* N
GPIODirModeSet(SOC_GPIO_0_REGS, AD7606_PAR_CONVST, GPIO_DIR_OUTPUT);
6 G' \9 i3 y* \
GPIOPinWrite(SOC_GPIO_0_REGS, AD7606_PAR_CONVST, GPIO_PIN_LOW);
3 t5 t e: {- C7 U3 ]( S" R
' Q' ]; Y- h2 Z0 c% K7 s4 x- G0 L) Y
GPIODirModeSet(SOC_GPIO_0_REGS, AD7606_PAR_RD, GPIO_DIR_OUTPUT);
" n$ p9 h* P: H
GPIOPinWrite(SOC_GPIO_0_REGS, AD7606_PAR_RD, GPIO_PIN_HIGH);
; R4 g g2 v4 }$ X
; r4 d4 R& [! j+ P) x o' a+ Y
}
4 e9 w. G& E2 l$ q, y
: I* q4 @ M) R! `
. x, {4 y$ G4 A. r
static void ad7606_busy_hwi(UArg ad_addr) {
, i% t" {% a% t8 J( {: b! {
& n* l' x y1 d& p% k4 P/ N
8 S6 l+ X7 }& z2 j& g7 @
/* Disable the interrupts for pins of bank AD7606_PAR_BUSY in GPIO.*/
$ t, o% W& z6 A
GPIOBankIntDisable(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_GPIO_BANK);
//用仿真器debug,发现程序能进入这里。
( Z/ Z+ X% f5 F2 F( u8 v |
& s+ K6 X( O( H3 {7 }$ w$ C
if(GPIOPinIntStatus(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_V1) == GPIO_INT_PEND)
$ n' I# ~9 `; g& f0 {' p
{
8 y7 e& ~, d7 Y" M4 _; o
GPIOPinIntClear(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_V1);
//问题是:用仿真器debug,发现程序不能进入这里。
4 V. r3 d# p4 f" P0 A8 E7 [3 a3 |" }, O
cs_addr = SOC_EMIFA_CS5_ADDR ;
( w- P6 t% j! m0 d9 R
internal = 0 ;
1 i0 [4 v( Q% U& K
int_flag[0] = 1 ;
. K- ^* k d8 f4 [* P
}
* L3 S1 {0 E: x! `
if(GPIOPinIntStatus(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_V2) == GPIO_INT_PEND)
$ L) S6 P; u' N# y9 {
{
% {8 l1 L" M/ T
GPIOPinIntClear(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_V2);
//问题是:用仿真器debug,发现程序不能进入这里。
7 S% H0 R R' n2 T/ p, J' ^4 o6 D* ~
cs_addr = SOC_EMIFA_CS4_ADDR ;
9 L2 X, y/ F) C# a8 H! M
internal = 6 ;
. [" N0 y0 b/ W2 f6 h. e
int_flag[1] = 1 ;
2 Q! e5 M5 s% S
}
6 m2 i% K' N9 V% {' L% W* {
if(GPIOPinIntStatus(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_C) == GPIO_INT_PEND)
7 _$ n L- u3 T. z1 s8 w: T
{
3 J6 a; K) l/ p* }* S
GPIOPinIntClear(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_C);
//问题是:用仿真器debug,发现程序不能进入这里。
. y x9 n( Y$ f& s
cs_addr = SOC_EMIFA_CS2_ADDR ;
$ J n% v( o* o! ^( g
internal = 12 ;
1 u$ {9 [. k! a4 q" ?4 x& f/ ?3 w
int_flag[2] = 1 ;
* K* t% ?+ e5 V0 A6 P
}
8 N1 Y% }" a% u& D/ u1 H
) O, y* a1 C( b# Y! P R; }3 {
GPIOPinWrite(SOC_GPIO_0_REGS, AD7606_PAR_CONVST, GPIO_PIN_LOW);
' r& i( h& w$ D! }0 H
' J9 B3 N- f$ A7 Y' e" a& j' O. r
GPIOBankIntEnable(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_GPIO_BANK);
" ]% d# k- o% d7 V
}
& A: Q: g' c* h( {
3 |8 u+ E4 j6 N8 Q' k8 W; g: s
作者:
vtinf
时间:
2016-8-31 16:53
INTSTAT45状态如图
$ e2 U+ }: s7 h* I7 b* b
[attach]1368[/attach]
2 c; F2 o& t6 v! F
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4