嵌入式开发者社区

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

作者: vtinf    时间: 2016-8-31 17:29
标题: sysbios hwi 端口识别问题
您好。使用GPIO中断时,中断能进入ISR,但是不能区分具体的GPIO端口。程序如下:0 V2 Y6 z: E( i/ G4 H9 f8 Z
#define AD7606_PAR_BUSY_GPIO_BANK        5
. @: k$ z* q: x1 _3 J- D0 o+ M5 K#define AD7606_PAR_BUSY_GPIO_BANK_INT        SYS_INT_GPIO_B5INT
% c6 c. z# e( B. d3 [7 @9 L8 _" U3 x" N3 ]
#define AD7606_PAR_BUSY_V1                        GPIO_TO_PIN(5, 11)   //BANK5的中断口5.11
/ U. _' Y5 o# u#define AD7606_PAR_BUSY_V2                        GPIO_TO_PIN(5, 9)    //BANK5的中断口5.95 d  H: M; e( Y( t" Z8 F2 l
#define AD7606_PAR_BUSY_C                        GPIO_TO_PIN(5, 5)    //BANK5的中断口5.5: t# D, B  L8 P$ |
#define AD7606_PAR_BUSY                                GPIO_TO_PIN(5, 4)
; O5 Y" p1 x4 B
/ D; P! G0 R- ~* w# H- u#define AD7606_PAR_CONVST                        GPIO_TO_PIN(5, 1)+ Q" y% u& w# C* X
#define AD7606_PAR_RD                                GPIO_TO_PIN(5, 2)6 n6 v  B1 f! e) O+ l
#define AD7606_PAR_RESET                        GPIO_TO_PIN(5, 0)
' }8 p8 D( A. J+ i4 t* ]" M  S# W9 S) m5 ~; j, s+ X

2 N$ H4 I2 Y; [4 k( ]- X8 a1 k9 S
static void ad7606_irq_setup(ad7606 *ad) {
4 @2 f7 Q' m: f( r% S        Hwi_Params hwiParams;5 T, H! R: ~( n
        Hwi_Handle myHwi;
) A& G- |4 l1 p6 i# G) W: g) q        Error_Block eb;
  x& v0 c& l) E- \
- W5 I1 u) L# w! U% u/ k        Error_init(&eb);
6 y; k. ?& e  o* a1 H! T) y* Y        Hwi_Params_init(&hwiParams);) s8 Y0 V* G( A% U2 k1 O3 U3 ?
        hwiParams.arg = (unsigned int)ad;
' ]4 K% }. j: `: v$ w5 R+ s        hwiParams.enableInt = FALSE;+ J# V! e4 j; f3 t6 ~
        hwiParams.eventId = SYS_INT_GPIO_B5INT;" t/ @! a% W( D  U
        hwiParams.priority = 4;5 T! M6 u. @. {0 u9 J2 W3 S# {
        myHwi = Hwi_create(8, ad7606_busy_hwi, &hwiParams, &eb);       //注册BANK5中断处理函数% C6 g1 F8 ]1 C- V* ?$ U
        if (myHwi == NULL) ) `7 U4 ?  X9 p7 e1 H
        LOG_FATAL("failed to create hwi");
3 ~! _7 f% m7 C& v, H& [% I& K" w4 m" m5 m1 m
        /* enable both interrupts */6 Z+ o. O& p8 [: e/ F+ L. U
        Hwi_enableInterrupt(ad->irq_event);
  V* B& u. J" w- f! L8 @}8 {: H3 P  Z% T# @; G) ]/ k5 O- u. Q
# q; C) t- y  ]$ O, d6 X, G" X

* q. d; G8 f9 ]! [3 u/ @static void ad7606_gpio_pinmux_setup(ad7606 *ad) {
, b8 [- s- ^  `; E        volatile unsigned int savePinMux = 0;
7 o8 J5 P" @* Z# Z/ l        //初始化5.11、5.9 、 5.5为GPIO口
& F7 b0 {6 s/ E4 k# A, N! [( j        savePinMux = HWREG(SOC_SYSCFG_0_REGS + SYSCFG0_PINMUX(11)) & (~(SYSCFG_PINMUX11_PINMUX11_27_24 | SYSCFG_PINMUX11_PINMUX11_19_16));
* r1 V$ t8 K1 s- z! x. V' B1 s8 K9 R1 o) ^- J, E) l
        HWREG(SOC_SYSCFG_0_REGS + SYSCFG0_PINMUX(11)) =        (PINMUX11_BUSY_V1_ENABLE | PINMUX11_BUSY_V2_ENABLE | savePinMux);
8 I5 D  w% Q& }$ v5 p: ]* n# G' x% v9 j' T, G, N
        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));6 _0 ]( ^/ W3 d/ ]: y% a1 e
