嵌入式开发者社区

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

作者: vtinf    时间: 2016-8-31 17:29
标题: sysbios hwi 端口识别问题
您好。使用GPIO中断时,中断能进入ISR,但是不能区分具体的GPIO端口。程序如下:
: Y2 g* \0 V% B- }# s#define AD7606_PAR_BUSY_GPIO_BANK        59 o, a1 M! K* \; x5 q; z
#define AD7606_PAR_BUSY_GPIO_BANK_INT        SYS_INT_GPIO_B5INT
$ Y& z( u5 f, T8 G* H9 {% x" c. l" Q  v8 K1 |) c. X
#define AD7606_PAR_BUSY_V1                        GPIO_TO_PIN(5, 11)   //BANK5的中断口5.11; f1 z5 p3 v. V& E( C! l& A1 `0 M7 P
#define AD7606_PAR_BUSY_V2                        GPIO_TO_PIN(5, 9)    //BANK5的中断口5.9
- y, u0 Z" r9 H  l7 J: `- P3 S2 Q#define AD7606_PAR_BUSY_C                        GPIO_TO_PIN(5, 5)    //BANK5的中断口5.5
: |) N+ F# |0 ^9 H6 X$ D) x( C7 y' ]. N#define AD7606_PAR_BUSY                                GPIO_TO_PIN(5, 4), v2 ?& a: ~- A3 v$ \
+ P8 {# m% J9 |& p0 X
#define AD7606_PAR_CONVST                        GPIO_TO_PIN(5, 1)& ~: q1 l9 k! b5 C, i; @
#define AD7606_PAR_RD                                GPIO_TO_PIN(5, 2)
4 d, f" V' k' p+ }3 S6 @#define AD7606_PAR_RESET                        GPIO_TO_PIN(5, 0)' k$ m6 x. h4 M) b9 p& F  D, W
! R3 A! j, O/ t5 E7 @. z* i' O5 j% z# z
$ ]* ^) o2 ~& g7 x1 u" ~
& W7 _) I! o6 z% H2 h3 G# d
static void ad7606_irq_setup(ad7606 *ad) {
1 b! F! ]7 F/ S" e5 S% F        Hwi_Params hwiParams;
' m+ X& |4 i6 v3 E& ]- j        Hwi_Handle myHwi;
; g7 a" C" b7 V6 F        Error_Block eb;
% ]9 o7 E5 X. J! m! c" J6 u, H" G4 s3 X, ~  F) z* \
        Error_init(&eb);) d4 Q  A2 e, D# T( E7 ]
        Hwi_Params_init(&hwiParams);! L  n( {1 v2 _' H- z' ~
        hwiParams.arg = (unsigned int)ad;( n& |' c2 P( K+ \# V
        hwiParams.enableInt = FALSE;& ?+ ~6 G/ u, H! z1 K
        hwiParams.eventId = SYS_INT_GPIO_B5INT;" F$ ^: A% E. E" Y
        hwiParams.priority = 4;/ r0 V/ V+ `' {3 H* J
        myHwi = Hwi_create(8, ad7606_busy_hwi, &hwiParams, &eb);       //注册BANK5中断处理函数
4 h4 E3 E. ?" N& b        if (myHwi == NULL) 9 I# S: T1 k" T5 H
        LOG_FATAL("failed to create hwi");
" k: q; r3 ~3 Z+ P( }6 a+ u7 ^2 t. w" R# k- D8 S4 B
        /* enable both interrupts */3 i% c1 i# M, x, l
        Hwi_enableInterrupt(ad->irq_event);
( |& G' k" f+ W4 U4 o}
# W8 h/ \% S$ B: z- b( E- h# _6 Y3 Y$ i: h$ e! m) w
$ u" d4 [+ I7 ]3 V, Q* x+ }- @2 R4 F4 _
static void ad7606_gpio_pinmux_setup(ad7606 *ad) {  G7 ?4 g7 s) J% y+ e% c2 C
        volatile unsigned int savePinMux = 0;; [. f4 F) z, k5 Z/ [! h+ ?
        //初始化5.11、5.9 、 5.5为GPIO口
6 ]8 ?' K  H- P' y1 }        savePinMux = HWREG(SOC_SYSCFG_0_REGS + SYSCFG0_PINMUX(11)) & (~(SYSCFG_PINMUX11_PINMUX11_27_24 | SYSCFG_PINMUX11_PINMUX11_19_16));
" R" W0 B7 e# e! g/ c; {
# [% m5 }( N+ \7 g5 i        HWREG(SOC_SYSCFG_0_REGS + SYSCFG0_PINMUX(11)) =        (PINMUX11_BUSY_V1_ENABLE | PINMUX11_BUSY_V2_ENABLE | savePinMux);
" I9 M0 D% @& u( C7 \
+ x$ K7 ^- T' a        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));  a7 w; m* |* C* L( j$ E3 E5 G

) \% E! I% n; a) ~; S5 E        HWREG(SOC_SYSCFG_0_REGS + SYSCFG0_PINMUX(12)) =        (PINMUX12_RESET_ENABLE | PINMUX12_CONVST_ENABLE | PINMUX12_RD_ENABLE | PINMUX12_BUSY_C_ENABLE | savePinMux);, O1 `" b! j- q: n% B; {
( ]  r! H& B! Z# z& w6 K
}
, J6 _- P. _8 X7 [( M: R/ o7 A
6 Y( N. ]# z, s
: Q$ }6 j! m) e! X; v+ Dstatic void ad7606_gpio_setup(ad7606 *ad) {
5 T1 Z: R9 k; O2 v        /*Set the AD7606_PAR_BUSY to the input mode*/
# P8 U3 Q# b7 s# ?4 A# S) k        //初始化5.11、5.9 、 5.5为中断口& e4 l, g- C0 g4 f" o5 w$ ^" T
        GPIODirModeSet(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_V1, GPIO_DIR_INPUT);
& Q: U1 j+ B% ]# k0 r        GPIODirModeSet(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_V2, GPIO_DIR_INPUT);( s8 j+ F. X( H$ H$ I
        GPIODirModeSet(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_C, GPIO_DIR_INPUT);* U# t" o7 x# n6 Y: @9 r/ r
        //GPIODirModeSet(SOC_GPIO_0_REGS, AD7606_PAR_BUSY, GPIO_DIR_INPUT);
7 X' G, a+ D9 j/ z8 L/ g        /*Set the AD7606_PAR_BUSY to the Falling Edge Interrupt*/7 [' B( ]* r! n# {7 q- `. n, m
        GPIOIntTypeSet(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_V1, GPIO_INT_TYPE_FALLEDGE);
4 T' D( a( Z0 P- o; y7 y        GPIOIntTypeSet(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_V2, GPIO_INT_TYPE_FALLEDGE);& c# X$ e& j; d- P2 V& d
        GPIOIntTypeSet(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_C, GPIO_INT_TYPE_FALLEDGE);3 ]/ c) x& B' X
        //GPIOIntTypeSet(SOC_GPIO_0_REGS, AD7606_PAR_BUSY, GPIO_INT_TYPE_FALLEDGE);
