嵌入式开发者社区

标题: sysbios hwi 端口识别问题 [打印本页]

作者: vtinf    时间: 2016-8-31 17:29
标题: sysbios hwi 端口识别问题
您好。使用GPIO中断时,中断能进入ISR,但是不能区分具体的GPIO端口。程序如下:
$ f! B9 \+ T7 `; W#define AD7606_PAR_BUSY_GPIO_BANK        5" K4 C4 _( `8 `: y2 v6 U+ d
#define AD7606_PAR_BUSY_GPIO_BANK_INT        SYS_INT_GPIO_B5INT
1 T# e2 m% l* W1 Q/ @5 x0 Q; ]  m$ X/ b  J0 R0 i1 Q
#define AD7606_PAR_BUSY_V1                        GPIO_TO_PIN(5, 11)   //BANK5的中断口5.11/ L$ d* i" g# q& G  ?
#define AD7606_PAR_BUSY_V2                        GPIO_TO_PIN(5, 9)    //BANK5的中断口5.96 Z- R8 }9 t' h  \
#define AD7606_PAR_BUSY_C                        GPIO_TO_PIN(5, 5)    //BANK5的中断口5.5% Q5 l1 F$ Z5 D% m* \9 B
#define AD7606_PAR_BUSY                                GPIO_TO_PIN(5, 4)
- [' H4 w! I3 e( e: D  d) v3 z$ W; X1 _& w: R2 ]% l! y. G
#define AD7606_PAR_CONVST                        GPIO_TO_PIN(5, 1)  C+ ]4 e: H7 y# j5 Q) r
#define AD7606_PAR_RD                                GPIO_TO_PIN(5, 2)
6 D" X! H; O. r#define AD7606_PAR_RESET                        GPIO_TO_PIN(5, 0)& l9 D- }0 M* `/ ]3 B  F

# n3 \- l1 O: a6 y* h. U4 ~* D9 B1 E1 Q# D4 m/ W8 z

# b! k  T/ S$ _static void ad7606_irq_setup(ad7606 *ad) {
- ]0 U, w! z6 Y3 u$ Z& G* J( R        Hwi_Params hwiParams;0 C4 V; ?7 B- {- b
        Hwi_Handle myHwi;
9 D5 |6 \4 L. k2 O- s        Error_Block eb;
  `2 f- G' B& K/ X
% d* L6 [$ @/ `3 }. X6 x. L3 h2 j        Error_init(&eb);
8 q" |# L) Q! h2 D! j* X) u1 e) E% U        Hwi_Params_init(&hwiParams);* l6 Q- o2 [8 [$ ?# h4 ?* V! M- ?
        hwiParams.arg = (unsigned int)ad;
! \6 J& x8 n7 ~9 H3 k, B) N        hwiParams.enableInt = FALSE;
$ }" u- p1 I- |! h' t        hwiParams.eventId = SYS_INT_GPIO_B5INT;
* S; g/ |1 r/ q# Y* I$ t: o' {        hwiParams.priority = 4;
, [1 ^! P5 {) F0 o        myHwi = Hwi_create(8, ad7606_busy_hwi, &hwiParams, &eb);       //注册BANK5中断处理函数  Y$ L8 F& D8 t* s  }
        if (myHwi == NULL) * }- j, Q/ j! d7 D6 ?: x
        LOG_FATAL("failed to create hwi");* v9 ?0 n6 a+ h* C7 B2 n: P
' {  X6 t0 j+ X3 \- c- D* v
        /* enable both interrupts */