* r  k1 l) U! R+ t! Z, @! |
        HWREG(SOC_SYSCFG_0_REGS + SYSCFG0_PINMUX(12)) =        (PINMUX12_RESET_ENABLE | PINMUX12_CONVST_ENABLE | PINMUX12_RD_ENABLE | PINMUX12_BUSY_C_ENABLE | savePinMux);5 h9 W* k' E5 ^" S6 C
1 ~  m; W1 Q' H5 r
}
8 Q, a+ r: D( @! R/ X4 v2 r6 R; f) S# m, a

9 K# f( s. p7 astatic void ad7606_gpio_setup(ad7606 *ad) {
3 b5 y# f9 `5 x  Z9 \        /*Set the AD7606_PAR_BUSY to the input mode*/3 h; v6 R' \  |: @' q: z+ ?
        //初始化5.11、5.9 、 5.5为中断口" u% V8 ^" U9 Z. d' |  i) C& v
        GPIODirModeSet(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_V1, GPIO_DIR_INPUT);
( h. e9 d9 ~  s        GPIODirModeSet(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_V2, GPIO_DIR_INPUT);
# f1 n+ J) u9 J" [8 e4 R        GPIODirModeSet(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_C, GPIO_DIR_INPUT);
6 j2 o! v( L9 ]        //GPIODirModeSet(SOC_GPIO_0_REGS, AD7606_PAR_BUSY, GPIO_DIR_INPUT);" G5 l. V1 T/ j) m8 f; ]0 c
        /*Set the AD7606_PAR_BUSY to the Falling Edge Interrupt*/% [9 ?) l% V7 T, f' Y
        GPIOIntTypeSet(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_V1, GPIO_INT_TYPE_FALLEDGE);
# l8 ]. G. F5 ~/ c; F7 F        GPIOIntTypeSet(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_V2, GPIO_INT_TYPE_FALLEDGE);6 _2 N5 B& j' M
        GPIOIntTypeSet(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_C, GPIO_INT_TYPE_FALLEDGE);( W$ B7 e6 `/ X9 @7 b
        //GPIOIntTypeSet(SOC_GPIO_0_REGS, AD7606_PAR_BUSY, GPIO_INT_TYPE_FALLEDGE);/ C: @& x6 F0 u/ B
        /*The interrupt setting allows AD7606_PAR_BUSY_GPIO_BANK*/& M# J0 }3 ]; t/ }- A: f
        GPIOBankIntEnable(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_GPIO_BANK);
  L3 L% N7 M9 x  E) P1 T" f1 M5 A$ k
        GPIODirModeSet(SOC_GPIO_0_REGS, AD7606_PAR_RESET, GPIO_DIR_OUTPUT);0 R) n; W3 v8 }6 y3 g
        GPIOPinWrite(SOC_GPIO_0_REGS, AD7606_PAR_RESET, GPIO_PIN_HIGH);3 p# t1 s6 G0 [: q
        Task_sleep(1000);
3 ?( Y9 A; W" A. Q5 p% D0 {8 ?        GPIOPinWrite(SOC_GPIO_0_REGS, AD7606_PAR_RESET, GPIO_PIN_LOW);
! q( e" B( }" d1 w$ [+ H        Task_sleep(1000);5 m* ^* b/ w0 ~. c  t- X; r
( w9 r6 z, B1 {  d5 d0 n: B! J$ I
        /*Set the AD7606_PAR_CONVST to output mode*/3 R% S4 t! Q# K# V  ^1 x
        GPIODirModeSet(SOC_GPIO_0_REGS, AD7606_PAR_CONVST, GPIO_DIR_OUTPUT);
: H6 F% y8 G2 [& j        GPIOPinWrite(SOC_GPIO_0_REGS, AD7606_PAR_CONVST, GPIO_PIN_LOW);
& z0 y. C6 _1 P0 _; `' o$ r
9 Z0 Q- V4 L+ U        GPIODirModeSet(SOC_GPIO_0_REGS, AD7606_PAR_RD, GPIO_DIR_OUTPUT);
1 `- R/ |& ~* I% i  a) e: X4 m        GPIOPinWrite(SOC_GPIO_0_REGS, AD7606_PAR_RD, GPIO_PIN_HIGH);
+ g1 b8 J& u' D/ c' Y' [/ |
% y! I4 b3 U- W}8 C" v7 o' D) [; c: f* z
7 {* @0 d) A* g) F& y- E% s

; I6 i4 g' K! M# ]static void ad7606_busy_hwi(UArg ad_addr) {8 M  K7 u5 a3 T

' e; w, s& y  I* ~5 {/ A
# G& {! e8 ?7 m7 q& t- P$ p        /* Disable the interrupts for pins of bank AD7606_PAR_BUSY in GPIO.*/; y% X( G# I. c/ o( R
        GPIOBankIntDisable(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_GPIO_BANK);      //用仿真器debug,发现程序能进入这里。
( d$ ~  O# d8 p
& L  l$ I& S+ ]$ I; W% ]        if(GPIOPinIntStatus(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_V1) == GPIO_INT_PEND)8 T* ]$ e( S" Z+ I
        {
( R- x1 P+ h1 \0 O- L                GPIOPinIntClear(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_V1);                    //问题是:用仿真器debug,发现程序不能进入这里。
. \4 W3 W2 Q- O7 b                cs_addr = SOC_EMIFA_CS5_ADDR ;
/ S9 w0 L2 @7 ~# a  g- x4 C* S" X                internal = 0 ;
/ E( e2 e2 ?9 i: i# M& Q                int_flag[0] = 1 ;
/ U" }/ @0 |+ i        }
! ~+ _& `6 s- E9 j$ S: X. r* l+ {        if(GPIOPinIntStatus(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_V2) == GPIO_INT_PEND)
: H9 u6 Y  R. K2 ^        {3 j; l; Y) x* m& u
                GPIOPinIntClear(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_V2); //问题是:用仿真器debug,发现程序不能进入这里。! _; \2 k5 K+ S/ ?
                cs_addr = SOC_EMIFA_CS4_ADDR ;7 ^  B0 j) ]+ \& u' J' }
                internal = 6 ;
