嵌入式开发者社区
标题:
sysbios hwi 端口识别问题
[打印本页]
作者:
vtinf
时间:
2016-8-31 17:29
标题:
sysbios hwi 端口识别问题
您好。使用GPIO中断时,中断能进入ISR,但是不能区分具体的GPIO端口。程序如下:
6 ~2 j; p0 b% i+ u
#define AD7606_PAR_BUSY_GPIO_BANK 5
! T2 ]! x) o' R' t1 v
#define AD7606_PAR_BUSY_GPIO_BANK_INT SYS_INT_GPIO_B5INT
" q+ |, |* q& q% K4 S
4 x+ |; p1 B) t. z! c
#define AD7606_PAR_BUSY_V1 GPIO_TO_PIN(5, 11)
//BANK5的中断口5.11
% [- M2 P# Q; ^
#define AD7606_PAR_BUSY_V2 GPIO_TO_PIN(5, 9)
//BANK5的中断口5.9
& _: S! E( \, ]8 r/ `6 R2 h4 [5 s
#define AD7606_PAR_BUSY_C GPIO_TO_PIN(5, 5)
//BANK5的中断口5.5
4 G; E* V6 R$ ~
#define AD7606_PAR_BUSY GPIO_TO_PIN(5, 4)
8 ~. {( W, U5 H- H0 ]
, o; V1 |9 B2 z7 D0 w/ t% K
#define AD7606_PAR_CONVST GPIO_TO_PIN(5, 1)
J0 Q `4 {0 d& Q' T5 B* X7 a9 t O
#define AD7606_PAR_RD GPIO_TO_PIN(5, 2)
: O8 {9 l4 n+ y
#define AD7606_PAR_RESET GPIO_TO_PIN(5, 0)
3 G* \! r4 n; O* B6 M7 ^1 _+ P
. Q% B" t! }. s' Y5 X* p% K6 ^. v
2 l2 u/ J8 P- [& q9 T
4 u5 F% U# l2 p' J; G* L
static void ad7606_irq_setup(ad7606 *ad) {
2 d$ w+ S$ ^ t
Hwi_Params hwiParams;
! Y6 q: {5 {6 R, {# d% u
Hwi_Handle myHwi;
2 X/ A. Y6 ]% r6 a; q; ^- s
Error_Block eb;
2 w% T! {- z4 w5 J: M
5 Z. F' f0 q9 s6 z
Error_init(&eb);
- v7 u' ]; f0 t7 B. E9 n
Hwi_Params_init(&hwiParams);
: v4 K" V9 {& y! W( W+ w5 l
hwiParams.arg = (unsigned int)ad;
, q' z, }5 N$ @6 Z/ a. h
hwiParams.enableInt = FALSE;
* Z2 M: x/ p% p9 r; m/ s/ J
hwiParams.eventId = SYS_INT_GPIO_B5INT;
: \5 l5 M2 h ^4 |
hwiParams.priority = 4;
9 _3 X- b% j4 e0 \, l8 h
myHwi = Hwi_create(8, ad7606_busy_hwi, &hwiParams, &eb);
//注册BANK5中断处理函数
4 P7 E- Q% N9 N9 }" o3 D
if (myHwi == NULL)
# j9 E. l3 R+ s! K- Z
LOG_FATAL("failed to create hwi");
- ?# J# L4 Q+ H7 @" N
; r! ~ w9 J+ n& D6 i
/* enable both interrupts */
9 F* g8 p! Z) c. N* `/ ?) m- b
Hwi_enableInterrupt(ad->irq_event);
, ]3 B& l, I. D* T& ~5 S8 m
}
+ D; h" y5 |' X/ M7 _# w
3 Z7 h r& j5 W/ a' H" y
' z7 O4 i$ m! n
static void ad7606_gpio_pinmux_setup(ad7606 *ad) {
6 H. F- {' A9 y! W; @, S
volatile unsigned int savePinMux = 0;
+ X# N- n8 ^' c3 F: U
//初始化
5.11、5.9 、 5.5为GPIO口
4 S! a4 a6 d; Y& K0 d' L
savePinMux = HWREG(SOC_SYSCFG_0_REGS + SYSCFG0_PINMUX(11)) & (~(SYSCFG_PINMUX11_PINMUX11_27_24 | SYSCFG_PINMUX11_PINMUX11_19_16));
9 Z6 n# P. F7 J. Y
# j, B8 O* G0 Z) r9 h' W; B
HWREG(SOC_SYSCFG_0_REGS + SYSCFG0_PINMUX(11)) = (PINMUX11_BUSY_V1_ENABLE | PINMUX11_BUSY_V2_ENABLE | savePinMux);
1 ~& ?; ?; X+ i8 t6 S
8 |; Z# k. x- b2 y
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));
( q8 M; {' X& m- ?* n
3 ]' ]* Q( y& u) I
HWREG(SOC_SYSCFG_0_REGS + SYSCFG0_PINMUX(12)) = (PINMUX12_RESET_ENABLE | PINMUX12_CONVST_ENABLE | PINMUX12_RD_ENABLE | PINMUX12_BUSY_C_ENABLE | savePinMux);
( I1 D$ B& r K6 `8 T% t* M j2 \
8 w9 b- ]( Z6 I5 w3 Z
}
+ |8 ]: R, ?: I# x; O' O/ J
, R* t9 J, U6 T0 ^) Z4 i$ q- e% s
# E/ g4 T2 i5 F4 E! i9 R
static void ad7606_gpio_setup(ad7606 *ad) {
) u8 D5 W7 L1 l: B$ A# L
/*Set the AD7606_PAR_BUSY to the input mode*/
0 c# V: N& c# t8 j2 e! v/ y
//初始化
5.11、5.9 、 5.5为中断口
2 E- t( L$ D- s* f* \& `
GPIODirModeSet(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_V1, GPIO_DIR_INPUT);
5 m$ J9 ?' W" Z, p! m7 S
GPIODirModeSet(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_V2, GPIO_DIR_INPUT);
1 p0 E9 @& S% a) n7 X1 I
GPIODirModeSet(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_C, GPIO_DIR_INPUT);
/ a% Q0 p- R5 k5 a
//GPIODirModeSet(SOC_GPIO_0_REGS, AD7606_PAR_BUSY, GPIO_DIR_INPUT);
& [3 {2 E" D! q; Q2 I# w
/*Set the AD7606_PAR_BUSY to the Falling Edge Interrupt*/
# f8 T1 u* |3 j
GPIOIntTypeSet(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_V1, GPIO_INT_TYPE_FALLEDGE);
e$ Z2 P4 o6 ]- _/ _$ {/ x
GPIOIntTypeSet(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_V2, GPIO_INT_TYPE_FALLEDGE);
/ A- j8 A* C/ I
GPIOIntTypeSet(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_C, GPIO_INT_TYPE_FALLEDGE);
% j/ t/ J3 _9 w& U9 e, K0 F
//GPIOIntTypeSet(SOC_GPIO_0_REGS, AD7606_PAR_BUSY, GPIO_INT_TYPE_FALLEDGE);
5 P0 |5 |# z2 H6 i+ e A$ J
/*The interrupt setting allows AD7606_PAR_BUSY_GPIO_BANK*/
+ u) ~& ^, _) V5 F$ u1 {4 [4 e
GPIOBankIntEnable(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_GPIO_BANK);
" F/ \+ t3 y5 a* ?
6 z6 q, s8 F5 c l5 G- H4 f
GPIODirModeSet(SOC_GPIO_0_REGS, AD7606_PAR_RESET, GPIO_DIR_OUTPUT);
* j) s( S, s0 k4 ^- @
GPIOPinWrite(SOC_GPIO_0_REGS, AD7606_PAR_RESET, GPIO_PIN_HIGH);
& F0 c- e- A4 H% [5 \9 I
Task_sleep(1000);
2 r/ K% S Y" S- v1 h5 l
GPIOPinWrite(SOC_GPIO_0_REGS, AD7606_PAR_RESET, GPIO_PIN_LOW);
* v" u! `& Y# Q; {; F
Task_sleep(1000);
8 m% J+ M' x) I( F& f, z2 }
0 }/ U" }* G# U9 c
/*Set the AD7606_PAR_CONVST to output mode*/
3 \/ {! j( Y. `7 G: j
GPIODirModeSet(SOC_GPIO_0_REGS, AD7606_PAR_CONVST, GPIO_DIR_OUTPUT);
, K3 `& y8 a) J
GPIOPinWrite(SOC_GPIO_0_REGS, AD7606_PAR_CONVST, GPIO_PIN_LOW);
7 P! a2 Z5 ~4 V- J0 W
/ F( a3 G1 a0 g7 @
GPIODirModeSet(SOC_GPIO_0_REGS, AD7606_PAR_RD, GPIO_DIR_OUTPUT);
5 B9 g7 ~# p# O: j
GPIOPinWrite(SOC_GPIO_0_REGS, AD7606_PAR_RD, GPIO_PIN_HIGH);
4 ~' O. j/ S' A: K
$ { ~0 Z9 v* h/ |1 C
}
+ {& P3 P5 ^% q% i
0 p, ^) |6 D- q* W
8 n/ t! @! ]3 l/ `! ^4 {- P. u6 f
static void ad7606_busy_hwi(UArg ad_addr) {
9 g+ _8 p! O( t4 _9 R8 e% N; y+ H
; h* e$ [7 o" |, O1 z4 A% o7 b
0 @, \. `) D; \! y
/* Disable the interrupts for pins of bank AD7606_PAR_BUSY in GPIO.*/
5 ~& J; e2 \ s a
GPIOBankIntDisable(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_GPIO_BANK);
//用仿真器debug,发现程序能进入这里。
$ i6 I6 U) u; Y
( f3 k. a6 n* Y, v+ _* t
if(GPIOPinIntStatus(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_V1) == GPIO_INT_PEND)
4 s+ a4 w) V% _4 Y5 A8 f
{
X; q8 |8 k9 m0 y" S! B- Q
GPIOPinIntClear(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_V1);
//问题是:用仿真器debug,发现程序不能进入这里。
0 E6 n. g0 R }6 [& k8 d3 i6 R
cs_addr = SOC_EMIFA_CS5_ADDR ;
7 Z6 H$ c* |0 P0 L6 C; A
internal = 0 ;
7 E! k6 O7 C& L2 j' n! \
int_flag[0] = 1 ;
, X) e3 q& O" T" H/ h* j, |
}
! \1 M+ }* F6 e6 ^$ W8 r A2 S
if(GPIOPinIntStatus(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_V2) == GPIO_INT_PEND)
/ W A0 c1 B1 R) E
{
8 S4 M) G* w/ h, c
GPIOPinIntClear(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_V2);
//问题是:用仿真器debug,发现程序不能进入这里。
3 L1 G/ i* v! v
cs_addr = SOC_EMIFA_CS4_ADDR ;
8 n3 u) z1 F6 Y
internal = 6 ;
" c# t; M. m0 G7 t+ {( Q _
int_flag[1] = 1 ;
8 U: V% F, Z$ j- x$ I( |- r9 U
}
1 s+ l6 @, j' A- H( G
if(GPIOPinIntStatus(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_C) == GPIO_INT_PEND)
3 |/ W/ G2 h# K7 b, h" x& y/ S
{
! p! K, k& A# \( a+ ^' ~% R
GPIOPinIntClear(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_C);
//问题是:用仿真器debug,发现程序不能进入这里。
7 X' M- d( P* J2 W/ O0 }9 c
cs_addr = SOC_EMIFA_CS2_ADDR ;
& h1 j2 r' I" D& ~$ c
internal = 12 ;
% T! Z5 R& u9 ~* j
int_flag[2] = 1 ;
: J5 k3 B) I" l0 X+ p
}
: c/ X+ K+ s% Z
5 O" v+ b" O( ]2 r
GPIOPinWrite(SOC_GPIO_0_REGS, AD7606_PAR_CONVST, GPIO_PIN_LOW);
6 n7 P/ I0 k% B% {0 G
! U$ b' K4 R& j3 L' m5 _& f
GPIOBankIntEnable(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_GPIO_BANK);
1 ?8 M, _9 c6 m: G- B" a
}
9 T/ M h7 m0 V' L# v7 r3 b
. l* i U0 Y$ r4 `' H+ h2 ?
% ]" x+ H. C. P; V6 B" t. ~
8 r* }9 o# d* R2 y
[attach]1369[/attach]
) P# K4 B, t2 m. ~$ H
作者:
human
时间:
2016-9-18 19:35
你用单步调试,step into看看相应的函数值是否发生了变化
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4