! F3 ^4 e' x. q) i* O$ y5 u        /*The interrupt setting allows AD7606_PAR_BUSY_GPIO_BANK*/
0 y! p" ?7 o, v        GPIOBankIntEnable(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_GPIO_BANK);
$ e% F  v) f0 R7 N& v. a' f/ y) Y/ O$ p7 n" n% R" \
        GPIODirModeSet(SOC_GPIO_0_REGS, AD7606_PAR_RESET, GPIO_DIR_OUTPUT);
  Q' O3 h+ |* A  @# M        GPIOPinWrite(SOC_GPIO_0_REGS, AD7606_PAR_RESET, GPIO_PIN_HIGH);! T; }- `  D8 o* l
        Task_sleep(1000);5 F5 v) c2 I6 Y
        GPIOPinWrite(SOC_GPIO_0_REGS, AD7606_PAR_RESET, GPIO_PIN_LOW);$ u& T# B1 T7 Q) t6 z; p% d
        Task_sleep(1000);6 Z* j; y% m9 t

# f3 c% E* p  E* f! T        /*Set the AD7606_PAR_CONVST to output mode*/
: i- M/ j% y! z; U- a7 s        GPIODirModeSet(SOC_GPIO_0_REGS, AD7606_PAR_CONVST, GPIO_DIR_OUTPUT);
: o; h0 h7 e0 ?6 h4 X# o: H        GPIOPinWrite(SOC_GPIO_0_REGS, AD7606_PAR_CONVST, GPIO_PIN_LOW);- z; s2 g2 Z7 ], q5 P' h  j" f