* g6 C! p8 G, [        Hwi_enableInterrupt(ad->irq_event);+ Z7 H0 N% m2 w" r9 [
}
1 X& V9 W. r# q9 o* E+ [4 R! p+ J" U# ^2 S
1 B/ Z! \% M/ h; k
static void ad7606_gpio_pinmux_setup(ad7606 *ad) {
  L4 `# `* h5 n  C9 M; T/ b) o! n        volatile unsigned int savePinMux = 0;/ j$ n7 [# H; X/ c7 m, |9 Z3 E: _
        //初始化5.11、5.9 、 5.5为GPIO口
0 }5 M2 N; `$ D7 z        savePinMux = HWREG(SOC_SYSCFG_0_REGS + SYSCFG0_PINMUX(11)) & (~(SYSCFG_PINMUX11_PINMUX11_27_24 | SYSCFG_PINMUX11_PINMUX11_19_16));+ i4 C! V0 d$ t$ X6 m" H% y

# u6 [9 j  t1 A' N0 W9 n/ ^        HWREG(SOC_SYSCFG_0_REGS + SYSCFG0_PINMUX(11)) =        (PINMUX11_BUSY_V1_ENABLE | PINMUX11_BUSY_V2_ENABLE | savePinMux);) x/ u; r+ N8 _

# z. m: J' t# O% h( k5 j! r        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));
: y7 }' F. r; _9 `2 u0 T/ m: k6 F9 U5 a2 m7 r2 @/ w
        HWREG(SOC_SYSCFG_0_REGS + SYSCFG0_PINMUX(12)) =        (PINMUX12_RESET_ENABLE | PINMUX12_CONVST_ENABLE | PINMUX12_RD_ENABLE | PINMUX12_BUSY_C_ENABLE | savePinMux);! G# v2 \( ^$ S9 ], \  P7 Y# `5 }

0 z6 U2 @. l9 e}
: b; `+ _' e: ^7 p6 P  \* P2 S8 P

4 P5 D1 T# f" Q% [static void ad7606_gpio_setup(ad7606 *ad) {3 F) t7 t: w0 A7 O% o3 B
        /*Set the AD7606_PAR_BUSY to the input mode*/
. T, y( h. e9 i/ i( \        //初始化5.11、5.9 、 5.5为中断口
1 f: j7 O) T! A9 K' j+ m$ x        GPIODirModeSet(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_V1, GPIO_DIR_INPUT);, [0 {" S+ {  s  |/ l8 z3 |! w9 ~
        GPIODirModeSet(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_V2, GPIO_DIR_INPUT);6 n$ w" }& _; n
        GPIODirModeSet(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_C, GPIO_DIR_INPUT);
8 o7 G# W/ n: _  ~% \9 U, ]$ ^* ^        //GPIODirModeSet(SOC_GPIO_0_REGS, AD7606_PAR_BUSY, GPIO_DIR_INPUT);1 X& P1 R3 j2 e- e& p
        /*Set the AD7606_PAR_BUSY to the Falling Edge Interrupt*/8 ]$ O8 s9 p  e& ^4 m
        GPIOIntTypeSet(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_V1, GPIO_INT_TYPE_FALLEDGE);* u, u1 t" {2 }; d' n
        GPIOIntTypeSet(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_V2, GPIO_INT_TYPE_FALLEDGE);
8 G8 _- N" }1 N# B& G: _        GPIOIntTypeSet(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_C, GPIO_INT_TYPE_FALLEDGE);1 X! j) U! k5 p7 Y- r9 o
        //GPIOIntTypeSet(SOC_GPIO_0_REGS, AD7606_PAR_BUSY, GPIO_INT_TYPE_FALLEDGE);$ `* z! D: t0 }. M5 W
        /*The interrupt setting allows AD7606_PAR_BUSY_GPIO_BANK*/
5 \. b' g4 b9 U& T6 J        GPIOBankIntEnable(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_GPIO_BANK);% p! T2 q9 r: ^% j3 B
5 {( A: `2 ~9 X6 Q7 Q3 R
        GPIODirModeSet(SOC_GPIO_0_REGS, AD7606_PAR_RESET, GPIO_DIR_OUTPUT);
; Q  e: |3 Y4 v. X! C0 X) v/ b( ~, K        GPIOPinWrite(SOC_GPIO_0_REGS, AD7606_PAR_RESET, GPIO_PIN_HIGH);7 X- B% ^5 H; e' l9 M9 G5 |- O
        Task_sleep(1000);
0 s* L: ?; ?: h8 f/ P) }' v" U        GPIOPinWrite(SOC_GPIO_0_REGS, AD7606_PAR_RESET, GPIO_PIN_LOW);
; U/ X2 y8 `  D8 @# _+ N' F        Task_sleep(1000);
6 g5 {2 C/ i) R$ ~) y3 I
$ D, T& H7 y4 i% r/ u        /*Set the AD7606_PAR_CONVST to output mode*/
6 S9 r: w) n) W) t0 q        GPIODirModeSet(SOC_GPIO_0_REGS, AD7606_PAR_CONVST, GPIO_DIR_OUTPUT);. f8 Q' n- K$ s% a3 H
        GPIOPinWrite(SOC_GPIO_0_REGS, AD7606_PAR_CONVST, GPIO_PIN_LOW);5 u% l& ?* A$ @7 R

