嵌入式开发者社区

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

作者: vtinf    时间: 2016-8-31 17:29
标题: sysbios hwi 端口识别问题
您好。使用GPIO中断时,中断能进入ISR,但是不能区分具体的GPIO端口。程序如下:
6 ~2 j; p0 b% i+ u#define AD7606_PAR_BUSY_GPIO_BANK        5
! T2 ]! x) o' R' t1 v#define AD7606_PAR_BUSY_GPIO_BANK_INT        SYS_INT_GPIO_B5INT" q+ |, |* q& q% K4 S

4 x+ |; p1 B) t. z! c#define AD7606_PAR_BUSY_V1                        GPIO_TO_PIN(5, 11)   //BANK5的中断口5.11
% [- M2 P# Q; ^#define AD7606_PAR_BUSY_V2                        GPIO_TO_PIN(5, 9)    //BANK5的中断口5.9
& _: S! E( \, ]8 r/ `6 R2 h4 [5 s#define AD7606_PAR_BUSY_C                        GPIO_TO_PIN(5, 5)    //BANK5的中断口5.5
4 G; E* V6 R$ ~#define AD7606_PAR_BUSY                                GPIO_TO_PIN(5, 4)
8 ~. {( W, U5 H- H0 ], o; V1 |9 B2 z7 D0 w/ t% K
#define AD7606_PAR_CONVST                        GPIO_TO_PIN(5, 1)  J0 Q  `4 {0 d& Q' T5 B* X7 a9 t  O
#define AD7606_PAR_RD                                GPIO_TO_PIN(5, 2): O8 {9 l4 n+ y
#define AD7606_PAR_RESET                        GPIO_TO_PIN(5, 0)
3 G* \! r4 n; O* B6 M7 ^1 _+ P
. Q% B" t! }. s' Y5 X* p% K6 ^. v
2 l2 u/ J8 P- [& q9 T4 u5 F% U# l2 p' J; G* L
static void ad7606_irq_setup(ad7606 *ad) {2 d$ w+ S$ ^  t
        Hwi_Params hwiParams;! Y6 q: {5 {6 R, {# d% u
        Hwi_Handle myHwi;2 X/ A. Y6 ]% r6 a; q; ^- s
        Error_Block eb;2 w% T! {- z4 w5 J: M

5 Z. F' f0 q9 s6 z        Error_init(&eb);
- v7 u' ]; f0 t7 B. E9 n        Hwi_Params_init(&hwiParams);
: v4 K" V9 {& y! W( W+ w5 l        hwiParams.arg = (unsigned int)ad;
, q' z, }5 N$ @6 Z/ a. h        hwiParams.enableInt = FALSE;* Z2 M: x/ p% p9 r; m/ s/ J
        hwiParams.eventId = SYS_INT_GPIO_B5INT;
: \5 l5 M2 h  ^4 |        hwiParams.priority = 4;
9 _3 X- b% j4 e0 \, l8 h        myHwi = Hwi_create(8, ad7606_busy_hwi, &hwiParams, &eb);       //注册BANK5中断处理函数
4 P7 E- Q% N9 N9 }" o3 D        if (myHwi == NULL)
# j9 E. l3 R+ s! K- Z        LOG_FATAL("failed to create hwi");
- ?# J# L4 Q+ H7 @" N
; r! ~  w9 J+ n& D6 i        /* enable both interrupts */9 F* g8 p! Z) c. N* `/ ?) m- b
        Hwi_enableInterrupt(ad->irq_event);
, ]3 B& l, I. D* T& ~5 S8 m}
+ D; h" y5 |' X/ M7 _# w3 Z7 h  r& j5 W/ a' H" y
' z7 O4 i$ m! n
static void ad7606_gpio_pinmux_setup(ad7606 *ad) {
6 H. F- {' A9 y! W; @, S        volatile unsigned int savePinMux = 0;
+ X# N- n8 ^' c3 F: U        //初始化5.11、5.9 、 5.5为GPIO口4 S! a4 a6 d; Y& K0 d' L
        savePinMux = HWREG(SOC_SYSCFG_0_REGS + SYSCFG0_PINMUX(11)) & (~(SYSCFG_PINMUX11_PINMUX11_27_24 | SYSCFG_PINMUX11_PINMUX11_19_16));
9 Z6 n# P. F7 J. Y
# j, B8 O* G0 Z) r9 h' W; B        HWREG(SOC_SYSCFG_0_REGS + SYSCFG0_PINMUX(11)) =        (PINMUX11_BUSY_V1_ENABLE | PINMUX11_BUSY_V2_ENABLE | savePinMux);
1 ~& ?; ?; X+ i8 t6 S
8 |; Z# k. x- b2 y        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));
( q8 M; {' X& m- ?* n3 ]' ]* Q( y& u) I
        HWREG(SOC_SYSCFG_0_REGS + SYSCFG0_PINMUX(12)) =        (PINMUX12_RESET_ENABLE | PINMUX12_CONVST_ENABLE | PINMUX12_RD_ENABLE | PINMUX12_BUSY_C_ENABLE | savePinMux);
( I1 D$ B& r  K6 `8 T% t* M  j2 \8 w9 b- ]( Z6 I5 w3 Z
}
+ |8 ]: R, ?: I# x; O' O/ J
, R* t9 J, U6 T0 ^) Z4 i$ q- e% s
# E/ g4 T2 i5 F4 E! i9 Rstatic void ad7606_gpio_setup(ad7606 *ad) {) u8 D5 W7 L1 l: B$ A# L
        /*Set the AD7606_PAR_BUSY to the input mode*/0 c# V: N& c# t8 j2 e! v/ y
        //初始化5.11、5.9 、 5.5为中断口
2 E- t( L$ D- s* f* \& `        GPIODirModeSet(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_V1, GPIO_DIR_INPUT);5 m$ J9 ?' W" Z, p! m7 S
        GPIODirModeSet(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_V2, GPIO_DIR_INPUT);1 p0 E9 @& S% a) n7 X1 I
        GPIODirModeSet(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_C, GPIO_DIR_INPUT);
/ a% Q0 p- R5 k5 a        //GPIODirModeSet(SOC_GPIO_0_REGS, AD7606_PAR_BUSY, GPIO_DIR_INPUT);& [3 {2 E" D! q; Q2 I# w
        /*Set the AD7606_PAR_BUSY to the Falling Edge Interrupt*/# f8 T1 u* |3 j
        GPIOIntTypeSet(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_V1, GPIO_INT_TYPE_FALLEDGE);
  e$ Z2 P4 o6 ]- _/ _$ {/ x        GPIOIntTypeSet(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_V2, GPIO_INT_TYPE_FALLEDGE);
/ A- j8 A* C/ I        GPIOIntTypeSet(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_C, GPIO_INT_TYPE_FALLEDGE);% j/ t/ J3 _9 w& U9 e, K0 F
        //GPIOIntTypeSet(SOC_GPIO_0_REGS, AD7606_PAR_BUSY, GPIO_INT_TYPE_FALLEDGE);5 P0 |5 |# z2 H6 i+ e  A$ J
        /*The interrupt setting allows AD7606_PAR_BUSY_GPIO_BANK*/
+ u) ~& ^, _) V5 F$ u1 {4 [4 e        GPIOBankIntEnable(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_GPIO_BANK);
" F/ \+ t3 y5 a* ?
6 z6 q, s8 F5 c  l5 G- H4 f        GPIODirModeSet(SOC_GPIO_0_REGS, AD7606_PAR_RESET, GPIO_DIR_OUTPUT);
* j) s( S, s0 k4 ^- @        GPIOPinWrite(SOC_GPIO_0_REGS, AD7606_PAR_RESET, GPIO_PIN_HIGH);& F0 c- e- A4 H% [5 \9 I
        Task_sleep(1000);
2 r/ K% S  Y" S- v1 h5 l        GPIOPinWrite(SOC_GPIO_0_REGS, AD7606_PAR_RESET, GPIO_PIN_LOW);
* v" u! `& Y# Q; {; F        Task_sleep(1000);8 m% J+ M' x) I( F& f, z2 }
0 }/ U" }* G# U9 c
        /*Set the AD7606_PAR_CONVST to output mode*/3 \/ {! j( Y. `7 G: j
        GPIODirModeSet(SOC_GPIO_0_REGS, AD7606_PAR_CONVST, GPIO_DIR_OUTPUT);, K3 `& y8 a) J
        GPIOPinWrite(SOC_GPIO_0_REGS, AD7606_PAR_CONVST, GPIO_PIN_LOW);7 P! a2 Z5 ~4 V- J0 W
/ F( a3 G1 a0 g7 @
        GPIODirModeSet(SOC_GPIO_0_REGS, AD7606_PAR_RD, GPIO_DIR_OUTPUT);
5 B9 g7 ~# p# O: j        GPIOPinWrite(SOC_GPIO_0_REGS, AD7606_PAR_RD, GPIO_PIN_HIGH);
4 ~' O. j/ S' A: K
$ {  ~0 Z9 v* h/ |1 C}
+ {& P3 P5 ^% q% i0 p, ^) |6 D- q* W
8 n/ t! @! ]3 l/ `! ^4 {- P. u6 f
static void ad7606_busy_hwi(UArg ad_addr) {9 g+ _8 p! O( t4 _9 R8 e% N; y+ H

; h* e$ [7 o" |, O1 z4 A% o7 b0 @, \. `) D; \! y
        /* Disable the interrupts for pins of bank AD7606_PAR_BUSY in GPIO.*/5 ~& J; e2 \  s  a
        GPIOBankIntDisable(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_GPIO_BANK);      //用仿真器debug,发现程序能进入这里。$ i6 I6 U) u; Y
( f3 k. a6 n* Y, v+ _* t
        if(GPIOPinIntStatus(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_V1) == GPIO_INT_PEND)
4 s+ a4 w) V% _4 Y5 A8 f        {
  X; q8 |8 k9 m0 y" S! B- Q                GPIOPinIntClear(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_V1);                    //问题是:用仿真器debug,发现程序不能进入这里。
0 E6 n. g0 R  }6 [& k8 d3 i6 R                cs_addr = SOC_EMIFA_CS5_ADDR ;7 Z6 H$ c* |0 P0 L6 C; A
                internal = 0 ;7 E! k6 O7 C& L2 j' n! \
                int_flag[0] = 1 ;, X) e3 q& O" T" H/ h* j, |
        }! \1 M+ }* F6 e6 ^$ W8 r  A2 S
        if(GPIOPinIntStatus(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_V2) == GPIO_INT_PEND)
/ W  A0 c1 B1 R) E        {8 S4 M) G* w/ h, c
                GPIOPinIntClear(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_V2); //问题是:用仿真器debug,发现程序不能进入这里。
