嵌入式开发者社区

标题: sysbios hwi 问题 [打印本页]

作者: vtinf    时间: 2016-8-31 16:23
标题: sysbios hwi 问题
您好。使用GPIO中断时,中断能进入ISR,但是不能区分具体的GPIO端口。程序如下:7 p% p& x- H5 N# l
#define AD7606_PAR_BUSY_GPIO_BANK        5) E  u9 s# W$ |3 U! b+ H
#define AD7606_PAR_BUSY_GPIO_BANK_INT        SYS_INT_GPIO_B5INT
+ r. `/ B9 o: b  P& N3 \( s8 _% b4 R8 T% S" t
#define AD7606_PAR_BUSY_V1                        GPIO_TO_PIN(5, 11)   //BANK5的中断口5.11
; Z/ a4 c4 F: B  o4 j# Y' W2 g#define AD7606_PAR_BUSY_V2                        GPIO_TO_PIN(5, 9)    //BANK5的中断口5.9. v4 y( v/ I. `* o  j
#define AD7606_PAR_BUSY_C                        GPIO_TO_PIN(5, 5)    //BANK5的中断口5.5
' i$ H6 I  f' t5 V  f' v) ^#define AD7606_PAR_BUSY                                GPIO_TO_PIN(5, 4)
! L  p; F/ q4 G
) U$ w4 n% o2 ~#define AD7606_PAR_CONVST                        GPIO_TO_PIN(5, 1)
$ ?1 T- V7 b5 y7 M; `3 X' I#define AD7606_PAR_RD                                GPIO_TO_PIN(5, 2)' M1 V3 |1 D' k! I: x4 E% ^6 K) M
#define AD7606_PAR_RESET                        GPIO_TO_PIN(5, 0)" N4 b% @7 a% [- o% [
- C6 ]5 t7 w/ W
8 y  D" F4 N) w8 Y& [* v  r

7 [% b7 ?' s, \: ~+ V  tstatic void ad7606_irq_setup(ad7606 *ad) {
4 r9 N( o8 I( {% j5 Q3 G        Hwi_Params hwiParams;- g0 d' V* V% k0 _/ F6 d( ?
        Hwi_Handle myHwi;
4 X, R! x0 B# m        Error_Block eb;. L# D) w- f1 ?( d7 q
' e. [/ r1 @3 j, d4 v" l& g
        Error_init(&eb);
7 j3 ]: z4 @& ~- D" {  N+ @$ J        Hwi_Params_init(&hwiParams);& s5 |5 k7 o$ ]9 o  N  T
        hwiParams.arg = (unsigned int)ad;3 Q/ C; ^- U# p: c( \. L& `
        hwiParams.enableInt = FALSE;2 Y( _9 [" e, @2 Y0 }
        hwiParams.eventId = SYS_INT_GPIO_B5INT;
! M2 ?& H3 E' v& b3 h! d        hwiParams.priority = 4;) M  M, e7 ^/ D1 g3 M" P8 f: J3 C3 K
        myHwi = Hwi_create(8, ad7606_busy_hwi, &hwiParams, &eb);       //注册BANK5中断处理函数# Q9 W0 T6 R" n& ~# C  M9 z  F
        if (myHwi == NULL)
3 K! O0 i6 R. H" g        LOG_FATAL("failed to create hwi");7 U" d  E' P9 s9 ^
; v4 a# s, A* c4 `9 L
        /* enable both interrupts */
9 k5 {* o6 M; u( ~. v9 q        Hwi_enableInterrupt(ad->irq_event);
- e9 A. W3 I7 `1 {1 L}/ z) K8 Q$ ?. m2 ]# U/ D4 U

- F, w3 E- A3 v$ O
; Y8 w& R* r6 Q! m" x; ]- Qstatic void ad7606_gpio_pinmux_setup(ad7606 *ad) {" e3 l+ w  T, n! w0 u6 ]
        volatile unsigned int savePinMux = 0;
* h* K" k" D4 [        //初始化5.11、5.9 、 5.5为GPIO口# T4 f  y7 w  e9 x
        savePinMux = HWREG(SOC_SYSCFG_0_REGS + SYSCFG0_PINMUX(11)) & (~(SYSCFG_PINMUX11_PINMUX11_27_24 | SYSCFG_PINMUX11_PINMUX11_19_16));
& i1 n: s* l; `8 O  ?
9 a. D8 B7 u! O, Z  T4 Q0 `4 O6 {* Q        HWREG(SOC_SYSCFG_0_REGS + SYSCFG0_PINMUX(11)) =        (PINMUX11_BUSY_V1_ENABLE | PINMUX11_BUSY_V2_ENABLE | savePinMux);
7 m: S! D2 c, [, a! Z3 x4 v& N) C9 f  v! L' 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));
$ x9 ]) G% ~' K7 O" a& |  ~/ J: ]1 z7 [7 |$ S2 @
        HWREG(SOC_SYSCFG_0_REGS + SYSCFG0_PINMUX(12)) =        (PINMUX12_RESET_ENABLE | PINMUX12_CONVST_ENABLE | PINMUX12_RD_ENABLE | PINMUX12_BUSY_C_ENABLE | savePinMux);8 Y6 Z$ S4 t( e; X
# R6 f" b- A1 U/ |
}8 e  G/ ^8 H6 p* q# R6 R( T; R& s

/ b; c: {! v  {6 j5 `& W6 ?% `. K# J! J8 C! J' {8 b
static void ad7606_gpio_setup(ad7606 *ad) {/ P2 L# X- F  C
        /*Set the AD7606_PAR_BUSY to the input mode*/
9 ~% Z0 V: \+ q7 g' \7 X% t( Q        //初始化5.11、5.9 、 5.5为中断口0 ]! z5 x8 u4 F" _" y; ?
        GPIODirModeSet(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_V1, GPIO_DIR_INPUT);
- {9 ?: b6 f& M7 l7 u        GPIODirModeSet(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_V2, GPIO_DIR_INPUT);& @5 K. E) {" ?7 \" S" s
        GPIODirModeSet(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_C, GPIO_DIR_INPUT);2 I+ E0 y* l4 R* _4 z; D
        //GPIODirModeSet(SOC_GPIO_0_REGS, AD7606_PAR_BUSY, GPIO_DIR_INPUT);
" ^* w' k; L  Z& Y9 C        /*Set the AD7606_PAR_BUSY to the Falling Edge Interrupt*/
) ?( a4 z+ R6 R        GPIOIntTypeSet(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_V1, GPIO_INT_TYPE_FALLEDGE);; n: b) B8 Q( k7 e" Q4 @
        GPIOIntTypeSet(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_V2, GPIO_INT_TYPE_FALLEDGE);
; G- j6 F2 I- H5 B        GPIOIntTypeSet(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_C, GPIO_INT_TYPE_FALLEDGE);& p1 y/ s- Z) `! D8 n
        //GPIOIntTypeSet(SOC_GPIO_0_REGS, AD7606_PAR_BUSY, GPIO_INT_TYPE_FALLEDGE);% Q$ q* S: K+ ]7 M/ e; H
        /*The interrupt setting allows AD7606_PAR_BUSY_GPIO_BANK*/  i" Y  s3 v4 o. @! d
        GPIOBankIntEnable(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_GPIO_BANK);
4 v9 ^0 T( H! o" ~5 M- X( I5 s1 x4 p
        GPIODirModeSet(SOC_GPIO_0_REGS, AD7606_PAR_RESET, GPIO_DIR_OUTPUT);
8 r" K) f! d8 I+ O( p1 o: x: C        GPIOPinWrite(SOC_GPIO_0_REGS, AD7606_PAR_RESET, GPIO_PIN_HIGH);- S6 v1 M9 Q) L2 f3 y
        Task_sleep(1000);0 ~9 R" f, U. j
        GPIOPinWrite(SOC_GPIO_0_REGS, AD7606_PAR_RESET, GPIO_PIN_LOW);, _; L0 G9 S* w/ X7 k
        Task_sleep(1000);+ i5 U# u) N, a1 `# J4 h

$ x# ~1 j  m) T        /*Set the AD7606_PAR_CONVST to output mode*/
: y  V6 }, M9 Z        GPIODirModeSet(SOC_GPIO_0_REGS, AD7606_PAR_CONVST, GPIO_DIR_OUTPUT);
: D. q, ^7 ^8 i" [- z2 n8 y4 f        GPIOPinWrite(SOC_GPIO_0_REGS, AD7606_PAR_CONVST, GPIO_PIN_LOW);
. D. n5 I% t3 N4 l  I
! e8 M4 O% g1 R        GPIODirModeSet(SOC_GPIO_0_REGS, AD7606_PAR_RD, GPIO_DIR_OUTPUT);
! P  e7 T# r' ]' R9 V, _$ t1 d        GPIOPinWrite(SOC_GPIO_0_REGS, AD7606_PAR_RD, GPIO_PIN_HIGH);2 V! V' x7 O: J( h$ T* s5 T; o

( S8 V  T2 R8 r- a+ C. r. R}
7 u  x3 b2 b- \. N6 H$ D1 c
' X  k( q8 O: {: |9 B' w' v4 B( K5 P% E: O" f
static void ad7606_busy_hwi(UArg ad_addr) {" J  Y% v9 t2 }7 ^6 `# l
3 B7 d9 B) ~0 c  p. a3 Z; z
+ N# x& Y$ L# Q! B
        /* Disable the interrupts for pins of bank AD7606_PAR_BUSY in GPIO.*/
" n: ]! w& }  x- c, j        GPIOBankIntDisable(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_GPIO_BANK);      //用仿真器debug,发现程序能进入这里。( S" u% a  Q( d4 I+ E3 F. o2 M7 J

2 T7 n: `  Z2 r7 b( ?9 G! ]$ b1 I- \! x        if(GPIOPinIntStatus(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_V1) == GPIO_INT_PEND)* }+ T7 M7 A. H$ J  u
        {
; |2 m: ]% Q0 t6 ~& I# {! C                GPIOPinIntClear(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_V1);                    //问题是:用仿真器debug,发现程序不能进入这里。
4 L3 r! a, K# G4 V6 \/ L3 k- ~: F                cs_addr = SOC_EMIFA_CS5_ADDR ;
$ P! f* P( n$ C' l  y, R! B/ F                internal = 0 ;
0 w  D3 B0 c* C; m, i2 I                int_flag[0] = 1 ;
6 c0 X9 o8 u* q( P8 j% {        }
# F/ f" S: ?! K9 `- O5 q4 g        if(GPIOPinIntStatus(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_V2) == GPIO_INT_PEND)/ U1 g- Y+ y+ g- r9 z
        {
# k6 q" h7 F9 y                GPIOPinIntClear(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_V2); //问题是:用仿真器debug,发现程序不能进入这里。' d! p, h/ ^0 _5 P: m% |+ X
                cs_addr = SOC_EMIFA_CS4_ADDR ;
* l, X0 \% ]0 c$ H5 a2 a& P9 r                internal = 6 ;
; Z' x$ c2 D* M( n; [0 z                int_flag[1] = 1 ;
6 h+ @4 f4 X+ Y  e        }
8 Q  G: b' f$ b" d1 d4 p. s        if(GPIOPinIntStatus(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_C) == GPIO_INT_PEND)
5 F: E$ e( f$ O2 Z" Z0 u& g        {
- O: s  O# R4 E  y                GPIOPinIntClear(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_C); //问题是:用仿真器debug,发现程序不能进入这里。
8 ~: f2 E! t( Z% G  A9 T7 d                cs_addr = SOC_EMIFA_CS2_ADDR ;
" r% I/ Q! y! U$ f3 F1 D                internal = 12 ;7 H7 ]4 {) z! T
                int_flag[2] = 1 ;5 r' {% a+ y& b5 U5 @, E
        }3 I# E; E2 Y1 T8 h0 p5 c
  $ W  `- g, D% l  |0 a
        GPIOPinWrite(SOC_GPIO_0_REGS, AD7606_PAR_CONVST, GPIO_PIN_LOW);% b5 A0 D, V1 m8 _7 A6 `
       / j9 }: O& X* t2 S3 b/ L
        GPIOBankIntEnable(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_GPIO_BANK);9 X6 }8 F3 ~8 S+ J" S: h0 M4 N
}
% o- k  {) j' r2 Q6 A- N; Z
8 J+ W' G4 A) E& W7 ^
作者: vtinf    时间: 2016-8-31 16:53
INTSTAT45状态如图
. I# n9 {" U% G& `$ v[attach]1368[/attach]& ?# l& j  {8 l; p1 \





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