+ {. r- g5 }7 T+ d9 Y2 N, y% g        GPIODirModeSet(SOC_GPIO_0_REGS, AD7606_PAR_RD, GPIO_DIR_OUTPUT);
# E% ^1 {. P/ m        GPIOPinWrite(SOC_GPIO_0_REGS, AD7606_PAR_RD, GPIO_PIN_HIGH);. F3 V) m0 K2 v: a
& L& ?% |, g; M! Q
}1 P, a2 |& D  y( H: p$ |$ p% P

7 k  ?) S, t9 I8 D- n
$ Y- W1 O0 y% }* g$ Hstatic void ad7606_busy_hwi(UArg ad_addr) {$ _: v5 Q- k1 a: {! q# b

- @8 q% h/ Y4 a' Y4 c- _0 u, _) x! Z2 _6 X# j2 f
        /* Disable the interrupts for pins of bank AD7606_PAR_BUSY in GPIO.*/8 X7 ]  ~/ S3 H: c# X2 x2 g- w
        GPIOBankIntDisable(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_GPIO_BANK);      //用仿真器debug,发现程序能进入这里。9 _& z( Y: O! G8 W% E( d5 n

$ P) G/ h4 x0 E3 f% O! I) j6 i        if(GPIOPinIntStatus(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_V1) == GPIO_INT_PEND)5 p% o% e5 w% J
        {
, }# }' w, f# y) X                GPIOPinIntClear(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_V1);                    //问题是:用仿真器debug,发现程序不能进入这里。. D6 s: o" I( }
                cs_addr = SOC_EMIFA_CS5_ADDR ;- x! ~5 n: A4 R# e3 P
                internal = 0 ;% O- P/ v8 j9 o0 i
                int_flag[0] = 1 ;
" x2 v  s$ \# W1 ^        }( v' o' y8 i( V+ Z  e% q
        if(GPIOPinIntStatus(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_V2) == GPIO_INT_PEND)
# Q# J3 V5 X2 ?5 m! ]        {
) W2 t& @, ?( r6 w                GPIOPinIntClear(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_V2); //问题是:用仿真器debug,发现程序不能进入这里。
  @: k2 n2 D. F$ \1 Q5 I  W                cs_addr = SOC_EMIFA_CS4_ADDR ;8 G3 M4 k- r# H% M! h% X2 z
                internal = 6 ;
; O# s$ X, F) w( i9 b! l" D                int_flag[1] = 1 ;
# u! S4 i# ^& o; k        }
' F! f' C7 Y! X! D7 O$ |" u( n( u9 K* Z        if(GPIOPinIntStatus(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_C) == GPIO_INT_PEND)
1 V: r3 g. N+ l% i' ]/ t! Q        {; e$ H% D5 V9 u' \( ^
                GPIOPinIntClear(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_C); //问题是:用仿真器debug,发现程序不能进入这里。
  f$ C: a4 J4 J1 _                cs_addr = SOC_EMIFA_CS2_ADDR ;: }4 \  f' ?" H4 }
                internal = 12 ;) }1 @6 Q& M4 T/ P2 G  s" u4 }7 y
                int_flag[2] = 1 ;/ m0 K$ \7 k9 Y$ T+ D# W
        }; N" @4 p5 h, d2 r7 l% X
  , z" n2 K- K, C8 I
        GPIOPinWrite(SOC_GPIO_0_REGS, AD7606_PAR_CONVST, GPIO_PIN_LOW);9 T" |# J4 N, c: s+ P
      
7 S9 k, v8 D# `9 ?        GPIOBankIntEnable(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_GPIO_BANK);
- \8 R$ q  H' C' ]7 z" U4 a}7 \, H) T8 u& R
/ K  A: G' H9 n( }9 ~% {( u: \
+ W% T$ ^7 h' U; M- M

* R: |" o6 m4 U, y3 w[attach]1369[/attach]
/ K! @& S% N' ]) \
作者: human    时间: 2016-9-18 19:35
你用单步调试,step into看看相应的函数值是否发生了变化




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