嵌入式开发者社区
标题:
sysbios hwi 问题
[打印本页]
作者:
vtinf
时间:
2016-8-31 16:23
标题:
sysbios hwi 问题
您好。使用GPIO中断时,中断能进入ISR,但是不能区分具体的GPIO端口。程序如下:
" ~' M$ J9 S* U8 F9 h( k2 S
#define AD7606_PAR_BUSY_GPIO_BANK 5
" p6 D: K3 o- [2 u5 I% }4 _6 b
#define AD7606_PAR_BUSY_GPIO_BANK_INT SYS_INT_GPIO_B5INT
: l8 D6 C" X9 W
) b& m0 X$ E3 b! A0 C# D `
#define AD7606_PAR_BUSY_V1 GPIO_TO_PIN(5, 11)
//BANK5的中断口5.11
- P; w! j. L3 g$ c. n" M3 N
#define AD7606_PAR_BUSY_V2 GPIO_TO_PIN(5, 9)
//BANK5的中断口5.9
6 y; y4 E! z& p; \4 b
#define AD7606_PAR_BUSY_C GPIO_TO_PIN(5, 5)
//BANK5的中断口5.5
8 }# I/ R# }0 X/ j" D8 B7 k' Q- i
#define AD7606_PAR_BUSY GPIO_TO_PIN(5, 4)
+ b* m/ q; c/ d
1 ?7 q9 `3 n% Z9 Q$ c7 P% ^! y
#define AD7606_PAR_CONVST GPIO_TO_PIN(5, 1)
% Y- d- p, L2 v2 N: i) y
#define AD7606_PAR_RD GPIO_TO_PIN(5, 2)
1 M' P2 O' m' j4 F6 U7 V+ X
#define AD7606_PAR_RESET GPIO_TO_PIN(5, 0)
8 @' s5 U) A6 [, k* t6 x
, ]2 K; [6 n8 l: k3 {
* w+ F$ e/ f2 F. z+ d
7 e5 N2 l" O1 K6 h
static void ad7606_irq_setup(ad7606 *ad) {
~& W% [. m4 n% s# T" Y
Hwi_Params hwiParams;
" j7 o9 @% L' S: Z7 D( ^, u
Hwi_Handle myHwi;
5 Z2 Q' ?- S- W2 }( s
Error_Block eb;
! R2 C. n& F$ ^4 ^ E$ R C
( i3 y0 m/ n$ _/ `3 z
Error_init(&eb);
j S. f. u! f* v
Hwi_Params_init(&hwiParams);
. d. c6 c1 r G
hwiParams.arg = (unsigned int)ad;
* s) | y5 y; b0 I# l# f6 J m" y
hwiParams.enableInt = FALSE;
7 U5 a& \% } A) i; }
hwiParams.eventId = SYS_INT_GPIO_B5INT;
, C0 F; b" H' W1 y
hwiParams.priority = 4;
: y5 u- L2 |3 A2 B$ z9 O( W
myHwi = Hwi_create(8, ad7606_busy_hwi, &hwiParams, &eb);
//注册BANK5中断处理函数
8 D% f2 p: a0 W. t) ~7 w/ _
if (myHwi == NULL)
1 m: q" v- O0 m0 f' W: D
LOG_FATAL("failed to create hwi");
& k: _; U/ R' G, R5 R
1 S! @% [$ B3 P" _+ ]
/* enable both interrupts */
}4 }1 A3 Q" G, o8 D
Hwi_enableInterrupt(ad->irq_event);
7 B6 B' @6 f# p$ q( Z" U
}
" T$ D/ ?/ r1 \- q
: m9 l2 g& Y9 Y- Z6 ^7 Q, z N
) f8 y- n2 F+ @) o" ]
static void ad7606_gpio_pinmux_setup(ad7606 *ad) {
+ q. L- p) a- o! m4 F7 q G3 {
volatile unsigned int savePinMux = 0;
) B2 c t5 v: b" Q: Y
//初始化
5.11、5.9 、 5.5为GPIO口
* h& v% k! m8 \
savePinMux = HWREG(SOC_SYSCFG_0_REGS + SYSCFG0_PINMUX(11)) & (~(SYSCFG_PINMUX11_PINMUX11_27_24 | SYSCFG_PINMUX11_PINMUX11_19_16));
/ j& y8 |: C. z7 S
% v1 P: M; I5 P- a$ V, s
HWREG(SOC_SYSCFG_0_REGS + SYSCFG0_PINMUX(11)) = (PINMUX11_BUSY_V1_ENABLE | PINMUX11_BUSY_V2_ENABLE | savePinMux);
! |+ {* k. L; v3 I2 ^$ K
; r) C9 r2 ^- Y; e+ w) z
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));
: d$ g0 L( h: @. D l
# N7 ?3 D" N% }2 ]+ d& x3 }
HWREG(SOC_SYSCFG_0_REGS + SYSCFG0_PINMUX(12)) = (PINMUX12_RESET_ENABLE | PINMUX12_CONVST_ENABLE | PINMUX12_RD_ENABLE | PINMUX12_BUSY_C_ENABLE | savePinMux);
$ u8 p# s6 W/ c3 f% U) _
$ N8 X l: @ ^9 j9 g: o5 J
}
/ j) a* l1 X: N) c: }
' `) V, K5 B+ m% i9 z
. z' o8 y% l6 x4 v
static void ad7606_gpio_setup(ad7606 *ad) {
! I, L2 i: m+ P
/*Set the AD7606_PAR_BUSY to the input mode*/
3 n3 l& @4 a$ K9 s
//初始化
5.11、5.9 、 5.5为中断口
0 i; C H, e% q
GPIODirModeSet(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_V1, GPIO_DIR_INPUT);
2 D7 P, _0 O4 x: h' [# I" ^
GPIODirModeSet(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_V2, GPIO_DIR_INPUT);
& l% Y. w5 Q' _% x( n! R
GPIODirModeSet(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_C, GPIO_DIR_INPUT);
7 p: @7 } [0 H9 q) H" ?
//GPIODirModeSet(SOC_GPIO_0_REGS, AD7606_PAR_BUSY, GPIO_DIR_INPUT);
. }$ W( ^8 u( g. `
/*Set the AD7606_PAR_BUSY to the Falling Edge Interrupt*/
; y: k% b3 O8 T4 ^' w) ]
GPIOIntTypeSet(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_V1, GPIO_INT_TYPE_FALLEDGE);
; C' ]; k8 B' C3 n: y9 m
GPIOIntTypeSet(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_V2, GPIO_INT_TYPE_FALLEDGE);
0 ~- G( @. U6 t% ^& o
GPIOIntTypeSet(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_C, GPIO_INT_TYPE_FALLEDGE);
4 x5 J; E: T; Q; d" ]; m- I
//GPIOIntTypeSet(SOC_GPIO_0_REGS, AD7606_PAR_BUSY, GPIO_INT_TYPE_FALLEDGE);
/ F! s# c" U' D# O, ~5 h7 F
/*The interrupt setting allows AD7606_PAR_BUSY_GPIO_BANK*/
. \3 F \+ A8 @7 c* D7 L* h
GPIOBankIntEnable(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_GPIO_BANK);
/ A, F' s0 {0 r; `$ v1 b) f
+ B/ e8 |/ }0 H2 V" Y3 ~
GPIODirModeSet(SOC_GPIO_0_REGS, AD7606_PAR_RESET, GPIO_DIR_OUTPUT);
, k6 d/ z$ \) B9 r! E& c
GPIOPinWrite(SOC_GPIO_0_REGS, AD7606_PAR_RESET, GPIO_PIN_HIGH);
8 ^2 _3 X* B9 R" [: |; X
Task_sleep(1000);
4 j, g/ o$ Y7 a$ i" Q8 z
GPIOPinWrite(SOC_GPIO_0_REGS, AD7606_PAR_RESET, GPIO_PIN_LOW);
& g8 V; Q& O* ?7 q# F1 t4 z4 B
Task_sleep(1000);
3 h5 @1 N6 u% s
& |8 y7 r2 o& Z
/*Set the AD7606_PAR_CONVST to output mode*/
5 x Y4 G# g/ s( R' g
GPIODirModeSet(SOC_GPIO_0_REGS, AD7606_PAR_CONVST, GPIO_DIR_OUTPUT);
. i! ]4 H; I9 |% }
GPIOPinWrite(SOC_GPIO_0_REGS, AD7606_PAR_CONVST, GPIO_PIN_LOW);
- y. A' p& V# E; Q7 n% l3 R
/ u, K0 D7 T) @& ?4 A
GPIODirModeSet(SOC_GPIO_0_REGS, AD7606_PAR_RD, GPIO_DIR_OUTPUT);
8 n% b4 `& C& [+ l, J$ J+ M
GPIOPinWrite(SOC_GPIO_0_REGS, AD7606_PAR_RD, GPIO_PIN_HIGH);
3 u R+ t( W. K% [/ Y
( i, p2 }3 r# U
}
2 S/ l2 y8 Z! {% c& c' s; J
* b! H {4 ]- A6 [9 }6 @1 [% D( K
' F% _9 b2 L8 f* R
static void ad7606_busy_hwi(UArg ad_addr) {
2 J( f* g6 M& g% n. Z* E( P; f
0 e1 H9 Q8 x8 u5 E1 N
1 Q/ E# z+ m/ x5 y
/* Disable the interrupts for pins of bank AD7606_PAR_BUSY in GPIO.*/
& L6 ^- W$ V4 k9 E) O
GPIOBankIntDisable(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_GPIO_BANK);
//用仿真器debug,发现程序能进入这里。
( t" Y$ t/ S0 x+ p
# ?( p( J3 H$ b# K; k3 G4 D
if(GPIOPinIntStatus(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_V1) == GPIO_INT_PEND)
2 a6 a8 p( q5 Y6 [
{
# l5 Y7 w- F8 n. l# t
GPIOPinIntClear(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_V1);
//问题是:用仿真器debug,发现程序不能进入这里。
5 _6 }; `& v' T2 J" G0 q& e2 c
cs_addr = SOC_EMIFA_CS5_ADDR ;
$ J- ]$ S0 i* ~* i- Y0 \2 N1 F
internal = 0 ;
. \3 ~0 g; ? i5 H/ W9 |5 H6 ]
int_flag[0] = 1 ;
1 M& X) R: X1 N/ B" [3 @
}
* s: I: {- Z/ o' X# e( X9 X
if(GPIOPinIntStatus(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_V2) == GPIO_INT_PEND)
$ e. t8 z& L$ E. Y5 a
{
( r1 j* i; ` L! Z- u. e
GPIOPinIntClear(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_V2);
//问题是:用仿真器debug,发现程序不能进入这里。
! b8 { I$ X+ }4 U2 d9 X) D
cs_addr = SOC_EMIFA_CS4_ADDR ;
4 d3 q7 v, `# [6 {2 ^4 t
internal = 6 ;
* d6 a+ Z& ^4 Y
int_flag[1] = 1 ;
7 J' w% d( q" ?$ ]! L
}
2 ~1 b2 ^+ O9 K: D- C4 d- j" G
if(GPIOPinIntStatus(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_C) == GPIO_INT_PEND)
0 S& z8 ^' Y8 ^4 y( l: r
{
3 E0 p( \! v& M3 y/ C* Q
GPIOPinIntClear(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_C);
//问题是:用仿真器debug,发现程序不能进入这里。
6 Z- @6 |. k* Z* `- i, i+ H1 u
cs_addr = SOC_EMIFA_CS2_ADDR ;
# Z1 x( F- y, ~7 z1 H+ e5 p
internal = 12 ;
% u" M- m- f G" F% h
int_flag[2] = 1 ;
9 Q0 _$ ~5 i: ^7 K0 v, W9 T
}
5 N6 M8 p6 e; y2 H4 t
% W* I, f8 P; X" N9 E# R
GPIOPinWrite(SOC_GPIO_0_REGS, AD7606_PAR_CONVST, GPIO_PIN_LOW);
& S7 _! w9 _5 j/ f
1 i" j9 b' w; }0 M/ N; `
GPIOBankIntEnable(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_GPIO_BANK);
) s6 g' e7 O# Z+ c' W: F
}
! g- t4 n- K1 h" ?8 U- q7 f! j1 M
6 z) k9 T z- H+ Y1 u
作者:
vtinf
时间:
2016-8-31 16:53
INTSTAT45状态如图
' K3 i$ Y) M2 Z; O
[attach]1368[/attach]
3 I1 r( f1 K/ l
欢迎光临 嵌入式开发者社区 (https://www.51ele.net/)
Powered by Discuz! X3.4