嵌入式开发者社区

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

作者: vtinf    时间: 2016-8-31 16:23
标题: sysbios hwi 问题
您好。使用GPIO中断时,中断能进入ISR,但是不能区分具体的GPIO端口。程序如下:
& z& p2 p" r) A- z#define AD7606_PAR_BUSY_GPIO_BANK        5. F4 I0 K8 r5 K7 ~
#define AD7606_PAR_BUSY_GPIO_BANK_INT        SYS_INT_GPIO_B5INT$ k1 T6 R+ l6 w  w* }1 a
+ N0 w) Y1 p5 [) C/ A: X$ ~
#define AD7606_PAR_BUSY_V1                        GPIO_TO_PIN(5, 11)   //BANK5的中断口5.11' Y7 V& y* w% Q7 @/ B% s
#define AD7606_PAR_BUSY_V2                        GPIO_TO_PIN(5, 9)    //BANK5的中断口5.9
, k4 `. J- T9 L6 F4 I#define AD7606_PAR_BUSY_C                        GPIO_TO_PIN(5, 5)    //BANK5的中断口5.5
* R" P% ~8 {  e+ r; @#define AD7606_PAR_BUSY                                GPIO_TO_PIN(5, 4)! C7 Y% {) J6 |6 }/ \

! H, @; z1 w" h4 Z- E#define AD7606_PAR_CONVST                        GPIO_TO_PIN(5, 1)
# p/ Q! a( L& B% ~( {; H' p#define AD7606_PAR_RD                                GPIO_TO_PIN(5, 2)
& |' B% g9 d4 e, x4 E0 J$ a" k#define AD7606_PAR_RESET                        GPIO_TO_PIN(5, 0)  |  D) a4 r) \/ ]( v& k

* m9 x- Q' t2 r) Q' i) I( H8 c- a( D0 }

7 a7 Q" J0 O1 d& ~static void ad7606_irq_setup(ad7606 *ad) {
/ r1 Z( M1 C; H1 n        Hwi_Params hwiParams;5 [# l4 [6 A" L/ s9 d3 V  Y3 ^# R; p$ h
        Hwi_Handle myHwi;# H( ?& t! Q& ]+ C5 ?3 @
        Error_Block eb;
9 v5 Y% E5 s7 t8 _5 _$ @. K9 J2 @+ C$ @+ `3 o3 e
        Error_init(&eb);2 \! o* h8 m3 o( k5 f+ @
        Hwi_Params_init(&hwiParams);9 s2 Y  W: A8 G7 i9 Q; [5 n
        hwiParams.arg = (unsigned int)ad;) d+ m" A- C5 [1 J* i
        hwiParams.enableInt = FALSE;2 s2 D, o* ]  H2 e$ W. Q; U
        hwiParams.eventId = SYS_INT_GPIO_B5INT;9 R) q- r# B0 H5 N
        hwiParams.priority = 4;
- v6 w) b: s- X$ E, m        myHwi = Hwi_create(8, ad7606_busy_hwi, &hwiParams, &eb);       //注册BANK5中断处理函数: A' G3 t& j+ Z, B4 P  U. j
        if (myHwi == NULL) 1 F! Q. n( Z1 g0 M; U7 w
        LOG_FATAL("failed to create hwi");
9 G8 V! ^; _, U, C0 L
' l# b4 K# \' q' S  r        /* enable both interrupts */
% n% C' f6 R; \) t$ W        Hwi_enableInterrupt(ad->irq_event);
# B7 K5 B% ?8 l( z  O0 ?0 x4 R}
! \" [1 g+ t% n
9 w& K' \( |+ N8 l) _8 B# s
+ f" D- \# W) c6 N% d1 M5 Vstatic void ad7606_gpio_pinmux_setup(ad7606 *ad) {3 X/ H5 k+ |( O) n9 N$ k; y
        volatile unsigned int savePinMux = 0;* Q: k. f2 W! ]8 z' e
        //初始化5.11、5.9 、 5.5为GPIO口
