嵌入式开发者社区

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

作者: vtinf    时间: 2016-8-31 17:29
标题: sysbios hwi 端口识别问题
您好。使用GPIO中断时,中断能进入ISR,但是不能区分具体的GPIO端口。程序如下:- b1 r6 q8 J: B4 O
#define AD7606_PAR_BUSY_GPIO_BANK        5
0 T) A" ]: G2 ?9 k7 ]  k. `$ g#define AD7606_PAR_BUSY_GPIO_BANK_INT        SYS_INT_GPIO_B5INT
6 q- o" d) B' w$ E: n: k6 j" O5 {  t4 f( p0 I
#define AD7606_PAR_BUSY_V1                        GPIO_TO_PIN(5, 11)   //BANK5的中断口5.11
; ]) ]6 j- t7 g- L5 A5 [#define AD7606_PAR_BUSY_V2                        GPIO_TO_PIN(5, 9)    //BANK5的中断口5.9% T1 w( v7 O+ X: h6 }& \7 w
#define AD7606_PAR_BUSY_C                        GPIO_TO_PIN(5, 5)    //BANK5的中断口5.5& N+ I) o& u6 R, `( M+ {0 N
#define AD7606_PAR_BUSY                                GPIO_TO_PIN(5, 4)
* j7 c1 ]& n- _: s) U7 W( `" I/ l1 g) N7 l7 c0 x+ O* `9 d/ j
#define AD7606_PAR_CONVST                        GPIO_TO_PIN(5, 1)/ J8 o9 h7 e' Y( m  Q
#define AD7606_PAR_RD                                GPIO_TO_PIN(5, 2)
* L2 z* [0 c! _! e0 W' ~/ L& \, J#define AD7606_PAR_RESET                        GPIO_TO_PIN(5, 0)! Z4 D2 ?9 v8 Y% w4 }7 Y+ D
$ ]( m3 Z* F8 R. n! m8 G

3 `5 T, ?3 m8 T) q" _" d. \% p* F7 y7 `' J5 x" p
static void ad7606_irq_setup(ad7606 *ad) {/ {' q: X) P$ a9 y) ]
        Hwi_Params hwiParams;
5 F: h/ P9 O4 f1 |0 H1 {4 k' j        Hwi_Handle myHwi;: Q/ d( ~' B# O+ z* N
        Error_Block eb;
+ C) ^0 q! I  n( C* ^5 a" d- I. D, H& |* E- f+ [
        Error_init(&eb);& o9 \7 O. w; }- r+ M' A
        Hwi_Params_init(&hwiParams);3 S! k9 g1 m2 p% }. P& ]6 d
        hwiParams.arg = (unsigned int)ad;
8 q, C  \$ R+ K        hwiParams.enableInt = FALSE;9 a0 ^$ t- H' d+ V
        hwiParams.eventId = SYS_INT_GPIO_B5INT;
2 c) V: _8 @; P, @3 C, K) z8 I6 P        hwiParams.priority = 4;  s* V9 t. h6 K4 B
        myHwi = Hwi_create(8, ad7606_busy_hwi, &hwiParams, &eb);       //注册BANK5中断处理函数
4 v( {0 S/ r# G8 q- h! X        if (myHwi == NULL)
( n4 E. |  ^3 K7 I" a$ H        LOG_FATAL("failed to create hwi");
) G1 X( Y: Z0 l7 l# e! k( |% n+ n: e0 o1 j4 u2 J: k" W
        /* enable both interrupts */) G& ]- Q7 i( a
        Hwi_enableInterrupt(ad->irq_event);+ r4 O0 Q! I% B9 n; _3 Q
}3 Y4 A, l: [  R, M3 |" z

3 i3 ~6 r) v6 G4 L. s& Y
. T2 l5 ^1 B2 e0 hstatic void ad7606_gpio_pinmux_setup(ad7606 *ad) {
9 }% G5 ~2 T) e$ W        volatile unsigned int savePinMux = 0;
- O, w1 a4 W+ I3 B$ h# J        //初始化5.11、5.9 、 5.5为GPIO口
8 s' T: B4 _+ R) W. m8 q* O        savePinMux = HWREG(SOC_SYSCFG_0_REGS + SYSCFG0_PINMUX(11)) & (~(SYSCFG_PINMUX11_PINMUX11_27_24 | SYSCFG_PINMUX11_PINMUX11_19_16));
7 s! q& L. x# e$ H4 v+ H4 `# |; l; V
        HWREG(SOC_SYSCFG_0_REGS + SYSCFG0_PINMUX(11)) =        (PINMUX11_BUSY_V1_ENABLE | PINMUX11_BUSY_V2_ENABLE | savePinMux);) u' Q# ~. k, j" |) Y