# ^! Y7 o* U/ C" d0 B% ?                int_flag[1] = 1 ;
, k+ @; ], H* U" N+ M        }
8 F- e$ b( L4 D" n# C* C1 L( @        if(GPIOPinIntStatus(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_C) == GPIO_INT_PEND)! g, q, V) I7 z. |9 Y
        {
5 S. y# }0 [/ u0 a                GPIOPinIntClear(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_C); //问题是:用仿真器debug,发现程序不能进入这里。( C+ u% j' i- R( G# h. _
                cs_addr = SOC_EMIFA_CS2_ADDR ;
0 A+ I4 d, k+ E2 s- A                internal = 12 ;3 H* i1 _2 v' _* ^# |
                int_flag[2] = 1 ;
3 _2 I! X1 W  D. Z        }
: B% t4 w  J" ^. d' p- R0 N  
+ J& C* b) J, a: h! S: d( Z1 N        GPIOPinWrite(SOC_GPIO_0_REGS, AD7606_PAR_CONVST, GPIO_PIN_LOW);
- A/ \6 h* W  n6 e4 i: D& q4 r: N      
4 ?; g+ s( _' C+ M$ N        GPIOBankIntEnable(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_GPIO_BANK);
4 X& Y8 V6 K, a, Q, ^+ G; R# p( d}
. O/ z& p" `  f+ f7 `& A5 \( W, P) y- k7 ?9 g2 k+ e

6 @+ a$ W# n- o2 Q, n5 O% Q5 T/ j, L7 Z# Z5 R" `& W; g- G! p
[attach]1369[/attach]
. z+ u1 ~8 Y/ W/ p7 C' q' p2 ?
作者: human    时间: 2016-9-18 19:35
你用单步调试,step into看看相应的函数值是否发生了变化




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