* i- O- F: h; {8 I: d* d        savePinMux = HWREG(SOC_SYSCFG_0_REGS + SYSCFG0_PINMUX(11)) & (~(SYSCFG_PINMUX11_PINMUX11_27_24 | SYSCFG_PINMUX11_PINMUX11_19_16));4 j6 T/ E5 B, V# h, v3 Z! {! q4 `

9 A' T. N: I. |) u. a/ s1 A        HWREG(SOC_SYSCFG_0_REGS + SYSCFG0_PINMUX(11)) =        (PINMUX11_BUSY_V1_ENABLE | PINMUX11_BUSY_V2_ENABLE | savePinMux);. ?& y" [5 C5 J: B3 w6 g
) h* l8 N! T# E; {8 f8 h; b
        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));
% I' X& d& s1 s- N# H/ G4 L# b+ R; F; M  ~' J' P  ]
        HWREG(SOC_SYSCFG_0_REGS + SYSCFG0_PINMUX(12)) =        (PINMUX12_RESET_ENABLE | PINMUX12_CONVST_ENABLE | PINMUX12_RD_ENABLE | PINMUX12_BUSY_C_ENABLE | savePinMux);4 m6 s0 x( V& L, `8 o1 ?4 L$ a

! `2 W$ i2 d$ U0 f, U) u5 l}
3 }4 {0 B- f+ i) A8 N3 Q8 o
- k/ k: T1 A( l6 }8 x& s% ?+ V/ a3 M6 t9 U4 v
static void ad7606_gpio_setup(ad7606 *ad) {4 u5 U% G+ Z$ Q2 ]8 ?7 i6 O9 e. r
        /*Set the AD7606_PAR_BUSY to the input mode*/0 h% y/ p5 T# c, Q4 y- d
        //初始化5.11、5.9 、 5.5为中断口+ u- t) R+ {$ z$ Q
        GPIODirModeSet(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_V1, GPIO_DIR_INPUT);7 R7 ~* f* }+ \# M5 }
        GPIODirModeSet(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_V2, GPIO_DIR_INPUT);