# S8 @% |% T* Q/ y5 @
        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));  X. I8 c9 _6 @: \# m0 f1 M

; R9 P1 C# i; ~* s4 ?6 Q9 I, w5 U! ^        HWREG(SOC_SYSCFG_0_REGS + SYSCFG0_PINMUX(12)) =        (PINMUX12_RESET_ENABLE | PINMUX12_CONVST_ENABLE | PINMUX12_RD_ENABLE | PINMUX12_BUSY_C_ENABLE | savePinMux);
4 T" D! k" h4 I' L
' @! \% e* u" l. Q" C}$ I( ]7 q. |) _( U( h/ ~5 R

# m4 z) c- z1 T3 @
7 e  w# s+ w! r; X4 J9 V% h+ zstatic void ad7606_gpio_setup(ad7606 *ad) {
' s7 l8 I0 I: i$ Z% V        /*Set the AD7606_PAR_BUSY to the input mode*/1 ?# B4 J1 W" U& Q  l2 M
        //初始化5.11、5.9 、 5.5为中断口* Z& O; c  r# S( }; d( @
        GPIODirModeSet(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_V1, GPIO_DIR_INPUT);
8 g/ ~1 y# |. i; ?; K: c6 |' w        GPIODirModeSet(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_V2, GPIO_DIR_INPUT);, U5 c. C3 D+ e
        GPIODirModeSet(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_C, GPIO_DIR_INPUT);6 |- C+ s- e  J! ]
        //GPIODirModeSet(SOC_GPIO_0_REGS, AD7606_PAR_BUSY, GPIO_DIR_INPUT);
5 i( y! u) \1 ?6 m6 P        /*Set the AD7606_PAR_BUSY to the Falling Edge Interrupt*/( r7 O& a- q; f
        GPIOIntTypeSet(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_V1, GPIO_INT_TYPE_FALLEDGE);/ I* ]: j# M3 d
        GPIOIntTypeSet(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_V2, GPIO_INT_TYPE_FALLEDGE);
