嵌入式开发者社区
标题:
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 V
static 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 R
1 ^: 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