嵌入式开发者社区

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

作者: vtinf    时间: 2016-8-31 16:23
标题: sysbios hwi 问题
您好。使用GPIO中断时,中断能进入ISR,但是不能区分具体的GPIO端口。程序如下:
  ~$ O- k; e: g5 E#define AD7606_PAR_BUSY_GPIO_BANK        5
% ~4 E' x! K# H( {#define AD7606_PAR_BUSY_GPIO_BANK_INT        SYS_INT_GPIO_B5INT: V8 \1 S7 s# `1 t

6 J' n' P& l( ]' ~9 [# ?#define AD7606_PAR_BUSY_V1                        GPIO_TO_PIN(5, 11)   //BANK5的中断口5.11
) \# ^& S) D4 `7 ^/ H& g#define AD7606_PAR_BUSY_V2                        GPIO_TO_PIN(5, 9)    //BANK5的中断口5.9
2 c* s/ G! p5 U/ m* }  ^6 h#define AD7606_PAR_BUSY_C                        GPIO_TO_PIN(5, 5)    //BANK5的中断口5.5- X2 h) |8 `4 E1 |# g
#define AD7606_PAR_BUSY                                GPIO_TO_PIN(5, 4): V2 o5 C  e  n; n5 P6 ?5 M! ]

# @* M/ h% v% b  W#define AD7606_PAR_CONVST                        GPIO_TO_PIN(5, 1)
' `9 V  u. w- h8 K#define AD7606_PAR_RD                                GPIO_TO_PIN(5, 2)  u/ o2 V& Q" S; E
#define AD7606_PAR_RESET                        GPIO_TO_PIN(5, 0)1 K; Y& P8 u6 t! I
% Y( X$ h2 v; l( Y, t2 ]  _

) W5 \0 B8 \3 a% Y* L
2 _' x4 J. ?9 ^8 R/ Dstatic void ad7606_irq_setup(ad7606 *ad) {
, V" A1 L3 i: c        Hwi_Params hwiParams;( M. F# I- B3 q9 _4 ~! G" `
        Hwi_Handle myHwi;* R2 m- i0 Z# _
        Error_Block eb;; [# ~5 l+ f) ~, b/ h2 c6 u; s

' H4 t1 Y6 n6 `8 i3 Y6 E0 m        Error_init(&eb);) b: s6 [; r/ ], j
        Hwi_Params_init(&hwiParams);
9 Z3 m! y9 Y; ?' R. x) ^        hwiParams.arg = (unsigned int)ad;
3 Z4 n7 T9 n: b# Y        hwiParams.enableInt = FALSE;) q# _9 P* Y; \  G, S3 ?& P5 U. ~
        hwiParams.eventId = SYS_INT_GPIO_B5INT;
5 d  _5 a+ A, \8 P        hwiParams.priority = 4;* n0 {4 \  C) o" y; S! v$ q
        myHwi = Hwi_create(8, ad7606_busy_hwi, &hwiParams, &eb);       //注册BANK5中断处理函数
# }: Z! i- y' ?$ w! k0 H* X. P        if (myHwi == NULL) 1 e+ B0 D5 q. Z7 s3 q1 H% `, K" C% B
        LOG_FATAL("failed to create hwi");