, H, p0 }8 [6 f* h$ [* z        GPIOIntTypeSet(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_C, GPIO_INT_TYPE_FALLEDGE);
. N8 Y" n) }) p3 L. ^, y" w6 e        //GPIOIntTypeSet(SOC_GPIO_0_REGS, AD7606_PAR_BUSY, GPIO_INT_TYPE_FALLEDGE);. _$ H& D1 A1 t* l+ w* c
        /*The interrupt setting allows AD7606_PAR_BUSY_GPIO_BANK*/: T) e8 e: ?: Y1 A  Z  @% p
        GPIOBankIntEnable(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_GPIO_BANK);
+ x0 g; T; i$ J# B. q# |' a* h
5 c: w- M$ j0 B" y4 x2 s8 F        GPIODirModeSet(SOC_GPIO_0_REGS, AD7606_PAR_RESET, GPIO_DIR_OUTPUT);2 ?/ ^& y2 \5 |* [3 a
        GPIOPinWrite(SOC_GPIO_0_REGS, AD7606_PAR_RESET, GPIO_PIN_HIGH);8 g0 L# P2 W! D* I
        Task_sleep(1000);
6 P* O, p  F! z* y        GPIOPinWrite(SOC_GPIO_0_REGS, AD7606_PAR_RESET, GPIO_PIN_LOW);1 m# a  l2 g% I- }
        Task_sleep(1000);' P3 h+ v  f3 |, P  O: D* v
! q! n% n6 [, c  e" B
        /*Set the AD7606_PAR_CONVST to output mode*/
5 t4 X$ i" o5 w2 K        GPIODirModeSet(SOC_GPIO_0_REGS, AD7606_PAR_CONVST, GPIO_DIR_OUTPUT);; n' r3 x3 ^9 t0 x( j, `
        GPIOPinWrite(SOC_GPIO_0_REGS, AD7606_PAR_CONVST, GPIO_PIN_LOW);
% j" h; I& x: Y' ?. E3 X$ `3 v
% l- \; H( Y: h( |* A        GPIODirModeSet(SOC_GPIO_0_REGS, AD7606_PAR_RD, GPIO_DIR_OUTPUT);
8 g/ B7 D! X6 n( p& z9 v4 `3 y# A        GPIOPinWrite(SOC_GPIO_0_REGS, AD7606_PAR_RD, GPIO_PIN_HIGH);: F0 |/ W# y  \( q3 f8 I
% `. E, R9 x" V( V/ H( X+ H
}& Y8 [* N7 Q; }# B- N+ c

- e8 Y; K3 T  M
- v$ G! S' f6 h$ Ustatic void ad7606_busy_hwi(UArg ad_addr) {
9 V$ a# d7 ], a% @$ G* Y. m
* X3 r/ Y$ Q- t* ~# t' h$ x  b6 k7 x
) J, P9 k! h; k5 o) ^0 S        /* Disable the interrupts for pins of bank AD7606_PAR_BUSY in GPIO.*/0 H9 q; x  _8 r6 \
        GPIOBankIntDisable(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_GPIO_BANK);      //用仿真器debug,发现程序能进入这里。4 r: b! ]6 D7 D; ?; Y/ ?

, _, M7 ~1 R& S        if(GPIOPinIntStatus(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_V1) == GPIO_INT_PEND)  l. f$ Q* D/ b
        {  [- E+ k2 O9 A8 ]0 O
                GPIOPinIntClear(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_V1);                    //问题是:用仿真器debug,发现程序不能进入这里。
3 x0 R% Y, i% S* `: {/ o- \                cs_addr = SOC_EMIFA_CS5_ADDR ;
' U! d- G! z- g                internal = 0 ;' [6 \1 J$ A" c, l# W4 K
                int_flag[0] = 1 ;* p6 `5 V1 \. J0 t. ]( L
        }8 L. {% v1 d% @7 l1 v
        if(GPIOPinIntStatus(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_V2) == GPIO_INT_PEND)
6 A! r: F" P0 A0 N* J- {        {& |. `. v; d% H  t- G! X+ q* Y
                GPIOPinIntClear(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_V2); //问题是:用仿真器debug,发现程序不能进入这里。
0 i  ^( e2 ^' l" g2 @; Z                cs_addr = SOC_EMIFA_CS4_ADDR ;/ \- Y! r* p4 f# U
                internal = 6 ;" t" T2 D) j5 f1 P5 @
                int_flag[1] = 1 ;% U" H& i4 `" T( T% u- |3 n+ e
        }" [9 M6 D9 q" u( Y% g
        if(GPIOPinIntStatus(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_C) == GPIO_INT_PEND)
4 x  O, A) f4 S2 T0 R        {
; d. F' s$ t) c  V4 r+ J                GPIOPinIntClear(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_C); //问题是:用仿真器debug,发现程序不能进入这里。
9 V$ I( l8 C3 \; R& i* O4 d                cs_addr = SOC_EMIFA_CS2_ADDR ;
  N. \0 R7 _) q, M( t                internal = 12 ;6 c6 ^1 q7 k0 [, x* k# M
                int_flag[2] = 1 ;
8 \8 F( y! f# k' [9 y6 P- X# ]        }1 U3 @( d% {# C! z$ P3 }
  
% c, X( y4 N) b: m0 d5 |        GPIOPinWrite(SOC_GPIO_0_REGS, AD7606_PAR_CONVST, GPIO_PIN_LOW);
3 k7 v* p& b6 ^- X$ q       / s7 D8 u, R, b7 v
        GPIOBankIntEnable(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_GPIO_BANK);
5 s" H: O0 o4 k}$ a. T) v$ Z" ]8 f, T' V

8 d+ m' @" V  ?1 U& [
  i# O) E& Q5 X" Z1 H3 n5 d% n
% A4 q5 o- W0 l4 `, G# j[attach]1369[/attach]
" x$ ]8 Z% v- p& O* Q
作者: human    时间: 2016-9-18 19:35
你用单步调试,step into看看相应的函数值是否发生了变化




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