* K4 B6 f& }/ [9 t  U        GPIODirModeSet(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_C, GPIO_DIR_INPUT);* d! i1 q2 ?9 x# ^" b$ ~3 D- V- u
        //GPIODirModeSet(SOC_GPIO_0_REGS, AD7606_PAR_BUSY, GPIO_DIR_INPUT);' E% N* e$ t1 o) d
        /*Set the AD7606_PAR_BUSY to the Falling Edge Interrupt*/
2 w1 m+ e2 n# `$ A2 D5 Q        GPIOIntTypeSet(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_V1, GPIO_INT_TYPE_FALLEDGE);
! t- m0 k& M9 W1 [( |- r        GPIOIntTypeSet(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_V2, GPIO_INT_TYPE_FALLEDGE);$ u& S) {) N4 y% b5 W
        GPIOIntTypeSet(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_C, GPIO_INT_TYPE_FALLEDGE);1 u: `3 u1 v# w* I" J7 o
        //GPIOIntTypeSet(SOC_GPIO_0_REGS, AD7606_PAR_BUSY, GPIO_INT_TYPE_FALLEDGE);* ]: B3 |6 Y$ J! `
        /*The interrupt setting allows AD7606_PAR_BUSY_GPIO_BANK*/
, w9 @8 S+ ]3 [1 ], t        GPIOBankIntEnable(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_GPIO_BANK);4 b% h9 m/ r& E1 t/ b5 L
9 @% D! V% v1 g6 M5 F0 t2 O. H# Z; W
        GPIODirModeSet(SOC_GPIO_0_REGS, AD7606_PAR_RESET, GPIO_DIR_OUTPUT);
3 r4 {8 m$ l/ v. h        GPIOPinWrite(SOC_GPIO_0_REGS, AD7606_PAR_RESET, GPIO_PIN_HIGH);
5 a7 q& p1 I' Q. ?: f' E        Task_sleep(1000);/ n6 K. d5 |" S( {* }8 y  ?. k
        GPIOPinWrite(SOC_GPIO_0_REGS, AD7606_PAR_RESET, GPIO_PIN_LOW);
; h- |0 w$ u3 W( Y$ K        Task_sleep(1000);
! A, u; d4 {- n0 J9 w# C. z/ l; B
! g+ B. C5 S' a6 A2 b        /*Set the AD7606_PAR_CONVST to output mode*/
' r: {, ?8 {5 f1 N: A0 m0 m( s( f' M9 N$ Y7 h        GPIODirModeSet(SOC_GPIO_0_REGS, AD7606_PAR_CONVST, GPIO_DIR_OUTPUT);( S9 T9 t0 e1 r- Q( E4 B
        GPIOPinWrite(SOC_GPIO_0_REGS, AD7606_PAR_CONVST, GPIO_PIN_LOW);
1 N4 Q' w" ^- ]3 H7 C* c. o! T( P2 n. h6 [; y3 r
        GPIODirModeSet(SOC_GPIO_0_REGS, AD7606_PAR_RD, GPIO_DIR_OUTPUT);. A6 {! U: W# X- ~9 e
        GPIOPinWrite(SOC_GPIO_0_REGS, AD7606_PAR_RD, GPIO_PIN_HIGH);! t: O# b- F$ J2 e  v, u

6 f; f; V( M3 ]5 Q1 D3 {}
2 z* N* T' H4 Z2 m" D  R1 ^: k  t5 c2 L2 j

4 ?6 P$ |/ k# a# ?3 f0 S6 k  w' |static void ad7606_busy_hwi(UArg ad_addr) {
3 c( F4 I  Y- {5 P3 K+ u, N1 j; [; {) n* |

% S# @% M( ?( g7 {4 l        /* Disable the interrupts for pins of bank AD7606_PAR_BUSY in GPIO.*/& z& a- X% h& k. L( v5 }: v
        GPIOBankIntDisable(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_GPIO_BANK);      //用仿真器debug,发现程序能进入这里。
% ~  a! c. X9 R, i, m: O4 o/ C! i+ H/ b% B
        if(GPIOPinIntStatus(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_V1) == GPIO_INT_PEND)
7 L* b: I) }) \0 w! |6 V        {+ e: u1 M4 s# m$ o. e
                GPIOPinIntClear(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_V1);                    //问题是:用仿真器debug,发现程序不能进入这里。
" {2 f# ?/ Y2 e' p                cs_addr = SOC_EMIFA_CS5_ADDR ;
5 U, a( Q, F  x& N$ f                internal = 0 ;( p, a$ I7 E# j4 `; Z
                int_flag[0] = 1 ;
+ \$ e# J+ z7 `* S) \        }
" E9 q4 G! d$ F  {: ?' g' U9 p        if(GPIOPinIntStatus(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_V2) == GPIO_INT_PEND)1 h! J$ ^% w; T2 H! M# ]
        {
  B$ }6 n/ B6 ^5 r                GPIOPinIntClear(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_V2); //问题是:用仿真器debug,发现程序不能进入这里。
/ a0 u: B' Q7 ~% N6 T8 F                cs_addr = SOC_EMIFA_CS4_ADDR ;
& L( I) ~$ N' o' `( O                internal = 6 ;
( g0 q2 Z  t; _0 v) H                int_flag[1] = 1 ;
& a3 ^: {, J1 k' o# r0 j6 X4 K        }
% n  r- V( [( ?' }        if(GPIOPinIntStatus(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_C) == GPIO_INT_PEND)
! r* M4 U0 Y; z  s        {
* P! z2 B- ~! \                GPIOPinIntClear(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_C); //问题是:用仿真器debug,发现程序不能进入这里。
: Z4 s& h/ r7 n: z                cs_addr = SOC_EMIFA_CS2_ADDR ;
5 V1 \6 S) J' w7 `3 N+ _                internal = 12 ;+ y3 ]. _( K0 |4 B7 `1 y
                int_flag[2] = 1 ;$ l" X" m( X: B! j
        }7 ^* K. H+ R' y
  
5 w2 T) [6 Q" r        GPIOPinWrite(SOC_GPIO_0_REGS, AD7606_PAR_CONVST, GPIO_PIN_LOW);- s+ z# e, w7 {8 h
      
! G# f9 t$ P+ W$ o$ Y. w7 k        GPIOBankIntEnable(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_GPIO_BANK);7 O0 z1 U' W, A! O) N7 }
}
# w+ t9 P1 Z+ [- X) u0 C  B  L- Y  ?0 w5 V# s8 p0 k) H$ h4 u  w

作者: vtinf    时间: 2016-8-31 16:53
INTSTAT45状态如图
" b& n2 q+ X! M6 O[attach]1368[/attach]
) C+ Q7 F! M3 a/ i+ A




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