|
您好。使用GPIO中断时,中断能进入ISR,但是不能区分具体的GPIO端口。程序如下:6 x$ d5 w$ ^5 j# l. a4 @- j2 N' w
#define AD7606_PAR_BUSY_GPIO_BANK 5
8 |1 J" c" w0 Q' ]#define AD7606_PAR_BUSY_GPIO_BANK_INT SYS_INT_GPIO_B5INT* @5 }/ _1 j, b; Q3 z* Z' ~
# ~! h9 v J9 c; s2 R, B3 {
#define AD7606_PAR_BUSY_V1 GPIO_TO_PIN(5, 11) //BANK5的中断口5.110 Q; y3 r1 l/ q: v( S8 H5 B
#define AD7606_PAR_BUSY_V2 GPIO_TO_PIN(5, 9) //BANK5的中断口5.9: v8 t3 O8 D7 \- \" U' m: e; P9 k
#define AD7606_PAR_BUSY_C GPIO_TO_PIN(5, 5) //BANK5的中断口5.5
0 j0 N7 V! Y! a0 e2 c8 F#define AD7606_PAR_BUSY GPIO_TO_PIN(5, 4)
9 |' w4 L. i' c0 C: R! ^9 O4 i9 L( e: z6 N& {2 n& W* G, u: W
#define AD7606_PAR_CONVST GPIO_TO_PIN(5, 1). i, C# t8 X a6 M) \1 q! e8 `
#define AD7606_PAR_RD GPIO_TO_PIN(5, 2)0 ^8 n( W( u9 n* V! F3 M% X3 x
#define AD7606_PAR_RESET GPIO_TO_PIN(5, 0)# P: q( E0 l! m! a% E* A& l
1 K) m* V o H9 b4 G6 M
( S3 R7 M9 \5 c' T! h
. ^" D; d0 m" k( hstatic void ad7606_irq_setup(ad7606 *ad) {, [; @# |- N3 Z& \
Hwi_Params hwiParams;! F- ]2 j J9 o
Hwi_Handle myHwi;
Y9 j+ m# p2 e Error_Block eb;
5 t( z5 T7 E. V8 v4 a# `3 ?* J. A3 M5 L; ^- t T$ |
Error_init(&eb);' ~ M9 g7 {7 t8 b/ R
Hwi_Params_init(&hwiParams); T, P+ e$ {% L; m0 H' U# E
hwiParams.arg = (unsigned int)ad;, a# @! E+ |! I* d7 S2 D
hwiParams.enableInt = FALSE;2 E8 ?8 w4 a( ~5 M
hwiParams.eventId = SYS_INT_GPIO_B5INT;
0 c/ L+ N3 c0 m8 a: u. m hwiParams.priority = 4;+ [/ N/ r4 A/ a: E2 S! o) e
myHwi = Hwi_create(8, ad7606_busy_hwi, &hwiParams, &eb); //注册BANK5中断处理函数. R8 ~9 g( v) f8 q. d
if (myHwi == NULL)
* P- K" i% E9 E$ W j9 i LOG_FATAL("failed to create hwi");/ n4 \& x7 K# h; m0 [$ t! Y" o, \
3 Z; J! }" }8 G) ?2 S7 s1 ~
/* enable both interrupts */$ P* o6 N$ g( t5 U* b
Hwi_enableInterrupt(ad->irq_event);& ^( q- A! U8 y P* |
}
/ f) N; I& i7 n/ I: h( Y, D
d" `! p/ Z$ O9 D7 `; C+ O2 H% d) {9 g# f% A, o
static void ad7606_gpio_pinmux_setup(ad7606 *ad) {% x! l9 E4 w8 g! t
volatile unsigned int savePinMux = 0;3 T( K5 _9 J" O+ Y9 v. N
//初始化5.11、5.9 、 5.5为GPIO口3 v2 Q7 u4 W k3 u! R0 P0 r
savePinMux = HWREG(SOC_SYSCFG_0_REGS + SYSCFG0_PINMUX(11)) & (~(SYSCFG_PINMUX11_PINMUX11_27_24 | SYSCFG_PINMUX11_PINMUX11_19_16));$ t4 e6 F ^1 _- \ J: j: G* j
: V" H, A$ ^, N
HWREG(SOC_SYSCFG_0_REGS + SYSCFG0_PINMUX(11)) = (PINMUX11_BUSY_V1_ENABLE | PINMUX11_BUSY_V2_ENABLE | savePinMux);
$ W. L6 c, f: T3 G
& S o; r0 n( u8 l7 C. X 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));
5 V3 u$ r) X- x3 ~6 m; c) ~. Y! a
! u7 d) W- [7 A( I- f* b HWREG(SOC_SYSCFG_0_REGS + SYSCFG0_PINMUX(12)) = (PINMUX12_RESET_ENABLE | PINMUX12_CONVST_ENABLE | PINMUX12_RD_ENABLE | PINMUX12_BUSY_C_ENABLE | savePinMux);
. {4 B# [, N- [6 R1 @+ q3 K) B. f2 V6 J: A: Q p/ v! m3 j
}
& C) w7 z" h; X- d6 x* M' K2 B. m7 e0 g2 ~; z
* u1 q9 P: T U9 fstatic void ad7606_gpio_setup(ad7606 *ad) {/ e1 n' Q. ~& Y
/*Set the AD7606_PAR_BUSY to the input mode*/
# z3 G1 k. O+ t% O$ V1 ?8 `" j //初始化5.11、5.9 、 5.5为中断口
: j; N$ c- V2 |9 R+ Y. g! |' f" u' B. i GPIODirModeSet(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_V1, GPIO_DIR_INPUT);
0 l, u. w# @7 ~9 R) v5 v4 S GPIODirModeSet(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_V2, GPIO_DIR_INPUT);7 C- E2 o: I, l, N, o/ m
GPIODirModeSet(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_C, GPIO_DIR_INPUT);1 l7 [/ E+ S5 R2 z* y/ n: N$ F
//GPIODirModeSet(SOC_GPIO_0_REGS, AD7606_PAR_BUSY, GPIO_DIR_INPUT);9 C; L1 z. A/ {1 J, t/ S- C9 x* _
/*Set the AD7606_PAR_BUSY to the Falling Edge Interrupt*/, X1 M! O. `( l$ b# V0 `2 \, i
GPIOIntTypeSet(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_V1, GPIO_INT_TYPE_FALLEDGE);
e3 e5 L7 I8 ]$ f& C* l5 j GPIOIntTypeSet(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_V2, GPIO_INT_TYPE_FALLEDGE);2 p+ r3 t, b% G
GPIOIntTypeSet(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_C, GPIO_INT_TYPE_FALLEDGE);& E& C6 E( I3 P! Q: C+ y
//GPIOIntTypeSet(SOC_GPIO_0_REGS, AD7606_PAR_BUSY, GPIO_INT_TYPE_FALLEDGE);
, a2 f' J J; l( l /*The interrupt setting allows AD7606_PAR_BUSY_GPIO_BANK*/
- U6 [9 X6 n/ P- l GPIOBankIntEnable(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_GPIO_BANK);
) K1 d- o. V7 U$ r3 i/ A
. y9 v; D5 r6 `. \" L GPIODirModeSet(SOC_GPIO_0_REGS, AD7606_PAR_RESET, GPIO_DIR_OUTPUT);2 h; t" ], Z& {& @# |) O4 a$ @
GPIOPinWrite(SOC_GPIO_0_REGS, AD7606_PAR_RESET, GPIO_PIN_HIGH);
6 u8 [1 k A4 n: \3 Y Task_sleep(1000);- N, H' e$ B1 N- F$ v) j% z
GPIOPinWrite(SOC_GPIO_0_REGS, AD7606_PAR_RESET, GPIO_PIN_LOW);4 K4 ?) k0 f# W+ m o2 m' q
Task_sleep(1000);
3 Z, c/ R E6 w7 h
' ]) D+ X, ?2 q /*Set the AD7606_PAR_CONVST to output mode*/
9 n. i1 f+ ?4 ` GPIODirModeSet(SOC_GPIO_0_REGS, AD7606_PAR_CONVST, GPIO_DIR_OUTPUT);
; s2 q# |7 I# X* k GPIOPinWrite(SOC_GPIO_0_REGS, AD7606_PAR_CONVST, GPIO_PIN_LOW);
$ }7 b# H3 T: S
3 A3 {9 W% v( f" E. w3 q GPIODirModeSet(SOC_GPIO_0_REGS, AD7606_PAR_RD, GPIO_DIR_OUTPUT);
# u9 `5 A+ d: |( b3 | GPIOPinWrite(SOC_GPIO_0_REGS, AD7606_PAR_RD, GPIO_PIN_HIGH);
/ O% j9 U# t- }# C% C
$ L5 x0 a a: k1 n; @. j, b& }1 U}
/ [2 C: @4 h' x2 X) [ C2 I$ J( r' C
6 {. C+ w% h6 j0 H; H2 C z" S' K; Q% a
static void ad7606_busy_hwi(UArg ad_addr) {' I4 k( ]" j! f$ _, r$ K& B
( \; S; ]# b" B" L# f
) o/ V' e# Q2 k9 w& d) q/ A! c /* Disable the interrupts for pins of bank AD7606_PAR_BUSY in GPIO.*/
* e. E/ |, V5 P# R! @1 }5 V GPIOBankIntDisable(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_GPIO_BANK); //用仿真器debug,发现程序能进入这里。
4 @$ x6 C2 y3 j* `0 s$ P$ U* p2 }8 P
if(GPIOPinIntStatus(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_V1) == GPIO_INT_PEND)
* _! a8 B3 q6 ?- }3 N, Y) ~ {0 R1 O- J5 E/ z( k- L
GPIOPinIntClear(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_V1); //问题是:用仿真器debug,发现程序不能进入这里。0 f" x/ S8 e1 E( A( v8 d
cs_addr = SOC_EMIFA_CS5_ADDR ;
: U7 F3 ~5 F. | internal = 0 ;
# S; `0 l( _1 K int_flag[0] = 1 ;
& `, y3 U( [1 g }
" i j: \1 P2 }1 o5 q, p if(GPIOPinIntStatus(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_V2) == GPIO_INT_PEND)2 ~. ~" I7 G% T1 J. K
{
3 A8 d2 N( ~' S/ _) R$ l/ Z GPIOPinIntClear(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_V2); //问题是:用仿真器debug,发现程序不能进入这里。/ {* I1 p+ P* ^" E1 [* [
cs_addr = SOC_EMIFA_CS4_ADDR ;
6 s) d4 S5 p# K9 r" w) p) @ internal = 6 ;3 U+ I% k/ ], }/ S) u
int_flag[1] = 1 ;1 Q3 X+ m, M+ x( @
}
9 }9 R$ p! Z7 ~0 l/ | U- Z% c9 i2 ` if(GPIOPinIntStatus(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_C) == GPIO_INT_PEND)
9 d! L9 E6 U/ v9 }+ p {
- }- g# \2 {! n- P% g! S GPIOPinIntClear(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_C); //问题是:用仿真器debug,发现程序不能进入这里。
1 a, q9 E+ U, \ i% [ cs_addr = SOC_EMIFA_CS2_ADDR ;2 a0 @+ [4 X5 L6 S. r! {4 `
internal = 12 ;
) n8 [& w, [ r* @# f3 N4 J int_flag[2] = 1 ;
$ j8 |# }% U+ q- }3 U! C V }
; e2 a/ P X s8 Y. T, ?
1 M0 U6 j" M/ N F$ A GPIOPinWrite(SOC_GPIO_0_REGS, AD7606_PAR_CONVST, GPIO_PIN_LOW);1 U# ^6 \- \8 `- n& ?
E J1 m1 j/ ^5 h" A1 R6 j4 l" a4 A GPIOBankIntEnable(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_GPIO_BANK);, q0 a) [$ C# s# V! E9 K" F3 N' m. x
} Q* o6 W! M4 A1 ~
+ e8 q0 O: E3 q! j
+ T- p' T- \4 T# ]: u/ Y+ o2 e" m( o3 K* `$ s
9 U! B. @7 V2 o |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
|