3 L1 G/ i* v! v                cs_addr = SOC_EMIFA_CS4_ADDR ;
8 n3 u) z1 F6 Y                internal = 6 ;
" c# t; M. m0 G7 t+ {( Q  _                int_flag[1] = 1 ;8 U: V% F, Z$ j- x$ I( |- r9 U
        }1 s+ l6 @, j' A- H( G
        if(GPIOPinIntStatus(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_C) == GPIO_INT_PEND)
3 |/ W/ G2 h# K7 b, h" x& y/ S        {
! p! K, k& A# \( a+ ^' ~% R                GPIOPinIntClear(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_C); //问题是:用仿真器debug,发现程序不能进入这里。7 X' M- d( P* J2 W/ O0 }9 c
                cs_addr = SOC_EMIFA_CS2_ADDR ;& h1 j2 r' I" D& ~$ c
                internal = 12 ;
% T! Z5 R& u9 ~* j                int_flag[2] = 1 ;: J5 k3 B) I" l0 X+ p
        }
: c/ X+ K+ s% Z  
5 O" v+ b" O( ]2 r        GPIOPinWrite(SOC_GPIO_0_REGS, AD7606_PAR_CONVST, GPIO_PIN_LOW);6 n7 P/ I0 k% B% {0 G
      
! U$ b' K4 R& j3 L' m5 _& f        GPIOBankIntEnable(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_GPIO_BANK);
1 ?8 M, _9 c6 m: G- B" a}9 T/ M  h7 m0 V' L# v7 r3 b

. l* i  U0 Y$ r4 `' H+ h2 ?
% ]" x+ H. C. P; V6 B" t. ~
8 r* }9 o# d* R2 y[attach]1369[/attach]
) P# K4 B, t2 m. ~$ H
作者: human    时间: 2016-9-18 19:35
你用单步调试,step into看看相应的函数值是否发生了变化




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