嵌入式开发者社区
标题:
sysbios hwi 端口识别问题
[打印本页]
作者:
vtinf
时间:
2016-8-31 17:29
标题:
sysbios hwi 端口识别问题
您好。使用GPIO中断时,中断能进入ISR,但是不能区分具体的GPIO端口。程序如下:
- b1 r6 q8 J: B4 O
#define AD7606_PAR_BUSY_GPIO_BANK 5
0 T) A" ]: G2 ?9 k7 ] k. `$ g
#define AD7606_PAR_BUSY_GPIO_BANK_INT SYS_INT_GPIO_B5INT
6 q- o" d) B' w$ E: n: k6 j
" O5 { t4 f( p0 I
#define AD7606_PAR_BUSY_V1 GPIO_TO_PIN(5, 11)
//BANK5的中断口5.11
; ]) ]6 j- t7 g- L5 A5 [
#define AD7606_PAR_BUSY_V2 GPIO_TO_PIN(5, 9)
//BANK5的中断口5.9
% T1 w( v7 O+ X: h6 }& \7 w
#define AD7606_PAR_BUSY_C GPIO_TO_PIN(5, 5)
//BANK5的中断口5.5
& N+ I) o& u6 R, `( M+ {0 N
#define AD7606_PAR_BUSY GPIO_TO_PIN(5, 4)
* j7 c1 ]& n- _: s) U7 W( `
" I/ l1 g) N7 l7 c0 x+ O* `9 d/ j
#define AD7606_PAR_CONVST GPIO_TO_PIN(5, 1)
/ J8 o9 h7 e' Y( m Q
#define AD7606_PAR_RD GPIO_TO_PIN(5, 2)
* L2 z* [0 c! _! e0 W' ~/ L& \, J
#define AD7606_PAR_RESET GPIO_TO_PIN(5, 0)
! Z4 D2 ?9 v8 Y% w4 }7 Y+ D
$ ]( m3 Z* F8 R. n! m8 G
3 `5 T, ?3 m8 T) q" _" d
. \% p* F7 y7 `' J5 x" p
static void ad7606_irq_setup(ad7606 *ad) {
/ {' q: X) P$ a9 y) ]
Hwi_Params hwiParams;
5 F: h/ P9 O4 f1 |0 H1 {4 k' j
Hwi_Handle myHwi;
: Q/ d( ~' B# O+ z* N
Error_Block eb;
+ C) ^0 q! I n( C
* ^5 a" d- I. D, H& |* E- f+ [
Error_init(&eb);
& o9 \7 O. w; }- r+ M' A
Hwi_Params_init(&hwiParams);
3 S! k9 g1 m2 p% }. P& ]6 d
hwiParams.arg = (unsigned int)ad;
8 q, C \$ R+ K
hwiParams.enableInt = FALSE;
9 a0 ^$ t- H' d+ V
hwiParams.eventId = SYS_INT_GPIO_B5INT;
2 c) V: _8 @; P, @3 C, K) z8 I6 P
hwiParams.priority = 4;
s* V9 t. h6 K4 B
myHwi = Hwi_create(8, ad7606_busy_hwi, &hwiParams, &eb);
//注册BANK5中断处理函数
4 v( {0 S/ r# G8 q- h! X
if (myHwi == NULL)
( n4 E. | ^3 K7 I" a$ H
LOG_FATAL("failed to create hwi");
) G1 X( Y: Z0 l7 l# e! k( |
% n+ n: e0 o1 j4 u2 J: k" W
/* enable both interrupts */
) G& ]- Q7 i( a
Hwi_enableInterrupt(ad->irq_event);
+ r4 O0 Q! I% B9 n; _3 Q
}
3 Y4 A, l: [ R, M3 |" z
3 i3 ~6 r) v6 G4 L. s& Y
. T2 l5 ^1 B2 e0 h
static void ad7606_gpio_pinmux_setup(ad7606 *ad) {
9 }% G5 ~2 T) e$ W
volatile unsigned int savePinMux = 0;
- O, w1 a4 W+ I3 B$ h# J
//初始化
5.11、5.9 、 5.5为GPIO口
8 s' T: B4 _+ R) W. m8 q* O
savePinMux = HWREG(SOC_SYSCFG_0_REGS + SYSCFG0_PINMUX(11)) & (~(SYSCFG_PINMUX11_PINMUX11_27_24 | SYSCFG_PINMUX11_PINMUX11_19_16));
7 s! q& L. x# e$ H
4 v+ H4 `# |; l; V
HWREG(SOC_SYSCFG_0_REGS + SYSCFG0_PINMUX(11)) = (PINMUX11_BUSY_V1_ENABLE | PINMUX11_BUSY_V2_ENABLE | savePinMux);
) u' Q# ~. k, j" |) Y
# S8 @% |% T* Q/ y5 @
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));
X. I8 c9 _6 @: \# m0 f1 M
; R9 P1 C# i; ~* s4 ?6 Q9 I, w5 U! ^
HWREG(SOC_SYSCFG_0_REGS + SYSCFG0_PINMUX(12)) = (PINMUX12_RESET_ENABLE | PINMUX12_CONVST_ENABLE | PINMUX12_RD_ENABLE | PINMUX12_BUSY_C_ENABLE | savePinMux);
4 T" D! k" h4 I' L
' @! \% e* u" l. Q" C
}
$ I( ]7 q. |) _( U( h/ ~5 R
# m4 z) c- z1 T3 @
7 e w# s+ w! r; X4 J9 V% h+ z
static void ad7606_gpio_setup(ad7606 *ad) {
' s7 l8 I0 I: i$ Z% V
/*Set the AD7606_PAR_BUSY to the input mode*/
1 ?# B4 J1 W" U& Q l2 M
//初始化
5.11、5.9 、 5.5为中断口
* Z& O; c r# S( }; d( @
GPIODirModeSet(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_V1, GPIO_DIR_INPUT);
8 g/ ~1 y# |. i; ?; K: c6 |' w
GPIODirModeSet(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_V2, GPIO_DIR_INPUT);
, U5 c. C3 D+ e
GPIODirModeSet(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_C, GPIO_DIR_INPUT);
6 |- C+ s- e J! ]
//GPIODirModeSet(SOC_GPIO_0_REGS, AD7606_PAR_BUSY, GPIO_DIR_INPUT);
5 i( y! u) \1 ?6 m6 P
/*Set the AD7606_PAR_BUSY to the Falling Edge Interrupt*/
( r7 O& a- q; f
GPIOIntTypeSet(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_V1, GPIO_INT_TYPE_FALLEDGE);
/ I* ]: j# M3 d
GPIOIntTypeSet(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_V2, GPIO_INT_TYPE_FALLEDGE);
, H, p0 }8 [6 f* h$ [* z
GPIOIntTypeSet(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_C, GPIO_INT_TYPE_FALLEDGE);
. N8 Y" n) }) p3 L. ^, y" w6 e
//GPIOIntTypeSet(SOC_GPIO_0_REGS, AD7606_PAR_BUSY, GPIO_INT_TYPE_FALLEDGE);
. _$ H& D1 A1 t* l+ w* c
/*The interrupt setting allows AD7606_PAR_BUSY_GPIO_BANK*/
: T) e8 e: ?: Y1 A Z @% p
GPIOBankIntEnable(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_GPIO_BANK);
+ x0 g; T; i$ J# B. q# |' a* h
5 c: w- M$ j0 B" y4 x2 s8 F
GPIODirModeSet(SOC_GPIO_0_REGS, AD7606_PAR_RESET, GPIO_DIR_OUTPUT);
2 ?/ ^& y2 \5 |* [3 a
GPIOPinWrite(SOC_GPIO_0_REGS, AD7606_PAR_RESET, GPIO_PIN_HIGH);
8 g0 L# P2 W! D* I
Task_sleep(1000);
6 P* O, p F! z* y
GPIOPinWrite(SOC_GPIO_0_REGS, AD7606_PAR_RESET, GPIO_PIN_LOW);
1 m# a l2 g% I- }
Task_sleep(1000);
' P3 h+ v f3 |, P O: D* v
! q! n% n6 [, c e" B
/*Set the AD7606_PAR_CONVST to output mode*/
5 t4 X$ i" o5 w2 K
GPIODirModeSet(SOC_GPIO_0_REGS, AD7606_PAR_CONVST, GPIO_DIR_OUTPUT);
; n' r3 x3 ^9 t0 x( j, `
GPIOPinWrite(SOC_GPIO_0_REGS, AD7606_PAR_CONVST, GPIO_PIN_LOW);
% j" h; I& x: Y' ?. E3 X$ `3 v
% l- \; H( Y: h( |* A
GPIODirModeSet(SOC_GPIO_0_REGS, AD7606_PAR_RD, GPIO_DIR_OUTPUT);
8 g/ B7 D! X6 n( p& z9 v4 `3 y# A
GPIOPinWrite(SOC_GPIO_0_REGS, AD7606_PAR_RD, GPIO_PIN_HIGH);
: F0 |/ W# y \( q3 f8 I
% `. E, R9 x" V( V/ H( X+ H
}
& Y8 [* N7 Q; }# B- N+ c
- e8 Y; K3 T M
- v$ G! S' f6 h$ U
static void ad7606_busy_hwi(UArg ad_addr) {
9 V$ a# d7 ], a% @$ G* Y. m
* X3 r/ Y$ Q- t* ~# t' h$ x b6 k7 x
) J, P9 k! h; k5 o) ^0 S
/* Disable the interrupts for pins of bank AD7606_PAR_BUSY in GPIO.*/
0 H9 q; x _8 r6 \
GPIOBankIntDisable(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_GPIO_BANK);
//用仿真器debug,发现程序能进入这里。
4 r: b! ]6 D7 D; ?; Y/ ?
, _, M7 ~1 R& S
if(GPIOPinIntStatus(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_V1) == GPIO_INT_PEND)
l. f$ Q* D/ b
{
[- E+ k2 O9 A8 ]0 O
GPIOPinIntClear(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_V1);
//问题是:用仿真器debug,发现程序不能进入这里。
3 x0 R% Y, i% S* `: {/ o- \
cs_addr = SOC_EMIFA_CS5_ADDR ;
' U! d- G! z- g
internal = 0 ;
' [6 \1 J$ A" c, l# W4 K
int_flag[0] = 1 ;
* p6 `5 V1 \. J0 t. ]( L
}
8 L. {% v1 d% @7 l1 v
if(GPIOPinIntStatus(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_V2) == GPIO_INT_PEND)
6 A! r: F" P0 A0 N* J- {
{
& |. `. v; d% H t- G! X+ q* Y
GPIOPinIntClear(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_V2);
//问题是:用仿真器debug,发现程序不能进入这里。
0 i ^( e2 ^' l" g2 @; Z
cs_addr = SOC_EMIFA_CS4_ADDR ;
/ \- Y! r* p4 f# U
internal = 6 ;
" t" T2 D) j5 f1 P5 @
int_flag[1] = 1 ;
% U" H& i4 `" T( T% u- |3 n+ e
}
" [9 M6 D9 q" u( Y% g
if(GPIOPinIntStatus(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_C) == GPIO_INT_PEND)
4 x O, A) f4 S2 T0 R
{
; d. F' s$ t) c V4 r+ J
GPIOPinIntClear(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_C);
//问题是:用仿真器debug,发现程序不能进入这里。
9 V$ I( l8 C3 \; R& i* O4 d
cs_addr = SOC_EMIFA_CS2_ADDR ;
N. \0 R7 _) q, M( t
internal = 12 ;
6 c6 ^1 q7 k0 [, x* k# M
int_flag[2] = 1 ;
8 \8 F( y! f# k' [9 y6 P- X# ]
}
1 U3 @( d% {# C! z$ P3 }
% c, X( y4 N) b: m0 d5 |
GPIOPinWrite(SOC_GPIO_0_REGS, AD7606_PAR_CONVST, GPIO_PIN_LOW);
3 k7 v* p& b6 ^- X$ q
/ s7 D8 u, R, b7 v
GPIOBankIntEnable(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_GPIO_BANK);
5 s" H: O0 o4 k
}
$ a. T) v$ Z" ]8 f, T' V
8 d+ m' @" V ?1 U& [
i# O) E& Q5 X" Z1 H3 n5 d% n
% A4 q5 o- W0 l4 `, G# j
[attach]1369[/attach]
" x$ ]8 Z% v- p& O* Q
作者:
human
时间:
2016-9-18 19:35
你用单步调试,step into看看相应的函数值是否发生了变化
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4