|
|
您好。使用GPIO中断时,中断能进入ISR,但是不能区分具体的GPIO端口。程序如下:/ n3 `# s+ P1 S. @
#define AD7606_PAR_BUSY_GPIO_BANK 5
5 o6 E( k1 I2 _& b5 X; c+ F" G#define AD7606_PAR_BUSY_GPIO_BANK_INT SYS_INT_GPIO_B5INT% H3 x9 J3 Q- g# O: A7 y
& {' D% ~; Y7 O) H#define AD7606_PAR_BUSY_V1 GPIO_TO_PIN(5, 11) //BANK5的中断口5.11
$ W6 C. [, `+ K/ L, N- ]#define AD7606_PAR_BUSY_V2 GPIO_TO_PIN(5, 9) //BANK5的中断口5.9( D3 n; i* w4 C8 @$ v, `- t
#define AD7606_PAR_BUSY_C GPIO_TO_PIN(5, 5) //BANK5的中断口5.5
. r; J5 g% R; \# y$ o7 d% t#define AD7606_PAR_BUSY GPIO_TO_PIN(5, 4)
) y. h5 y3 R4 N$ y$ J( b' e" q, \+ q, o9 U7 ^- E
#define AD7606_PAR_CONVST GPIO_TO_PIN(5, 1)0 P+ a' B" ]8 `5 o
#define AD7606_PAR_RD GPIO_TO_PIN(5, 2)$ q7 s4 N5 L& f/ W
#define AD7606_PAR_RESET GPIO_TO_PIN(5, 0)
. c# y' H* P) B* L' M! o! Y9 A- M1 q, b$ K- A9 \
7 z1 U0 `" G' G2 b3 l
! `+ O% k" A: @. K# W ]
static void ad7606_irq_setup(ad7606 *ad) {
2 J, x8 ]% @# J& A Hwi_Params hwiParams;
1 m( R$ L2 w! z& u8 [' v1 j0 c Hwi_Handle myHwi;
" y1 `! [* F( |/ G U Error_Block eb;1 }2 ^% s0 `- L+ X3 G
0 |0 \, O: |3 n' m
Error_init(&eb);
@1 k U+ H" _+ t0 G Hwi_Params_init(&hwiParams);% F4 K! w' _/ Z3 r# O: Z
hwiParams.arg = (unsigned int)ad;
1 |) E0 j6 [3 Z4 d hwiParams.enableInt = FALSE;
+ ~% _4 p: w; }6 ^# ]" ^0 c hwiParams.eventId = SYS_INT_GPIO_B5INT;# x5 ~( I0 e! }; g/ q+ x
hwiParams.priority = 4;( w( u% v! @0 ?7 u
myHwi = Hwi_create(8, ad7606_busy_hwi, &hwiParams, &eb); //注册BANK5中断处理函数" C. S3 ?/ o8 ?8 V) p: F" K! M* S$ I
if (myHwi == NULL) $ f1 u/ a' u+ g4 m7 p4 c5 I
LOG_FATAL("failed to create hwi");3 X2 s$ b4 e5 |
: i/ ~ \ T) A( x. b /* enable both interrupts */; Q1 @8 H9 w# f
Hwi_enableInterrupt(ad->irq_event);, I7 l$ q2 {4 l# r# n" t* k1 Q9 O
}, ?' N9 G) j( P3 U7 D6 h; n/ R0 f
3 w9 S% e' M6 R$ ~9 \ z/ Y
, e6 O: q& f+ C1 j! R* k0 @4 U
static void ad7606_gpio_pinmux_setup(ad7606 *ad) {
+ G4 Q: }0 b, ?* Z& q- \" x1 t volatile unsigned int savePinMux = 0;
/ m) r. F5 d/ `% M3 e/ M //初始化5.11、5.9 、 5.5为GPIO口7 z: _! q8 S0 K+ b6 s3 r
savePinMux = HWREG(SOC_SYSCFG_0_REGS + SYSCFG0_PINMUX(11)) & (~(SYSCFG_PINMUX11_PINMUX11_27_24 | SYSCFG_PINMUX11_PINMUX11_19_16));
0 ^. K" y$ Z5 _
) H! f6 Y) j1 Z4 t7 [ HWREG(SOC_SYSCFG_0_REGS + SYSCFG0_PINMUX(11)) = (PINMUX11_BUSY_V1_ENABLE | PINMUX11_BUSY_V2_ENABLE | savePinMux);5 x' I: I6 V9 \) M% Q4 }. V
( }% y. a. `) q( E 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));3 Q O' d: q6 E
) k: G" d' a: @' V; A! N; d7 Y8 t
HWREG(SOC_SYSCFG_0_REGS + SYSCFG0_PINMUX(12)) = (PINMUX12_RESET_ENABLE | PINMUX12_CONVST_ENABLE | PINMUX12_RD_ENABLE | PINMUX12_BUSY_C_ENABLE | savePinMux);/ C9 p% M4 E. O
# k% S2 w8 G7 C* s A0 l
}
# e% g* @& Z6 b: C# H5 d5 f9 d( u; H
4 ~& b2 @; p) [0 R: k6 mstatic void ad7606_gpio_setup(ad7606 *ad) {! @8 b V$ w( h1 y4 U
/*Set the AD7606_PAR_BUSY to the input mode*/
! M4 b: o# _7 \4 v //初始化5.11、5.9 、 5.5为中断口
2 f; L; A5 @, l( h8 t7 \. q GPIODirModeSet(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_V1, GPIO_DIR_INPUT);% K8 L2 \! i6 f* I* n; q2 X8 ~
GPIODirModeSet(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_V2, GPIO_DIR_INPUT);) s( r, O* P+ x5 \
GPIODirModeSet(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_C, GPIO_DIR_INPUT);# p4 q& T% j# `: N8 T
//GPIODirModeSet(SOC_GPIO_0_REGS, AD7606_PAR_BUSY, GPIO_DIR_INPUT);) |# \; l0 s3 p! D1 X: c6 b+ Q
/*Set the AD7606_PAR_BUSY to the Falling Edge Interrupt*/
5 I T" `2 W: _3 P' n5 t0 l GPIOIntTypeSet(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_V1, GPIO_INT_TYPE_FALLEDGE);
& m! z; J3 X' c$ c) U0 c S GPIOIntTypeSet(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_V2, GPIO_INT_TYPE_FALLEDGE);3 j3 ]& m! }9 d, [
GPIOIntTypeSet(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_C, GPIO_INT_TYPE_FALLEDGE);
$ Y2 Z" n( Y" E //GPIOIntTypeSet(SOC_GPIO_0_REGS, AD7606_PAR_BUSY, GPIO_INT_TYPE_FALLEDGE);- q5 u4 h: e+ W4 j/ Y" D+ y
/*The interrupt setting allows AD7606_PAR_BUSY_GPIO_BANK*/' X, \: v" [7 x: ~& J
GPIOBankIntEnable(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_GPIO_BANK);
( N1 l6 a$ B- ?1 X K% C5 r
, V3 u" C7 {) n A+ A GPIODirModeSet(SOC_GPIO_0_REGS, AD7606_PAR_RESET, GPIO_DIR_OUTPUT);
$ p8 V2 U0 ^8 {+ u/ B- ^ GPIOPinWrite(SOC_GPIO_0_REGS, AD7606_PAR_RESET, GPIO_PIN_HIGH);* Q3 T m# H% X( A
Task_sleep(1000);, P* a9 S7 E( H6 ?& X
GPIOPinWrite(SOC_GPIO_0_REGS, AD7606_PAR_RESET, GPIO_PIN_LOW);
& P) i+ x" t$ k. H" T Task_sleep(1000);
! @' F& d/ O; D1 u
7 p" y- w$ G" W6 a$ P' j /*Set the AD7606_PAR_CONVST to output mode*/& ]; I6 m" E. L8 b3 b
GPIODirModeSet(SOC_GPIO_0_REGS, AD7606_PAR_CONVST, GPIO_DIR_OUTPUT);2 v; b# t9 |# q" {/ l8 Y
GPIOPinWrite(SOC_GPIO_0_REGS, AD7606_PAR_CONVST, GPIO_PIN_LOW);
. I; s0 A) r6 j7 E: Y- y9 D& ]- D) n' e
GPIODirModeSet(SOC_GPIO_0_REGS, AD7606_PAR_RD, GPIO_DIR_OUTPUT);* Y! C8 M6 J' w4 {, i
GPIOPinWrite(SOC_GPIO_0_REGS, AD7606_PAR_RD, GPIO_PIN_HIGH);
( _$ I9 _! B. W0 l5 W% B
3 X8 o0 W b" w}
6 ~2 F( R# Z+ x U* Q# j* Y; V j
8 N# a: {+ e$ j; f: m0 O9 ]static void ad7606_busy_hwi(UArg ad_addr) {
% z5 T/ |2 K- [
. R# F5 X m! z) ?8 c" [( t5 T* j5 C# X# o- j
/* Disable the interrupts for pins of bank AD7606_PAR_BUSY in GPIO.*/
* ?0 Y( i6 t9 f1 A GPIOBankIntDisable(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_GPIO_BANK); //用仿真器debug,发现程序能进入这里。
( h3 \4 A, C8 r. B$ M0 E. o
6 `' Z( R' _' v( K5 x if(GPIOPinIntStatus(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_V1) == GPIO_INT_PEND)
* B$ C3 Q/ v; {% C1 f4 x! X. m( l. C! M {
. W) V4 D* u5 L) v* I% }. P GPIOPinIntClear(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_V1); //问题是:用仿真器debug,发现程序不能进入这里。
' y: V0 x# A8 R1 R- d% o cs_addr = SOC_EMIFA_CS5_ADDR ;/ R2 M3 X1 x1 ^+ N3 K
internal = 0 ;
4 O* b/ E5 Q; z" o6 p int_flag[0] = 1 ;2 H: }2 \0 Q, {: \* v
}
! {* M- c# m5 |3 B% C8 l) U if(GPIOPinIntStatus(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_V2) == GPIO_INT_PEND)
2 E. ~9 M' \# E7 ]# u {/ R' ?1 E; s# D! }
GPIOPinIntClear(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_V2); //问题是:用仿真器debug,发现程序不能进入这里。$ l+ b/ N; @. O3 j q
cs_addr = SOC_EMIFA_CS4_ADDR ;2 z: o2 t, w; M e& E- |( q* l
internal = 6 ;
9 R* a7 u* ?+ e9 B) A2 w int_flag[1] = 1 ;
) E# S; k: [! ~4 m0 x }1 M" c V/ k E3 g/ i4 I, w: m
if(GPIOPinIntStatus(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_C) == GPIO_INT_PEND)0 N6 f+ j# `2 A5 A# ?) P2 T
{
; U( X2 [0 d% E5 w- G9 K% Z8 H GPIOPinIntClear(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_C); //问题是:用仿真器debug,发现程序不能进入这里。$ Z4 _# Y: j. o& s0 X
cs_addr = SOC_EMIFA_CS2_ADDR ;
! E- A% G1 D' F# I internal = 12 ;% k; c5 D V5 j8 x0 r! ~2 @, U% [6 _
int_flag[2] = 1 ;. n5 _0 n/ V3 Z
}
9 m1 O# f$ {6 v- _0 P: k
/ _3 p' C8 l( r9 _8 F GPIOPinWrite(SOC_GPIO_0_REGS, AD7606_PAR_CONVST, GPIO_PIN_LOW);0 a4 m* P) a5 k4 D8 S* E
' ?4 H% M. J" m$ } GPIOBankIntEnable(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_GPIO_BANK);
* z" e9 T4 H" W1 Q6 R5 W}+ E% x5 z0 [1 s6 h# U* }
3 [. \ S7 z% R; @! n& q' `! E9 _8 b
; @) n# [! p6 h# D
- c4 f* M5 ~; g- U2 Z8 I% t
: Z5 t. G( I$ ^/ S! O |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
|