嵌入式开发者社区

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

作者: vtinf    时间: 2016-8-31 17:29
标题: sysbios hwi 端口识别问题
您好。使用GPIO中断时,中断能进入ISR,但是不能区分具体的GPIO端口。程序如下:% s7 y/ Q( y5 ]# J6 O
#define AD7606_PAR_BUSY_GPIO_BANK        5
5 E3 T2 o) ~, E- B( k1 P9 o! l#define AD7606_PAR_BUSY_GPIO_BANK_INT        SYS_INT_GPIO_B5INT- `5 ?: e: z9 Q$ y7 E  i

( a8 H# R  _* h* l$ Y#define AD7606_PAR_BUSY_V1                        GPIO_TO_PIN(5, 11)   //BANK5的中断口5.11
0 i2 W( C6 X' F2 G  m1 J1 L9 T#define AD7606_PAR_BUSY_V2                        GPIO_TO_PIN(5, 9)    //BANK5的中断口5.9
1 C* O' J$ E1 R! ^#define AD7606_PAR_BUSY_C                        GPIO_TO_PIN(5, 5)    //BANK5的中断口5.5. B' b4 g/ Z+ u
#define AD7606_PAR_BUSY                                GPIO_TO_PIN(5, 4)8 e1 M0 X. R  ?7 @3 A. P0 }
" M8 P0 @& P+ I: ~- }& m
#define AD7606_PAR_CONVST                        GPIO_TO_PIN(5, 1)6 G' }- Z6 N- d* C
#define AD7606_PAR_RD                                GPIO_TO_PIN(5, 2)
- b/ b" M+ J# R7 h$ b#define AD7606_PAR_RESET                        GPIO_TO_PIN(5, 0); Z- n8 o' K) i5 @
% S0 E# T8 m7 ~) |1 s1 ^

/ i7 g% n+ y5 t2 ~5 E7 y+ R+ O/ L2 L9 V; a1 n! k
static void ad7606_irq_setup(ad7606 *ad) {
% ?# h* Z% r# R3 C  D; m        Hwi_Params hwiParams;! s: R- i8 y% w- j! N* `+ Z% P% Y
        Hwi_Handle myHwi;4 v5 r9 o8 j1 W2 u. S% A# z  t
        Error_Block eb;( m" b5 v% V+ c8 Z. e; {& M

8 Y- K5 k& u$ p- ^        Error_init(&eb);
% w' @% q. m% T        Hwi_Params_init(&hwiParams);4 O7 s; h0 ?  x: Q$ e
        hwiParams.arg = (unsigned int)ad;  ^1 v. O, D( R  P% A+ B  w
        hwiParams.enableInt = FALSE;
2 V3 d, S5 x" z        hwiParams.eventId = SYS_INT_GPIO_B5INT;
; o+ \7 f7 j+ O3 f; ^        hwiParams.priority = 4;8 Q% Y8 {/ l& i% S: w; m' m' w
        myHwi = Hwi_create(8, ad7606_busy_hwi, &hwiParams, &eb);       //注册BANK5中断处理函数
. l3 r7 N; k/ S2 E9 s) T' `1 _2 Y3 v        if (myHwi == NULL)
) [1 L' z5 G3 V# W: {        LOG_FATAL("failed to create hwi");
0 o2 c; ]8 Z7 ~) S1 ~3 L! O! M0 B" ~
( F0 v1 j5 T" l8 z6 s/ P0 l        /* enable both interrupts */% I. O: h8 c; y/ ^  u; {
        Hwi_enableInterrupt(ad->irq_event);4 m( a; Q/ v! K
}( n9 Y9 i0 K; W; B& J4 U
) B- H( i1 ~% D
$ a/ p  A/ W& f( n
static void ad7606_gpio_pinmux_setup(ad7606 *ad) {- l& _+ g9 n9 H
        volatile unsigned int savePinMux = 0;
: f5 |, {: L: o        //初始化5.11、5.9 、 5.5为GPIO口
7 ~; f3 Z! q* a  V1 B# B4 J        savePinMux = HWREG(SOC_SYSCFG_0_REGS + SYSCFG0_PINMUX(11)) & (~(SYSCFG_PINMUX11_PINMUX11_27_24 | SYSCFG_PINMUX11_PINMUX11_19_16));
% f2 ]' x, g! ?7 e8 s& B
  |/ Z* `# i3 t: v        HWREG(SOC_SYSCFG_0_REGS + SYSCFG0_PINMUX(11)) =        (PINMUX11_BUSY_V1_ENABLE | PINMUX11_BUSY_V2_ENABLE | savePinMux);
0 j- e% \" L4 H. W0 @! w% k# f9 A# }( @6 M9 V
        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));
. D9 a1 d0 L7 h' z4 G+ h! Y0 l
# s, t- Z- J1 o        HWREG(SOC_SYSCFG_0_REGS + SYSCFG0_PINMUX(12)) =        (PINMUX12_RESET_ENABLE | PINMUX12_CONVST_ENABLE | PINMUX12_RD_ENABLE | PINMUX12_BUSY_C_ENABLE | savePinMux);
; r2 X1 c% e3 o0 ]+ C: v+ Q. O* P( J7 d0 N4 t% R* o, T
}+ h1 o/ e/ Y' i
3 E9 o7 [4 z% v
+ p5 W7 j& B$ P: ~0 l9 J
static void ad7606_gpio_setup(ad7606 *ad) {
4 m* v4 T2 ]; C7 V. B/ C        /*Set the AD7606_PAR_BUSY to the input mode*/
4 q' G4 Z! Q# ^( i# ^0 I        //初始化5.11、5.9 、 5.5为中断口) s2 K! u& Q& q" h; I
        GPIODirModeSet(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_V1, GPIO_DIR_INPUT);
3 H: A3 g, f. A7 i" D        GPIODirModeSet(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_V2, GPIO_DIR_INPUT);$ K6 {8 o. i: K) f( i
        GPIODirModeSet(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_C, GPIO_DIR_INPUT);6 x6 }; M0 p1 c! I# N
        //GPIODirModeSet(SOC_GPIO_0_REGS, AD7606_PAR_BUSY, GPIO_DIR_INPUT);
$ \& v8 L  B; F$ F8 {. A        /*Set the AD7606_PAR_BUSY to the Falling Edge Interrupt*/
1 Y6 B8 F  v" D8 m- g0 P4 \, M        GPIOIntTypeSet(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_V1, GPIO_INT_TYPE_FALLEDGE);
4 f& t( ~# N, ~8 l7 G        GPIOIntTypeSet(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_V2, GPIO_INT_TYPE_FALLEDGE);
+ c; \4 J" }4 f; I& v        GPIOIntTypeSet(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_C, GPIO_INT_TYPE_FALLEDGE);4 z, b+ ^0 u4 l- x
        //GPIOIntTypeSet(SOC_GPIO_0_REGS, AD7606_PAR_BUSY, GPIO_INT_TYPE_FALLEDGE);* L) o0 T+ {/ @2 z
        /*The interrupt setting allows AD7606_PAR_BUSY_GPIO_BANK*/
3 I" o/ z, g% v        GPIOBankIntEnable(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_GPIO_BANK);
  d6 O6 A8 P. C8 h  \
- |  T: K7 S; l        GPIODirModeSet(SOC_GPIO_0_REGS, AD7606_PAR_RESET, GPIO_DIR_OUTPUT);1 l' e: y! J" a9 z0 p9 K. ]
        GPIOPinWrite(SOC_GPIO_0_REGS, AD7606_PAR_RESET, GPIO_PIN_HIGH);( _/ v0 }. M) s8 x
        Task_sleep(1000);
8 o" q* p0 [0 l, _        GPIOPinWrite(SOC_GPIO_0_REGS, AD7606_PAR_RESET, GPIO_PIN_LOW);; [$ T' d5 F( X+ g
        Task_sleep(1000);' L) v; L4 v. p2 J8 i
9 \/ ~8 f6 ?0 k1 y/ e) c+ Y
        /*Set the AD7606_PAR_CONVST to output mode*/
! O3 R3 p5 {+ B        GPIODirModeSet(SOC_GPIO_0_REGS, AD7606_PAR_CONVST, GPIO_DIR_OUTPUT);
  s8 E8 |8 \; E  {, @& f1 }        GPIOPinWrite(SOC_GPIO_0_REGS, AD7606_PAR_CONVST, GPIO_PIN_LOW);2 E# z1 K1 C* b  t; [
, E( X/ r. C; |2 R" q
        GPIODirModeSet(SOC_GPIO_0_REGS, AD7606_PAR_RD, GPIO_DIR_OUTPUT);
' ?4 A3 A9 m  W; g: i0 l- n) h. X        GPIOPinWrite(SOC_GPIO_0_REGS, AD7606_PAR_RD, GPIO_PIN_HIGH);
8 i% y# b2 I- y* w! q! v) E' I% j. c4 m. l# h7 A: s2 |" y# Q: M5 {
}! \6 R8 t. V6 z3 j9 K

5 o. r& e- n  g
9 a) Y/ U3 \# N6 E3 sstatic void ad7606_busy_hwi(UArg ad_addr) {0 ~; \8 c; O* [( a4 _
7 n6 i1 I" w# \" v

! j4 _* t  [% X4 [: f        /* Disable the interrupts for pins of bank AD7606_PAR_BUSY in GPIO.*/
8 X) O9 \- m7 f1 q" b        GPIOBankIntDisable(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_GPIO_BANK);      //用仿真器debug,发现程序能进入这里。
  a: q% K" _) k" ]6 \6 d, J7 T( y: w8 W+ R) J+ y& M
        if(GPIOPinIntStatus(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_V1) == GPIO_INT_PEND), j, R: K7 I& R! b, A
        {' z' [6 ?1 ?& F1 m2 ]* x# z
                GPIOPinIntClear(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_V1);                    //问题是:用仿真器debug,发现程序不能进入这里。
# e+ K1 k+ m4 I( z8 ?$ @3 K6 H                cs_addr = SOC_EMIFA_CS5_ADDR ;
* ^* i0 s( A3 p( V2 O                internal = 0 ;
0 N, y: w( Y6 p  e% H( F& v                int_flag[0] = 1 ;
9 c0 o- |  l+ o/ ]3 X) F        }# L; ^; N: `  i# c7 y/ j2 o
        if(GPIOPinIntStatus(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_V2) == GPIO_INT_PEND)
# j) Z' [. b. ~. q        {' S3 K* z5 `# w. F; L  v) z# v+ U
                GPIOPinIntClear(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_V2); //问题是:用仿真器debug,发现程序不能进入这里。# e- L9 K2 L3 v2 T
                cs_addr = SOC_EMIFA_CS4_ADDR ;
4 Y& M7 j. c0 H' q4 x+ |- Q2 J                internal = 6 ;. M' }" M$ ~) i0 t, @  m
                int_flag[1] = 1 ;
0 C: P0 R0 E- w3 s; T3 L, K        }
- l) y2 _4 ^; e! }        if(GPIOPinIntStatus(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_C) == GPIO_INT_PEND)
2 k# V' s; `+ Q1 S        {
+ J+ o+ Q& }. w3 H                GPIOPinIntClear(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_C); //问题是:用仿真器debug,发现程序不能进入这里。
* I: |) @" G1 o& H                cs_addr = SOC_EMIFA_CS2_ADDR ;
. H1 A* l2 n6 j2 e& d- z                internal = 12 ;7 F3 Q! Y3 A& U' }, z& O* Z
                int_flag[2] = 1 ;
, m* [: C5 b3 Z2 S$ r        }
* W; V1 g6 T. d3 D  - b% x- R- p0 I! _
        GPIOPinWrite(SOC_GPIO_0_REGS, AD7606_PAR_CONVST, GPIO_PIN_LOW);0 [7 T5 B9 c% J& X$ J3 q: u5 g
       ' B- o8 k* f+ K! a( g
        GPIOBankIntEnable(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_GPIO_BANK);
4 z) C* j% K% I; O! a' J, e7 e}
( ?; M) {+ ?; i: x7 |+ C. N% j2 ?2 `# d# d2 ?8 O9 `7 {6 B) j

0 r1 ?+ X6 m9 E- \/ a2 Q# b6 z, z) [3 Y" I
[attach]1369[/attach]6 o- I& q- [4 Z0 ]

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




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