( X8 Y( C) Y4 c; U6 L$ m7 B8 m+ W' V. S
        /* enable both interrupts */! U: j, \9 [* Z( q$ Z) @' N
        Hwi_enableInterrupt(ad->irq_event);
1 m. E9 f( Z0 B* f}4 _. G1 p' l9 O7 `* T- m; Q

6 A; `6 a! U* |$ \
: d- ]+ A4 J* J1 e3 ]static void ad7606_gpio_pinmux_setup(ad7606 *ad) {
1 F5 n5 @: N+ r) P2 R! q( ?) Y1 }- l1 u( ]        volatile unsigned int savePinMux = 0;
' t9 x+ o$ W2 \8 S; z+ R$ q' C        //初始化5.11、5.9 、 5.5为GPIO口
8 x  v8 c" p$ O# ]! z        savePinMux = HWREG(SOC_SYSCFG_0_REGS + SYSCFG0_PINMUX(11)) & (~(SYSCFG_PINMUX11_PINMUX11_27_24 | SYSCFG_PINMUX11_PINMUX11_19_16));
2 `( v: q2 Q  Z8 J, P: o6 j" w+ ^. K4 S. H( ~
        HWREG(SOC_SYSCFG_0_REGS + SYSCFG0_PINMUX(11)) =        (PINMUX11_BUSY_V1_ENABLE | PINMUX11_BUSY_V2_ENABLE | savePinMux);; O& l. d, p* ^
# o% |2 Z( X. ^
        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));- |9 }% y! A( C4 t: g( {" c
4 f8 K5 h# u' y$ {+ l
        HWREG(SOC_SYSCFG_0_REGS + SYSCFG0_PINMUX(12)) =        (PINMUX12_RESET_ENABLE | PINMUX12_CONVST_ENABLE | PINMUX12_RD_ENABLE | PINMUX12_BUSY_C_ENABLE | savePinMux);. A3 }4 _6 S, \2 H/ J5 Y
7 P1 ^  \. C2 k( E, J( B
}6 l& t' N9 g9 @9 `9 ^6 L

; x7 [* E; F; K6 p# I5 F
  _! m5 H  ]' M7 @7 J2 Ostatic void ad7606_gpio_setup(ad7606 *ad) {+ U8 G9 k" C# e! y% |% o4 L- w
        /*Set the AD7606_PAR_BUSY to the input mode*/
# u2 A! t1 T) Q, E5 b3 Q        //初始化5.11、5.9 、 5.5为中断口3 ?3 D7 ?2 f* g2 |% J6 d
        GPIODirModeSet(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_V1, GPIO_DIR_INPUT);! R/ R$ D' E& {; p7 {0 w
        GPIODirModeSet(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_V2, GPIO_DIR_INPUT);
0 P/ e& ~# O6 w- |        GPIODirModeSet(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_C, GPIO_DIR_INPUT);  B% v7 g- g( N
        //GPIODirModeSet(SOC_GPIO_0_REGS, AD7606_PAR_BUSY, GPIO_DIR_INPUT);
. `" c# D, b) f7 s% Q* r  B8 K) T        /*Set the AD7606_PAR_BUSY to the Falling Edge Interrupt*/5 |  A8 H; @9 `4 I* C" G
        GPIOIntTypeSet(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_V1, GPIO_INT_TYPE_FALLEDGE);
4 X5 O* P, j) T9 F7 k6 O1 ]        GPIOIntTypeSet(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_V2, GPIO_INT_TYPE_FALLEDGE);, k* W' N6 ?! M# Z: j
        GPIOIntTypeSet(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_C, GPIO_INT_TYPE_FALLEDGE);0 ~% c! W1 Z4 v4 c
        //GPIOIntTypeSet(SOC_GPIO_0_REGS, AD7606_PAR_BUSY, GPIO_INT_TYPE_FALLEDGE);
* s' V& r2 j$ V- h7 |& f5 ]        /*The interrupt setting allows AD7606_PAR_BUSY_GPIO_BANK*/
3 k& @7 q: E% b2 t8 J9 |5 t        GPIOBankIntEnable(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_GPIO_BANK);
0 p0 c1 @0 s1 }- X& ^. ?
4 @/ G3 ?/ Y  y& s% ]3 m        GPIODirModeSet(SOC_GPIO_0_REGS, AD7606_PAR_RESET, GPIO_DIR_OUTPUT);
/ H! p# C7 V  T! s( h        GPIOPinWrite(SOC_GPIO_0_REGS, AD7606_PAR_RESET, GPIO_PIN_HIGH);* T2 h% p9 }/ x6 H
        Task_sleep(1000);
