嵌入式开发者社区

标题: sysbios hwi 问题 [打印本页]

作者: vtinf    时间: 2016-8-31 16:23
标题: sysbios hwi 问题
您好。使用GPIO中断时,中断能进入ISR,但是不能区分具体的GPIO端口。程序如下:/ B2 f3 m6 I; f, L
#define AD7606_PAR_BUSY_GPIO_BANK        5" G  h, T6 r0 k; [. N* M. c. g
#define AD7606_PAR_BUSY_GPIO_BANK_INT        SYS_INT_GPIO_B5INT, r1 q  Q7 ]" C! z1 |7 |
3 {8 X- Q; n+ D8 `9 Q+ l! \6 t4 n
#define AD7606_PAR_BUSY_V1                        GPIO_TO_PIN(5, 11)   //BANK5的中断口5.11! z. P+ O6 n/ f/ t+ L
#define AD7606_PAR_BUSY_V2                        GPIO_TO_PIN(5, 9)    //BANK5的中断口5.9! l1 f) S' k' F! _" \
#define AD7606_PAR_BUSY_C                        GPIO_TO_PIN(5, 5)    //BANK5的中断口5.5
# r+ x4 W7 \8 G' u$ p+ K3 n! h; L#define AD7606_PAR_BUSY                                GPIO_TO_PIN(5, 4)9 _; Z6 {5 g$ C
8 C9 X) }: {3 L' i
#define AD7606_PAR_CONVST                        GPIO_TO_PIN(5, 1)
, T9 F, J9 p* V: ~% \( x* C#define AD7606_PAR_RD                                GPIO_TO_PIN(5, 2)
1 Z9 m% I( o( Z& b& v& X#define AD7606_PAR_RESET                        GPIO_TO_PIN(5, 0)
: d# F* u6 O4 I3 A! J  m% C( {7 |8 b

0 z3 o, k* s, t9 d' N0 w6 T. a, ^
; c( X6 b8 u" w+ o& ?& v$ Vstatic void ad7606_irq_setup(ad7606 *ad) {; _) s3 C2 \/ e4 h5 w+ `
        Hwi_Params hwiParams;
& {' z9 q* \6 x: A: q        Hwi_Handle myHwi;# Z& N0 k7 Y0 t; S, m8 ?( o
        Error_Block eb;
* S" a; ~. z  G; B+ t
% s% Q( T' Q1 K& R        Error_init(&eb);
+ l2 u. G$ ]3 b$ n4 u: L        Hwi_Params_init(&hwiParams);
$ u- a( i  ^" ]        hwiParams.arg = (unsigned int)ad;
. \% ~( c7 g$ ]' g6 G        hwiParams.enableInt = FALSE;
/ a0 R3 z! Q0 u9 _' k        hwiParams.eventId = SYS_INT_GPIO_B5INT;
& Y" \% S; o* Z; s' R        hwiParams.priority = 4;
! ~6 n4 @8 v7 Y        myHwi = Hwi_create(8, ad7606_busy_hwi, &hwiParams, &eb);       //注册BANK5中断处理函数+ J+ H( ?1 R( F' }/ b% B$ ^+ x
        if (myHwi == NULL)
7 j7 n6 A! K7 M3 j7 r        LOG_FATAL("failed to create hwi");4 f2 a2 t3 a# {

: n4 A7 v8 ?/ Q" v        /* enable both interrupts */7 P6 _5 i8 |0 Q& i" H& Q7 y
        Hwi_enableInterrupt(ad->irq_event);6 [; `' R0 e$ P0 `; c7 M' T% v# l
}
2 \2 J. B' j$ ~0 G  \3 R7 c$ c6 {6 H5 A) N" b0 J2 F

+ l* Z4 D7 Y: X* x9 Pstatic void ad7606_gpio_pinmux_setup(ad7606 *ad) {. E0 Q8 \1 }9 r1 c5 C/ |9 J
        volatile unsigned int savePinMux = 0;+ d  `$ O$ o4 F/ d+ b  S# u6 t% C
        //初始化5.11、5.9 、 5.5为GPIO口
# \. K& i: X* }2 ~        savePinMux = HWREG(SOC_SYSCFG_0_REGS + SYSCFG0_PINMUX(11)) & (~(SYSCFG_PINMUX11_PINMUX11_27_24 | SYSCFG_PINMUX11_PINMUX11_19_16));
8 k5 d* p7 K6 G- Q
8 z$ x$ W$ x% F6 B0 H        HWREG(SOC_SYSCFG_0_REGS + SYSCFG0_PINMUX(11)) =        (PINMUX11_BUSY_V1_ENABLE | PINMUX11_BUSY_V2_ENABLE | savePinMux);
" d: i5 E; m" ^) c: _" u2 _& n% ~. J
        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));
1 m; W7 r- p& O/ S6 b3 P% B
* K9 t" C2 d2 f- v- X2 ~/ q        HWREG(SOC_SYSCFG_0_REGS + SYSCFG0_PINMUX(12)) =        (PINMUX12_RESET_ENABLE | PINMUX12_CONVST_ENABLE | PINMUX12_RD_ENABLE | PINMUX12_BUSY_C_ENABLE | savePinMux);
2 g  `( f9 N) v# x7 b' b
( X0 b) p0 _6 y3 X. W0 Y}- v9 W, `: H/ x8 v4 Y
- e' E; S1 }; F6 z

$ m5 h7 B( ]) p+ z0 X0 Xstatic void ad7606_gpio_setup(ad7606 *ad) {
4 U6 l8 Q% b* I0 \! \8 w3 d        /*Set the AD7606_PAR_BUSY to the input mode*/
# d& _, U5 g* J# s3 \        //初始化5.11、5.9 、 5.5为中断口# `, r8 U  _  P! q
        GPIODirModeSet(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_V1, GPIO_DIR_INPUT);
  G+ L9 S7 |! S7 s; ~        GPIODirModeSet(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_V2, GPIO_DIR_INPUT);
) K% A& l( u6 E! ^( v8 M        GPIODirModeSet(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_C, GPIO_DIR_INPUT);
8 X. w+ f: A9 K1 O& [        //GPIODirModeSet(SOC_GPIO_0_REGS, AD7606_PAR_BUSY, GPIO_DIR_INPUT);
+ C) Z& r! v% B# A9 I        /*Set the AD7606_PAR_BUSY to the Falling Edge Interrupt*/
  x, i3 Y& i6 L) `( j2 w        GPIOIntTypeSet(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_V1, GPIO_INT_TYPE_FALLEDGE);
' i- K. n+ I2 q/ o6 q. e- s6 Q" E        GPIOIntTypeSet(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_V2, GPIO_INT_TYPE_FALLEDGE);
0 Z0 c) w( w6 T        GPIOIntTypeSet(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_C, GPIO_INT_TYPE_FALLEDGE);, w, L+ B9 W  |
        //GPIOIntTypeSet(SOC_GPIO_0_REGS, AD7606_PAR_BUSY, GPIO_INT_TYPE_FALLEDGE);8 f. N; f5 P+ @4 Z" ~8 T+ o
        /*The interrupt setting allows AD7606_PAR_BUSY_GPIO_BANK*/
; I3 B: @( ?' m/ d( H% T; W        GPIOBankIntEnable(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_GPIO_BANK);' Y( p  L2 x6 v: Y9 {7 j3 p

- \2 a6 W( y, r+ r8 d8 ~        GPIODirModeSet(SOC_GPIO_0_REGS, AD7606_PAR_RESET, GPIO_DIR_OUTPUT);4 ?3 L& v: o! S
        GPIOPinWrite(SOC_GPIO_0_REGS, AD7606_PAR_RESET, GPIO_PIN_HIGH);
* n5 l! Z$ N9 ]        Task_sleep(1000);6 G' {, E* P" [6 o$ K7 \
        GPIOPinWrite(SOC_GPIO_0_REGS, AD7606_PAR_RESET, GPIO_PIN_LOW);
: ^% B4 Y1 q! t: N% M2 t% i* N9 U8 E        Task_sleep(1000);! o! E# O8 `1 L5 H

2 f. K2 p. L8 P4 A: D% d3 S) D+ u        /*Set the AD7606_PAR_CONVST to output mode*/3 T8 ~; W- b/ D
        GPIODirModeSet(SOC_GPIO_0_REGS, AD7606_PAR_CONVST, GPIO_DIR_OUTPUT);
6 Q7 T; |7 O: M( z* Z. L        GPIOPinWrite(SOC_GPIO_0_REGS, AD7606_PAR_CONVST, GPIO_PIN_LOW);
0 f6 K% p6 P6 ]; `, W( z
8 j7 K  J1 I4 F) q$ t/ _        GPIODirModeSet(SOC_GPIO_0_REGS, AD7606_PAR_RD, GPIO_DIR_OUTPUT);
# |7 e- a0 e& e1 w/ K9 u        GPIOPinWrite(SOC_GPIO_0_REGS, AD7606_PAR_RD, GPIO_PIN_HIGH);
3 r( l  U' K3 f: B1 j% |' O* L7 W  ~5 n# ?8 c0 B# h
}4 K4 \+ K; z6 e& F7 a' i# O* m

" {0 {* K: @5 ?! a% L& h3 o& X, I* K$ O
static void ad7606_busy_hwi(UArg ad_addr) {2 L( e4 C0 p0 q2 I
: P& E$ f/ c% c$ t% M7 `/ |
+ B1 m/ v; h( }+ G) z* D+ M- w
        /* Disable the interrupts for pins of bank AD7606_PAR_BUSY in GPIO.*/: ^* Z0 a( H1 T0 k
        GPIOBankIntDisable(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_GPIO_BANK);      //用仿真器debug,发现程序能进入这里。+ r  s: r" F. h" |; P1 M% r: W
& W1 D' z& W2 p9 r
        if(GPIOPinIntStatus(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_V1) == GPIO_INT_PEND)" ~1 y' w9 V! ?8 c
        {
# T4 s+ a, P4 c. E% Z! T: k- {                GPIOPinIntClear(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_V1);                    //问题是:用仿真器debug,发现程序不能进入这里。
  U/ e4 p# m: V# e! V/ W% ?                cs_addr = SOC_EMIFA_CS5_ADDR ;
1 k8 z& l  ~( B& G5 c                internal = 0 ;
# {4 ^8 K( |0 u. I" y                int_flag[0] = 1 ;
/ L' z" L, Q$ L/ p9 i        }3 a, P+ Y+ P) B
        if(GPIOPinIntStatus(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_V2) == GPIO_INT_PEND)
& R. p+ u5 A- K0 V        {( l' h% d" L; A8 N7 m; S% q# \
                GPIOPinIntClear(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_V2); //问题是:用仿真器debug,发现程序不能进入这里。" |$ Q5 x* h$ R7 g
                cs_addr = SOC_EMIFA_CS4_ADDR ;( e! u& n/ Z8 i$ H7 U, h: w. T' z
                internal = 6 ;$ X4 j" k6 ~7 M0 o& w) l
                int_flag[1] = 1 ;( R' e/ M, O& V7 u3 m  D
        }
6 y/ P' T1 O% n        if(GPIOPinIntStatus(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_C) == GPIO_INT_PEND)9 f6 P) r) v9 L1 j# \$ g
        {
3 F' r0 |( w: V; @4 \  ^                GPIOPinIntClear(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_C); //问题是:用仿真器debug,发现程序不能进入这里。2 r1 r7 Q5 O2 A! ~1 w+ V  u5 S/ g
                cs_addr = SOC_EMIFA_CS2_ADDR ;
$ f" Q, x& a' z7 E4 b                internal = 12 ;
1 H+ A1 x* M2 ~2 p- [2 b2 X5 K                int_flag[2] = 1 ;
) Z7 _+ M& A% H' E' n        }
5 }- T, q! q' t; V  
* x: {  m( ?/ @) S! E+ j0 C        GPIOPinWrite(SOC_GPIO_0_REGS, AD7606_PAR_CONVST, GPIO_PIN_LOW);
. Z! M- @, ^( y, e8 G2 p0 d       7 z- {$ ?0 x  e5 t5 h* b
        GPIOBankIntEnable(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_GPIO_BANK);
, P7 Y6 F( p) M9 _- K8 C2 k# O7 W7 U; c}
; Q! I7 l* o9 X/ U0 w
6 n! n- [6 a, {1 G/ M, m
作者: vtinf    时间: 2016-8-31 16:53
INTSTAT45状态如图  u) m8 t2 _9 m' j4 s. g. X% v4 i
[attach]1368[/attach]
5 u9 ~& r! z' U9 \* J1 I




欢迎光临 嵌入式开发者社区 (https://www.51ele.net/) Powered by Discuz! X3.4