& M  f7 d" h2 L        GPIODirModeSet(SOC_GPIO_0_REGS, AD7606_PAR_RD, GPIO_DIR_OUTPUT);9 G1 C$ i) _5 S! X& S
        GPIOPinWrite(SOC_GPIO_0_REGS, AD7606_PAR_RD, GPIO_PIN_HIGH);7 |. _8 }2 q/ x& o5 d# h( i

: Y6 P9 |1 X( ]2 I6 N$ C}
8 \- n' {2 T: O* f' k( {
2 Y+ o( h/ z5 _" I& q% P) E0 Q: V/ Q0 Z& Y! p
static void ad7606_busy_hwi(UArg ad_addr) {1 T6 k2 k; q5 L

4 ~# T- V1 O" k/ N" E' i9 v# q& f* x
8 E# f; u$ I% q/ }        /* Disable the interrupts for pins of bank AD7606_PAR_BUSY in GPIO.*/) k7 _/ d, Y$ y- v- z
        GPIOBankIntDisable(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_GPIO_BANK);      //用仿真器debug,发现程序能进入这里。2 A: b1 c& }- `0 p) }: |# P

. [0 T- t$ J& i! t7 \        if(GPIOPinIntStatus(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_V1) == GPIO_INT_PEND)
, _3 \. i: g+ o7 @" e# n$ s        {5 F' ~. I/ i; v1 H6 S* u# V, z
                GPIOPinIntClear(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_V1);                    //问题是:用仿真器debug,发现程序不能进入这里。+ ^$ z! @; F$ L; q! p8 l7 y6 G
                cs_addr = SOC_EMIFA_CS5_ADDR ;( G! f/ P- E) ]4 X8 M& F& M
                internal = 0 ;8 I% e, ]3 G( T+ W6 c7 I# ]4 m( m
                int_flag[0] = 1 ;
+ k2 X3 V" d8 k  x& \( q        }9 }5 s* w) h8 H* a% D( R0 e. b
        if(GPIOPinIntStatus(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_V2) == GPIO_INT_PEND)
; g; |6 Z( W9 S5 U8 _        {
& N7 G" x) N  H% ?                GPIOPinIntClear(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_V2); //问题是:用仿真器debug,发现程序不能进入这里。
) @2 D& }9 T+ B; ]: i- g/ E                cs_addr = SOC_EMIFA_CS4_ADDR ;
, \/ a; M% y# U$ l; }: N! H                internal = 6 ;% Y. @* M' v9 L- v6 P! w
                int_flag[1] = 1 ;; P  ^3 e0 G/ B6 x- U& S6 p
        }
5 S0 z9 {( ~5 ^! W) c" u; m. v$ ]9 V        if(GPIOPinIntStatus(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_C) == GPIO_INT_PEND)9 y* N! t+ B4 W- D
        {3 F9 N6 c, K  `# t* U2 ?
                GPIOPinIntClear(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_C); //问题是:用仿真器debug,发现程序不能进入这里。2 Y" W$ M% n- m
                cs_addr = SOC_EMIFA_CS2_ADDR ;) b+ E; b/ j7 Y/ f7 k3 E  @- c
                internal = 12 ;
" }$ J; p0 P! G9 W3 c                int_flag[2] = 1 ;' F. N7 q" o- K/ [0 C8 s4 s/ @
        }) A) M' a6 I8 \! u
  2 c9 V  ~! ~3 z! n
        GPIOPinWrite(SOC_GPIO_0_REGS, AD7606_PAR_CONVST, GPIO_PIN_LOW);9 `+ X! {1 k5 S! B" o
      
; m6 @6 u8 _3 I% L        GPIOBankIntEnable(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_GPIO_BANK);& W* {# P2 |  H  U' o5 Y# y
}
/ E1 k  G& d, w! S0 |3 A5 V
% s$ F2 m7 g2 J. Y8 l
5 K  g% w& b. r. S' k
0 Z4 ?- [5 X, c[attach]1369[/attach]" w( r6 d. B- d

作者: human    时间: 2016-9-18 19:35
你用单步调试,step into看看相应的函数值是否发生了变化




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