嵌入式开发者社区

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

作者: vtinf    时间: 2016-8-31 16:23
标题: sysbios hwi 问题
您好。使用GPIO中断时,中断能进入ISR,但是不能区分具体的GPIO端口。程序如下:
; n- @* P8 f5 j4 s#define AD7606_PAR_BUSY_GPIO_BANK        5. B4 h7 Y. J2 g6 c. n4 D
#define AD7606_PAR_BUSY_GPIO_BANK_INT        SYS_INT_GPIO_B5INT
0 H" y% Z5 D3 p& {! i+ u, O- h, M$ ^, ~2 T3 K( o" e' `" [) ~
#define AD7606_PAR_BUSY_V1                        GPIO_TO_PIN(5, 11)   //BANK5的中断口5.11. p, d5 p* P( ]7 u: ?
#define AD7606_PAR_BUSY_V2                        GPIO_TO_PIN(5, 9)    //BANK5的中断口5.9: Q( {$ a' {2 c2 E
#define AD7606_PAR_BUSY_C                        GPIO_TO_PIN(5, 5)    //BANK5的中断口5.5! G4 N2 Z/ }; J. r$ v
#define AD7606_PAR_BUSY                                GPIO_TO_PIN(5, 4)
( F4 u" P( a2 Q, M7 H/ ~0 r$ `4 `+ I  K; `
#define AD7606_PAR_CONVST                        GPIO_TO_PIN(5, 1)
3 h6 D  c0 V5 `# `& V2 E! q3 u& z  D#define AD7606_PAR_RD                                GPIO_TO_PIN(5, 2)
. C# p4 r" \; }0 V* s#define AD7606_PAR_RESET                        GPIO_TO_PIN(5, 0)
* {% D9 b4 @: Q( e( _: u9 W
( v' h3 s& j2 q2 [4 E0 p7 u* H' y6 g$ S( M
+ B$ R2 ?5 T0 m" d# {
static void ad7606_irq_setup(ad7606 *ad) {
1 r0 U1 c- c* W" i! ]        Hwi_Params hwiParams;
1 I3 y* K# _; J' D5 H        Hwi_Handle myHwi;7 @: B; O1 r) C4 ^! F0 R! W# a4 W5 ~
        Error_Block eb;
  n2 Z9 E& e) C" P% o' [
" ?* X; Z$ k2 V( o        Error_init(&eb);
' o8 K  ?( Q1 s* D. Q: J        Hwi_Params_init(&hwiParams);
- Y. V+ q  w; ?( c" K# z6 \        hwiParams.arg = (unsigned int)ad;/ k* A8 g0 r0 ~9 V$ M( m" X$ Z) F
        hwiParams.enableInt = FALSE;
& D9 P$ t8 B' `7 W+ L8 Q$ V        hwiParams.eventId = SYS_INT_GPIO_B5INT;
1 q& t  k" s- f        hwiParams.priority = 4;
6 g1 `# J/ Q) P5 c  o! M0 A3 H        myHwi = Hwi_create(8, ad7606_busy_hwi, &hwiParams, &eb);       //注册BANK5中断处理函数
5 _* M& ?0 I2 w5 d5 a( S3 K        if (myHwi == NULL)
! K7 f9 S- S% L! k. O; i5 ~        LOG_FATAL("failed to create hwi");
' T! ]0 H. k, ~, e# ~* n! d- N8 b* V9 B- a
        /* enable both interrupts */; S1 l- o9 A( w
        Hwi_enableInterrupt(ad->irq_event);5 j2 O6 `0 [! k/ T) \
}3 ?+ s' P: y: u0 M+ ^# W+ d

& R4 {8 n* o0 `3 C3 h4 m% C# f7 }' \2 Q0 b6 D
static void ad7606_gpio_pinmux_setup(ad7606 *ad) {
, C/ d. j" F0 W- U, T& l2 y        volatile unsigned int savePinMux = 0;; T" q( g. q8 K
        //初始化5.11、5.9 、 5.5为GPIO口
4 |9 C6 h# ]2 u" T5 S. v) P        savePinMux = HWREG(SOC_SYSCFG_0_REGS + SYSCFG0_PINMUX(11)) & (~(SYSCFG_PINMUX11_PINMUX11_27_24 | SYSCFG_PINMUX11_PINMUX11_19_16));, w' l- }% {4 J
% A. g: c4 c1 Z) \& }
        HWREG(SOC_SYSCFG_0_REGS + SYSCFG0_PINMUX(11)) =        (PINMUX11_BUSY_V1_ENABLE | PINMUX11_BUSY_V2_ENABLE | savePinMux);$ J8 E8 l: j9 M0 K4 t0 B/ H
1 _, Y* h% h4 W: E
        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));/ w8 K5 z6 Z+ ?4 Y* G/ h3 x; P& c

: X+ w2 Y$ }, U3 d, N* C* V        HWREG(SOC_SYSCFG_0_REGS + SYSCFG0_PINMUX(12)) =        (PINMUX12_RESET_ENABLE | PINMUX12_CONVST_ENABLE | PINMUX12_RD_ENABLE | PINMUX12_BUSY_C_ENABLE | savePinMux);
& j, H' z/ R( Z8 y5 r; {9 O4 a3 I, N% S5 w* T) c) I2 ~* r; l3 ~
}
8 F) ?4 \% w5 D& `
& }8 [7 O0 |0 X3 X; v9 d* H: I, Z, e+ @; t( V9 M
static void ad7606_gpio_setup(ad7606 *ad) {) B3 M/ O: q; A% J
        /*Set the AD7606_PAR_BUSY to the input mode*/
6 i7 u/ `' a- N        //初始化5.11、5.9 、 5.5为中断口
" F1 M! q$ V. R: ^8 q4 P7 \  x        GPIODirModeSet(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_V1, GPIO_DIR_INPUT);
+ D+ L6 s, y8 O        GPIODirModeSet(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_V2, GPIO_DIR_INPUT);
3 Y6 M5 t& b  X6 _        GPIODirModeSet(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_C, GPIO_DIR_INPUT);! U0 j/ S( P5 j. O, I
        //GPIODirModeSet(SOC_GPIO_0_REGS, AD7606_PAR_BUSY, GPIO_DIR_INPUT);
6 v& S. N% _( C  k6 }$ i4 P        /*Set the AD7606_PAR_BUSY to the Falling Edge Interrupt*/: J; {4 h/ D, e( c% `; Z: t/ ~
        GPIOIntTypeSet(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_V1, GPIO_INT_TYPE_FALLEDGE);
" r6 a/ Z& X: V# |        GPIOIntTypeSet(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_V2, GPIO_INT_TYPE_FALLEDGE);6 P: o: @& O( K5 b7 B2 }( h
        GPIOIntTypeSet(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_C, GPIO_INT_TYPE_FALLEDGE);& l$ E; b& `6 m
        //GPIOIntTypeSet(SOC_GPIO_0_REGS, AD7606_PAR_BUSY, GPIO_INT_TYPE_FALLEDGE);
- U8 q& y* `7 q8 N) c8 X8 V/ R        /*The interrupt setting allows AD7606_PAR_BUSY_GPIO_BANK*/8 [0 P$ Q6 d: o  }
        GPIOBankIntEnable(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_GPIO_BANK);8 X" k# z. M8 k( n3 z3 @

" |" G* z4 X0 O( d* C6 b& c        GPIODirModeSet(SOC_GPIO_0_REGS, AD7606_PAR_RESET, GPIO_DIR_OUTPUT);: Y* d! [9 n2 ?+ k
        GPIOPinWrite(SOC_GPIO_0_REGS, AD7606_PAR_RESET, GPIO_PIN_HIGH);
5 f3 _- _& O) A        Task_sleep(1000);
$ Q, B# s1 d+ p8 Q3 i& j9 ?        GPIOPinWrite(SOC_GPIO_0_REGS, AD7606_PAR_RESET, GPIO_PIN_LOW);7 t. Q5 M7 y" s+ Y  j0 v; |
        Task_sleep(1000);4 F3 s* r9 b" t0 s: e$ e2 u8 U
4 h$ ^8 q- c: ?% b
        /*Set the AD7606_PAR_CONVST to output mode*/1 I& `3 o3 t5 t# P. [
        GPIODirModeSet(SOC_GPIO_0_REGS, AD7606_PAR_CONVST, GPIO_DIR_OUTPUT);
; `, j3 T" N, Z        GPIOPinWrite(SOC_GPIO_0_REGS, AD7606_PAR_CONVST, GPIO_PIN_LOW);; c7 R" J/ r/ \
* `$ V# t6 ]- h2 Z6 Y/ g# _
        GPIODirModeSet(SOC_GPIO_0_REGS, AD7606_PAR_RD, GPIO_DIR_OUTPUT);7 _1 G+ H7 w& @& z, Z3 X) r9 F+ [
        GPIOPinWrite(SOC_GPIO_0_REGS, AD7606_PAR_RD, GPIO_PIN_HIGH);# e4 V" i0 c5 Q+ k

, B- S9 S9 u+ t}+ ^- j) M* V1 r' b. |) N

% j( I2 w# e8 k' l0 Q# {% b4 L% Z, m6 Y, e9 i
static void ad7606_busy_hwi(UArg ad_addr) {, s3 C5 ^( S1 J
! v8 ]; u6 l# X: [+ L

7 G/ L6 k: ~: w7 d        /* Disable the interrupts for pins of bank AD7606_PAR_BUSY in GPIO.*/) \. w0 k9 r8 ^4 U7 z% c
        GPIOBankIntDisable(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_GPIO_BANK);      //用仿真器debug,发现程序能进入这里。
& @: h' |1 G0 z. P( B3 _0 z( V5 Q3 |7 t9 |! W
        if(GPIOPinIntStatus(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_V1) == GPIO_INT_PEND)9 G5 w% J) }0 O- s0 Q7 s; J; I
        {
+ s9 u; V# e* t7 m: k                GPIOPinIntClear(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_V1);                    //问题是:用仿真器debug,发现程序不能进入这里。4 C+ ^0 c! k) _
                cs_addr = SOC_EMIFA_CS5_ADDR ;3 m5 v% a  B- e& L3 `* x% ?
                internal = 0 ;
3 a3 d- Y- c7 t; W! H+ P2 {                int_flag[0] = 1 ;# [  o1 F- S. S: x, a; U. R6 w
        }
3 o+ |7 W4 |# H2 N        if(GPIOPinIntStatus(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_V2) == GPIO_INT_PEND)) U. w/ S: Z% {! f; L  C' v* s: V
        {1 x$ r. _7 d7 ^) o& v
                GPIOPinIntClear(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_V2); //问题是:用仿真器debug,发现程序不能进入这里。' D, f: I7 W, T( b& b' G
                cs_addr = SOC_EMIFA_CS4_ADDR ;
1 \" \9 R& q! f9 R: q) N5 l                internal = 6 ;& j. a: ]1 N: V$ ?$ R: I
                int_flag[1] = 1 ;1 f8 o( p6 d" T1 l" I) Z! M" h
        }
* E% ?+ J; z; X) p        if(GPIOPinIntStatus(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_C) == GPIO_INT_PEND)+ N0 @3 J4 [! }
        {
2 L! G3 l& Y; `                GPIOPinIntClear(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_C); //问题是:用仿真器debug,发现程序不能进入这里。
( A& q, E9 G5 ]' O                cs_addr = SOC_EMIFA_CS2_ADDR ;
) X# [! t+ d* V1 T. l! q# @& ]                internal = 12 ;0 z* x$ E/ J" s9 a" f3 h, }
                int_flag[2] = 1 ;) d% Z9 F" y. ]# n! \
        }
. m  s& I( `0 w: q  i. M6 ]4 o  0 L. [9 `  C9 h
        GPIOPinWrite(SOC_GPIO_0_REGS, AD7606_PAR_CONVST, GPIO_PIN_LOW);, G2 X, L1 p/ K5 ^
      
2 V2 ?- w7 ?0 ]$ S. z7 |        GPIOBankIntEnable(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_GPIO_BANK);7 ?8 v5 R# I- q9 k- [
}
8 ?% O! ~( c/ e% i% x  G2 z1 ?) }+ i8 t+ ?5 A

作者: vtinf    时间: 2016-8-31 16:53
INTSTAT45状态如图
0 r. ~% B$ l" i[attach]1368[/attach]
6 b& `1 R$ F, c# H5 y




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