嵌入式开发者社区
标题:
sysbios hwi 端口识别问题
[打印本页]
作者:
vtinf
时间:
2016-8-31 17:29
标题:
sysbios hwi 端口识别问题
您好。使用GPIO中断时,中断能进入ISR,但是不能区分具体的GPIO端口。程序如下:
% s7 y/ Q( y5 ]# J6 O
#define AD7606_PAR_BUSY_GPIO_BANK 5
5 E3 T2 o) ~, E- B( k1 P9 o! l
#define AD7606_PAR_BUSY_GPIO_BANK_INT SYS_INT_GPIO_B5INT
- `5 ?: e: z9 Q$ y7 E i
( a8 H# R _* h* l$ Y
#define AD7606_PAR_BUSY_V1 GPIO_TO_PIN(5, 11)
//BANK5的中断口5.11
0 i2 W( C6 X' F2 G m1 J1 L9 T
#define AD7606_PAR_BUSY_V2 GPIO_TO_PIN(5, 9)
//BANK5的中断口5.9
1 C* O' J$ E1 R! ^
#define AD7606_PAR_BUSY_C GPIO_TO_PIN(5, 5)
//BANK5的中断口5.5
. B' b4 g/ Z+ u
#define AD7606_PAR_BUSY GPIO_TO_PIN(5, 4)
8 e1 M0 X. R ?7 @3 A. P0 }
" M8 P0 @& P+ I: ~- }& m
#define AD7606_PAR_CONVST GPIO_TO_PIN(5, 1)
6 G' }- Z6 N- d* C
#define AD7606_PAR_RD GPIO_TO_PIN(5, 2)
- b/ b" M+ J# R7 h$ b
#define AD7606_PAR_RESET GPIO_TO_PIN(5, 0)
; Z- n8 o' K) i5 @
% S0 E# T8 m7 ~) |1 s1 ^
/ i7 g% n+ y5 t2 ~5 E7 y+ R
+ O/ L2 L9 V; a1 n! k
static void ad7606_irq_setup(ad7606 *ad) {
% ?# h* Z% r# R3 C D; m
Hwi_Params hwiParams;
! s: R- i8 y% w- j! N* `+ Z% P% Y
Hwi_Handle myHwi;
4 v5 r9 o8 j1 W2 u. S% A# z t
Error_Block eb;
( m" b5 v% V+ c8 Z. e; {& M
8 Y- K5 k& u$ p- ^
Error_init(&eb);
% w' @% q. m% T
Hwi_Params_init(&hwiParams);
4 O7 s; h0 ? x: Q$ e
hwiParams.arg = (unsigned int)ad;
^1 v. O, D( R P% A+ B w
hwiParams.enableInt = FALSE;
2 V3 d, S5 x" z
hwiParams.eventId = SYS_INT_GPIO_B5INT;
; o+ \7 f7 j+ O3 f; ^
hwiParams.priority = 4;
8 Q% Y8 {/ l& i% S: w; m' m' w
myHwi = Hwi_create(8, ad7606_busy_hwi, &hwiParams, &eb);
//注册BANK5中断处理函数
. l3 r7 N; k/ S2 E9 s) T' `1 _2 Y3 v
if (myHwi == NULL)
) [1 L' z5 G3 V# W: {
LOG_FATAL("failed to create hwi");
0 o2 c; ]8 Z7 ~) S1 ~3 L! O! M0 B" ~
( F0 v1 j5 T" l8 z6 s/ P0 l
/* enable both interrupts */
% I. O: h8 c; y/ ^ u; {
Hwi_enableInterrupt(ad->irq_event);
4 m( a; Q/ v! K
}
( n9 Y9 i0 K; W; B& J4 U
) B- H( i1 ~% D
$ a/ p A/ W& f( n
static void ad7606_gpio_pinmux_setup(ad7606 *ad) {
- l& _+ g9 n9 H
volatile unsigned int savePinMux = 0;
: f5 |, {: L: o
//初始化
5.11、5.9 、 5.5为GPIO口
7 ~; f3 Z! q* a V1 B# B4 J
savePinMux = HWREG(SOC_SYSCFG_0_REGS + SYSCFG0_PINMUX(11)) & (~(SYSCFG_PINMUX11_PINMUX11_27_24 | SYSCFG_PINMUX11_PINMUX11_19_16));
% f2 ]' x, g! ?7 e8 s& B
|/ Z* `# i3 t: v
HWREG(SOC_SYSCFG_0_REGS + SYSCFG0_PINMUX(11)) = (PINMUX11_BUSY_V1_ENABLE | PINMUX11_BUSY_V2_ENABLE | savePinMux);
0 j- e% \" L4 H. W
0 @! w% k# f9 A# }( @6 M9 V
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));
. D9 a1 d0 L7 h' z4 G+ h! Y0 l
# s, t- Z- J1 o
HWREG(SOC_SYSCFG_0_REGS + SYSCFG0_PINMUX(12)) = (PINMUX12_RESET_ENABLE | PINMUX12_CONVST_ENABLE | PINMUX12_RD_ENABLE | PINMUX12_BUSY_C_ENABLE | savePinMux);
; r2 X1 c% e3 o0 ]+ C: v+ Q
. O* P( J7 d0 N4 t% R* o, T
}
+ h1 o/ e/ Y' i
3 E9 o7 [4 z% v
+ p5 W7 j& B$ P: ~0 l9 J
static void ad7606_gpio_setup(ad7606 *ad) {
4 m* v4 T2 ]; C7 V. B/ C
/*Set the AD7606_PAR_BUSY to the input mode*/
4 q' G4 Z! Q# ^( i# ^0 I
//初始化
5.11、5.9 、 5.5为中断口
) s2 K! u& Q& q" h; I
GPIODirModeSet(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_V1, GPIO_DIR_INPUT);
3 H: A3 g, f. A7 i" D
GPIODirModeSet(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_V2, GPIO_DIR_INPUT);
$ K6 {8 o. i: K) f( i
GPIODirModeSet(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_C, GPIO_DIR_INPUT);
6 x6 }; M0 p1 c! I# N
//GPIODirModeSet(SOC_GPIO_0_REGS, AD7606_PAR_BUSY, GPIO_DIR_INPUT);
$ \& v8 L B; F$ F8 {. A
/*Set the AD7606_PAR_BUSY to the Falling Edge Interrupt*/
1 Y6 B8 F v" D8 m- g0 P4 \, M
GPIOIntTypeSet(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_V1, GPIO_INT_TYPE_FALLEDGE);
4 f& t( ~# N, ~8 l7 G
GPIOIntTypeSet(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_V2, GPIO_INT_TYPE_FALLEDGE);
+ c; \4 J" }4 f; I& v
GPIOIntTypeSet(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_C, GPIO_INT_TYPE_FALLEDGE);
4 z, b+ ^0 u4 l- x
//GPIOIntTypeSet(SOC_GPIO_0_REGS, AD7606_PAR_BUSY, GPIO_INT_TYPE_FALLEDGE);
* L) o0 T+ {/ @2 z
/*The interrupt setting allows AD7606_PAR_BUSY_GPIO_BANK*/
3 I" o/ z, g% v
GPIOBankIntEnable(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_GPIO_BANK);
d6 O6 A8 P. C8 h \
- | T: K7 S; l
GPIODirModeSet(SOC_GPIO_0_REGS, AD7606_PAR_RESET, GPIO_DIR_OUTPUT);
1 l' e: y! J" a9 z0 p9 K. ]
GPIOPinWrite(SOC_GPIO_0_REGS, AD7606_PAR_RESET, GPIO_PIN_HIGH);
( _/ v0 }. M) s8 x
Task_sleep(1000);
8 o" q* p0 [0 l, _
GPIOPinWrite(SOC_GPIO_0_REGS, AD7606_PAR_RESET, GPIO_PIN_LOW);
; [$ T' d5 F( X+ g
Task_sleep(1000);
' L) v; L4 v. p2 J8 i
9 \/ ~8 f6 ?0 k1 y/ e) c+ Y
/*Set the AD7606_PAR_CONVST to output mode*/
! O3 R3 p5 {+ B
GPIODirModeSet(SOC_GPIO_0_REGS, AD7606_PAR_CONVST, GPIO_DIR_OUTPUT);
s8 E8 |8 \; E {, @& f1 }
GPIOPinWrite(SOC_GPIO_0_REGS, AD7606_PAR_CONVST, GPIO_PIN_LOW);
2 E# z1 K1 C* b t; [
, E( X/ r. C; |2 R" q
GPIODirModeSet(SOC_GPIO_0_REGS, AD7606_PAR_RD, GPIO_DIR_OUTPUT);
' ?4 A3 A9 m W; g: i0 l- n) h. X
GPIOPinWrite(SOC_GPIO_0_REGS, AD7606_PAR_RD, GPIO_PIN_HIGH);
8 i% y# b2 I- y* w! q! v) E' I% j
. c4 m. l# h7 A: s2 |" y# Q: M5 {
}
! \6 R8 t. V6 z3 j9 K
5 o. r& e- n g
9 a) Y/ U3 \# N6 E3 s
static void ad7606_busy_hwi(UArg ad_addr) {
0 ~; \8 c; O* [( a4 _
7 n6 i1 I" w# \" v
! j4 _* t [% X4 [: f
/* Disable the interrupts for pins of bank AD7606_PAR_BUSY in GPIO.*/
8 X) O9 \- m7 f1 q" b
GPIOBankIntDisable(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_GPIO_BANK);
//用仿真器debug,发现程序能进入这里。
a: q% K" _) k" ]6 \6 d, J7 T
( y: w8 W+ R) J+ y& M
if(GPIOPinIntStatus(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_V1) == GPIO_INT_PEND)
, j, R: K7 I& R! b, A
{
' z' [6 ?1 ?& F1 m2 ]* x# z
GPIOPinIntClear(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_V1);
//问题是:用仿真器debug,发现程序不能进入这里。
# e+ K1 k+ m4 I( z8 ?$ @3 K6 H
cs_addr = SOC_EMIFA_CS5_ADDR ;
* ^* i0 s( A3 p( V2 O
internal = 0 ;
0 N, y: w( Y6 p e% H( F& v
int_flag[0] = 1 ;
9 c0 o- | l+ o/ ]3 X) F
}
# L; ^; N: ` i# c7 y/ j2 o
if(GPIOPinIntStatus(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_V2) == GPIO_INT_PEND)
# j) Z' [. b. ~. q
{
' S3 K* z5 `# w. F; L v) z# v+ U
GPIOPinIntClear(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_V2);
//问题是:用仿真器debug,发现程序不能进入这里。
# e- L9 K2 L3 v2 T
cs_addr = SOC_EMIFA_CS4_ADDR ;
4 Y& M7 j. c0 H' q4 x+ |- Q2 J
internal = 6 ;
. M' }" M$ ~) i0 t, @ m
int_flag[1] = 1 ;
0 C: P0 R0 E- w3 s; T3 L, K
}
- l) y2 _4 ^; e! }
if(GPIOPinIntStatus(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_C) == GPIO_INT_PEND)
2 k# V' s; `+ Q1 S
{
+ J+ o+ Q& }. w3 H
GPIOPinIntClear(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_C);
//问题是:用仿真器debug,发现程序不能进入这里。
* I: |) @" G1 o& H
cs_addr = SOC_EMIFA_CS2_ADDR ;
. H1 A* l2 n6 j2 e& d- z
internal = 12 ;
7 F3 Q! Y3 A& U' }, z& O* Z
int_flag[2] = 1 ;
, m* [: C5 b3 Z2 S$ r
}
* W; V1 g6 T. d3 D
- b% x- R- p0 I! _
GPIOPinWrite(SOC_GPIO_0_REGS, AD7606_PAR_CONVST, GPIO_PIN_LOW);
0 [7 T5 B9 c% J& X$ J3 q: u5 g
' B- o8 k* f+ K! a( g
GPIOBankIntEnable(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_GPIO_BANK);
4 z) C* j% K% I; O! a' J, e7 e
}
( ?; M) {+ ?; i: x7 |+ C. N% j
2 ?2 `# d# d2 ?8 O9 `7 {6 B) j
0 r1 ?+ X6 m9 E- \/ a2 Q# b
6 z, z) [3 Y" I
[attach]1369[/attach]
6 o- I& q- [4 Z0 ]
作者:
human
时间:
2016-9-18 19:35
你用单步调试,step into看看相应的函数值是否发生了变化
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4