嵌入式开发者社区

标题: 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.96 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 hstatic 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 vstatic 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* Rstatic 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 N1 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 M6 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