嵌入式开发者社区
标题:
sysbios hwi 端口识别问题
[打印本页]
作者:
vtinf
时间:
2016-8-31 17:29
标题:
sysbios hwi 端口识别问题
您好。使用GPIO中断时,中断能进入ISR,但是不能区分具体的GPIO端口。程序如下:
0 V2 Y6 z: E( i/ G4 H9 f8 Z
#define AD7606_PAR_BUSY_GPIO_BANK 5
. @: k$ z* q: x1 _3 J- D0 o+ M5 K
#define AD7606_PAR_BUSY_GPIO_BANK_INT SYS_INT_GPIO_B5INT
% c6 c. z# e( B
. d3 [7 @9 L8 _" U3 x" N3 ]
#define AD7606_PAR_BUSY_V1 GPIO_TO_PIN(5, 11)
//BANK5的中断口5.11
/ U. _' Y5 o# u
#define AD7606_PAR_BUSY_V2 GPIO_TO_PIN(5, 9)
//BANK5的中断口5.9
5 d H: M; e( Y( t" Z8 F2 l
#define AD7606_PAR_BUSY_C GPIO_TO_PIN(5, 5)
//BANK5的中断口5.5
: t# D, B L8 P$ |
#define AD7606_PAR_BUSY GPIO_TO_PIN(5, 4)
; O5 Y" p1 x4 B
/ D; P! G0 R- ~* w# H- u
#define AD7606_PAR_CONVST GPIO_TO_PIN(5, 1)
+ Q" y% u& w# C* X
#define AD7606_PAR_RD GPIO_TO_PIN(5, 2)
6 n6 v B1 f! e) O+ l
#define AD7606_PAR_RESET GPIO_TO_PIN(5, 0)
' }8 p8 D( A. J+ i4 t
* ]" M S# W9 S) m5 ~; j, s+ X
2 N$ H4 I2 Y; [
4 k( ]- X8 a1 k9 S
static void ad7606_irq_setup(ad7606 *ad) {
4 @2 f7 Q' m: f( r% S
Hwi_Params hwiParams;
5 T, H! R: ~( n
Hwi_Handle myHwi;
) A& G- |4 l1 p6 i# G) W: g) q
Error_Block eb;
x& v0 c& l) E- \
- W5 I1 u) L# w! U% u/ k
Error_init(&eb);
6 y; k. ?& e o* a1 H! T) y* Y
Hwi_Params_init(&hwiParams);
) s8 Y0 V* G( A% U2 k1 O3 U3 ?
hwiParams.arg = (unsigned int)ad;
' ]4 K% }. j: `: v$ w5 R+ s
hwiParams.enableInt = FALSE;
+ J# V! e4 j; f3 t6 ~
hwiParams.eventId = SYS_INT_GPIO_B5INT;
" t/ @! a% W( D U
hwiParams.priority = 4;
5 T! M6 u. @. {0 u9 J2 W3 S# {
myHwi = Hwi_create(8, ad7606_busy_hwi, &hwiParams, &eb);
//注册BANK5中断处理函数
% C6 g1 F8 ]1 C- V* ?$ U
if (myHwi == NULL)
) `7 U4 ? X9 p7 e1 H
LOG_FATAL("failed to create hwi");
3 ~! _7 f% m7 C
& v, H& [% I& K" w4 m" m5 m1 m
/* enable both interrupts */
6 Z+ o. O& p8 [: e/ F+ L. U
Hwi_enableInterrupt(ad->irq_event);
V* B& u. J" w- f! L8 @
}
8 {: H3 P Z% T# @; G) ]/ k5 O- u. Q
# q; C) t- y ]$ O, d6 X, G" X
* q. d; G8 f9 ]! [3 u/ @
static void ad7606_gpio_pinmux_setup(ad7606 *ad) {
, b8 [- s- ^ `; E
volatile unsigned int savePinMux = 0;
7 o8 J5 P" @* Z# Z/ l
//初始化
5.11、5.9 、 5.5为GPIO口
& F7 b0 {6 s/ E4 k# A, N! [( j
savePinMux = HWREG(SOC_SYSCFG_0_REGS + SYSCFG0_PINMUX(11)) & (~(SYSCFG_PINMUX11_PINMUX11_27_24 | SYSCFG_PINMUX11_PINMUX11_19_16));
* r1 V$ t8 K1 s- z
! x. V' B1 s8 K9 R1 o) ^- J, E) l
HWREG(SOC_SYSCFG_0_REGS + SYSCFG0_PINMUX(11)) = (PINMUX11_BUSY_V1_ENABLE | PINMUX11_BUSY_V2_ENABLE | savePinMux);
8 I5 D w% Q& }
$ v5 p: ]* n# G' x% v9 j' T, G, N
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));
6 _0 ]( ^/ W3 d/ ]: y% a1 e
* r k1 l) U! R+ t! Z, @! |
HWREG(SOC_SYSCFG_0_REGS + SYSCFG0_PINMUX(12)) = (PINMUX12_RESET_ENABLE | PINMUX12_CONVST_ENABLE | PINMUX12_RD_ENABLE | PINMUX12_BUSY_C_ENABLE | savePinMux);
5 h9 W* k' E5 ^" S6 C
1 ~ m; W1 Q' H5 r
}
8 Q, a+ r: D( @! R/ X
4 v2 r6 R; f) S# m, a
9 K# f( s. p7 a
static void ad7606_gpio_setup(ad7606 *ad) {
3 b5 y# f9 `5 x Z9 \
/*Set the AD7606_PAR_BUSY to the input mode*/
3 h; v6 R' \ |: @' q: z+ ?
//初始化
5.11、5.9 、 5.5为中断口
" u% V8 ^" U9 Z. d' | i) C& v
GPIODirModeSet(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_V1, GPIO_DIR_INPUT);
( h. e9 d9 ~ s
GPIODirModeSet(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_V2, GPIO_DIR_INPUT);
# f1 n+ J) u9 J" [8 e4 R
GPIODirModeSet(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_C, GPIO_DIR_INPUT);
6 j2 o! v( L9 ]
//GPIODirModeSet(SOC_GPIO_0_REGS, AD7606_PAR_BUSY, GPIO_DIR_INPUT);
" G5 l. V1 T/ j) m8 f; ]0 c
/*Set the AD7606_PAR_BUSY to the Falling Edge Interrupt*/
% [9 ?) l% V7 T, f' Y
GPIOIntTypeSet(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_V1, GPIO_INT_TYPE_FALLEDGE);
# l8 ]. G. F5 ~/ c; F7 F
GPIOIntTypeSet(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_V2, GPIO_INT_TYPE_FALLEDGE);
6 _2 N5 B& j' M
GPIOIntTypeSet(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_C, GPIO_INT_TYPE_FALLEDGE);
( W$ B7 e6 `/ X9 @7 b
//GPIOIntTypeSet(SOC_GPIO_0_REGS, AD7606_PAR_BUSY, GPIO_INT_TYPE_FALLEDGE);
/ C: @& x6 F0 u/ B
/*The interrupt setting allows AD7606_PAR_BUSY_GPIO_BANK*/
& M# J0 }3 ]; t/ }- A: f
GPIOBankIntEnable(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_GPIO_BANK);
L3 L% N7 M9 x E) P
1 T" f1 M5 A$ k
GPIODirModeSet(SOC_GPIO_0_REGS, AD7606_PAR_RESET, GPIO_DIR_OUTPUT);
0 R) n; W3 v8 }6 y3 g
GPIOPinWrite(SOC_GPIO_0_REGS, AD7606_PAR_RESET, GPIO_PIN_HIGH);
3 p# t1 s6 G0 [: q
Task_sleep(1000);
3 ?( Y9 A; W" A. Q5 p% D0 {8 ?
GPIOPinWrite(SOC_GPIO_0_REGS, AD7606_PAR_RESET, GPIO_PIN_LOW);
! q( e" B( }" d1 w$ [+ H
Task_sleep(1000);
5 m* ^* b/ w0 ~. c t- X; r
( w9 r6 z, B1 { d5 d0 n: B! J$ I
/*Set the AD7606_PAR_CONVST to output mode*/
3 R% S4 t! Q# K# V ^1 x
GPIODirModeSet(SOC_GPIO_0_REGS, AD7606_PAR_CONVST, GPIO_DIR_OUTPUT);
: H6 F% y8 G2 [& j
GPIOPinWrite(SOC_GPIO_0_REGS, AD7606_PAR_CONVST, GPIO_PIN_LOW);
& z0 y. C6 _1 P0 _; `' o$ r
9 Z0 Q- V4 L+ U
GPIODirModeSet(SOC_GPIO_0_REGS, AD7606_PAR_RD, GPIO_DIR_OUTPUT);
1 `- R/ |& ~* I% i a) e: X4 m
GPIOPinWrite(SOC_GPIO_0_REGS, AD7606_PAR_RD, GPIO_PIN_HIGH);
+ g1 b8 J& u' D/ c' Y' [/ |
% y! I4 b3 U- W
}
8 C" v7 o' D) [; c: f* z
7 {* @0 d) A* g) F& y- E% s
; I6 i4 g' K! M# ]
static void ad7606_busy_hwi(UArg ad_addr) {
8 M K7 u5 a3 T
' e; w, s& y I* ~5 {/ A
# G& {! e8 ?7 m7 q& t- P$ p
/* Disable the interrupts for pins of bank AD7606_PAR_BUSY in GPIO.*/
; y% X( G# I. c/ o( R
GPIOBankIntDisable(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_GPIO_BANK);
//用仿真器debug,发现程序能进入这里。
( d$ ~ O# d8 p
& L l$ I& S+ ]$ I; W% ]
if(GPIOPinIntStatus(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_V1) == GPIO_INT_PEND)
8 T* ]$ e( S" Z+ I
{
( R- x1 P+ h1 \0 O- L
GPIOPinIntClear(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_V1);
//问题是:用仿真器debug,发现程序不能进入这里。
. \4 W3 W2 Q- O7 b
cs_addr = SOC_EMIFA_CS5_ADDR ;
/ S9 w0 L2 @7 ~# a g- x4 C* S" X
internal = 0 ;
/ E( e2 e2 ?9 i: i# M& Q
int_flag[0] = 1 ;
/ U" }/ @0 |+ i
}
! ~+ _& `6 s- E9 j$ S: X. r* l+ {
if(GPIOPinIntStatus(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_V2) == GPIO_INT_PEND)
: H9 u6 Y R. K2 ^
{
3 j; l; Y) x* m& u
GPIOPinIntClear(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_V2);
//问题是:用仿真器debug,发现程序不能进入这里。
! _; \2 k5 K+ S/ ?
cs_addr = SOC_EMIFA_CS4_ADDR ;
7 ^ B0 j) ]+ \& u' J' }
internal = 6 ;
# ^! Y7 o* U/ C" d0 B% ?
int_flag[1] = 1 ;
, k+ @; ], H* U" N+ M
}
8 F- e$ b( L4 D" n# C* C1 L( @
if(GPIOPinIntStatus(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_C) == GPIO_INT_PEND)
! g, q, V) I7 z. |9 Y
{
5 S. y# }0 [/ u0 a
GPIOPinIntClear(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_C);
//问题是:用仿真器debug,发现程序不能进入这里。
( C+ u% j' i- R( G# h. _
cs_addr = SOC_EMIFA_CS2_ADDR ;
0 A+ I4 d, k+ E2 s- A
internal = 12 ;
3 H* i1 _2 v' _* ^# |
int_flag[2] = 1 ;
3 _2 I! X1 W D. Z
}
: B% t4 w J" ^. d' p- R0 N
+ J& C* b) J, a: h! S: d( Z1 N
GPIOPinWrite(SOC_GPIO_0_REGS, AD7606_PAR_CONVST, GPIO_PIN_LOW);
- A/ \6 h* W n6 e4 i: D& q4 r: N
4 ?; g+ s( _' C+ M$ N
GPIOBankIntEnable(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_GPIO_BANK);
4 X& Y8 V6 K, a, Q, ^+ G; R# p( d
}
. O/ z& p" ` f+ f
7 `& A5 \( W, P) y- k7 ?9 g2 k+ e
6 @+ a$ W# n- o2 Q, n5 O% Q5 T/ j
, L7 Z# Z5 R" `& W; g- G! p
[attach]1369[/attach]
. z+ u1 ~8 Y/ W/ p7 C' q' p2 ?
作者:
human
时间:
2016-9-18 19:35
你用单步调试,step into看看相应的函数值是否发生了变化
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4