( w( K/ g/ w# Z' @& D/ O1 ?/ C        GPIOPinWrite(SOC_GPIO_0_REGS, AD7606_PAR_RESET, GPIO_PIN_LOW);6 x8 y) Y9 R" i
        Task_sleep(1000);" @# ]* ?" ]; s' F7 ?& u
0 ?. J" `/ Q5 ]
        /*Set the AD7606_PAR_CONVST to output mode*/% N" z1 D0 g* ^( n0 Q* N
        GPIODirModeSet(SOC_GPIO_0_REGS, AD7606_PAR_CONVST, GPIO_DIR_OUTPUT);6 G' \9 i3 y* \
        GPIOPinWrite(SOC_GPIO_0_REGS, AD7606_PAR_CONVST, GPIO_PIN_LOW);
3 t5 t  e: {- C7 U3 ]( S" R
' Q' ]; Y- h2 Z0 c% K7 s4 x- G0 L) Y        GPIODirModeSet(SOC_GPIO_0_REGS, AD7606_PAR_RD, GPIO_DIR_OUTPUT);
" n$ p9 h* P: H        GPIOPinWrite(SOC_GPIO_0_REGS, AD7606_PAR_RD, GPIO_PIN_HIGH);; R4 g  g2 v4 }$ X

; r4 d4 R& [! j+ P) x  o' a+ Y}4 e9 w. G& E2 l$ q, y

: I* q4 @  M) R! `. x, {4 y$ G4 A. r
static void ad7606_busy_hwi(UArg ad_addr) {
, i% t" {% a% t8 J( {: b! {
& n* l' x  y1 d& p% k4 P/ N
8 S6 l+ X7 }& z2 j& g7 @        /* Disable the interrupts for pins of bank AD7606_PAR_BUSY in GPIO.*/
$ t, o% W& z6 A        GPIOBankIntDisable(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_GPIO_BANK);      //用仿真器debug,发现程序能进入这里。( Z/ Z+ X% f5 F2 F( u8 v  |
& s+ K6 X( O( H3 {7 }$ w$ C
        if(GPIOPinIntStatus(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_V1) == GPIO_INT_PEND)$ n' I# ~9 `; g& f0 {' p
        {8 y7 e& ~, d7 Y" M4 _; o
                GPIOPinIntClear(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_V1);                    //问题是:用仿真器debug,发现程序不能进入这里。4 V. r3 d# p4 f" P0 A8 E7 [3 a3 |" }, O
                cs_addr = SOC_EMIFA_CS5_ADDR ;( w- P6 t% j! m0 d9 R
                internal = 0 ;
1 i0 [4 v( Q% U& K                int_flag[0] = 1 ;. K- ^* k  d8 f4 [* P
        }
* L3 S1 {0 E: x! `        if(GPIOPinIntStatus(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_V2) == GPIO_INT_PEND)
$ L) S6 P; u' N# y9 {        {% {8 l1 L" M/ T
                GPIOPinIntClear(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_V2); //问题是:用仿真器debug,发现程序不能进入这里。
7 S% H0 R  R' n2 T/ p, J' ^4 o6 D* ~                cs_addr = SOC_EMIFA_CS4_ADDR ;9 L2 X, y/ F) C# a8 H! M
                internal = 6 ;
. [" N0 y0 b/ W2 f6 h. e                int_flag[1] = 1 ;2 Q! e5 M5 s% S
        }6 m2 i% K' N9 V% {' L% W* {
        if(GPIOPinIntStatus(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_C) == GPIO_INT_PEND)
7 _$ n  L- u3 T. z1 s8 w: T        {3 J6 a; K) l/ p* }* S
                GPIOPinIntClear(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_C); //问题是:用仿真器debug,发现程序不能进入这里。
. y  x9 n( Y$ f& s                cs_addr = SOC_EMIFA_CS2_ADDR ;
$ J  n% v( o* o! ^( g                internal = 12 ;
1 u$ {9 [. k! a4 q" ?4 x& f/ ?3 w                int_flag[2] = 1 ;* K* t% ?+ e5 V0 A6 P
        }8 N1 Y% }" a% u& D/ u1 H
  ) O, y* a1 C( b# Y! P  R; }3 {
        GPIOPinWrite(SOC_GPIO_0_REGS, AD7606_PAR_CONVST, GPIO_PIN_LOW);' r& i( h& w$ D! }0 H
      
' J9 B3 N- f$ A7 Y' e" a& j' O. r        GPIOBankIntEnable(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_GPIO_BANK);
" ]% d# k- o% d7 V}
& A: Q: g' c* h( {3 |8 u+ E4 j6 N8 Q' k8 W; g: s

作者: vtinf    时间: 2016-8-31 16:53
INTSTAT45状态如图
$ e2 U+ }: s7 h* I7 b* b[attach]1368[/attach]
2 c; F2 o& t6 v! F




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