|
您好。使用GPIO中断时,中断能进入ISR,但是不能区分具体的GPIO端口。程序如下:$ X4 E9 M- K; C c1 v; {, Y, b" H
#define AD7606_PAR_BUSY_GPIO_BANK 5
: {5 u J6 j4 M#define AD7606_PAR_BUSY_GPIO_BANK_INT SYS_INT_GPIO_B5INT1 A% v" |" L7 C+ X# @
. |8 s3 Q( n0 J; V( `1 p
#define AD7606_PAR_BUSY_V1 GPIO_TO_PIN(5, 11) //BANK5的中断口5.11
- U8 h$ s& ~3 y#define AD7606_PAR_BUSY_V2 GPIO_TO_PIN(5, 9) //BANK5的中断口5.9
- X8 C, A2 U! \8 ?. p) A3 `( L#define AD7606_PAR_BUSY_C GPIO_TO_PIN(5, 5) //BANK5的中断口5.54 U; @0 z ^0 `6 q# m) B
#define AD7606_PAR_BUSY GPIO_TO_PIN(5, 4)
9 S+ L# q6 h9 E7 ]6 j7 g2 H9 ^
$ K* p: J* Y0 D, @#define AD7606_PAR_CONVST GPIO_TO_PIN(5, 1)5 Z+ q+ U5 j% x2 `7 ^, l) c Z/ J
#define AD7606_PAR_RD GPIO_TO_PIN(5, 2)
% K! D f; p6 Q2 F5 @0 u#define AD7606_PAR_RESET GPIO_TO_PIN(5, 0)6 [: I2 u, y+ \5 O
% [0 E" Y: q6 F) ^4 Y. M
& `/ }; r/ ?! J4 u
+ {; b7 ]$ A: S& c- F7 jstatic void ad7606_irq_setup(ad7606 *ad) {
4 y0 }6 S! f& n+ l8 A4 `7 \ Hwi_Params hwiParams;
, b* P5 g: B; b6 v4 a) o/ W Hwi_Handle myHwi;
5 w0 t: e/ c$ @7 d* M/ Q$ H Error_Block eb;
+ P9 r' Y3 [# B& j
4 S o, v4 {4 T: x/ o* H9 ]2 Z Error_init(&eb);7 X( P/ p) }" ~$ P/ \+ p
Hwi_Params_init(&hwiParams);
- i6 ]3 m0 X6 V* z8 D hwiParams.arg = (unsigned int)ad;
- k1 p6 P6 l) t3 d3 h* N3 X K hwiParams.enableInt = FALSE;
) o6 Q% Q( e$ @. l2 {: B( W hwiParams.eventId = SYS_INT_GPIO_B5INT;
2 x5 M$ s$ f+ ~2 O& Z hwiParams.priority = 4;
$ G+ G3 W( f; l' ]9 W- b# N myHwi = Hwi_create(8, ad7606_busy_hwi, &hwiParams, &eb); //注册BANK5中断处理函数* K" k5 D. B3 S+ l- [5 r1 b s
if (myHwi == NULL)
+ U4 |; D- m8 o7 k, A' Z LOG_FATAL("failed to create hwi");/ u7 ^: Y* x8 D7 u/ B
5 y$ r( `6 O4 u. R0 k' { /* enable both interrupts */ P2 Q( y% H4 n$ q& P! P) K% ?
Hwi_enableInterrupt(ad->irq_event);( X3 P6 b4 w: g8 m L3 u
}6 ~ r# M# x' q4 |9 W0 t
0 e$ j& f3 G# F
2 l2 b4 X4 o0 V9 pstatic void ad7606_gpio_pinmux_setup(ad7606 *ad) {( i8 x/ V6 I, o/ U
volatile unsigned int savePinMux = 0;* {7 Y1 |, J7 K5 O7 Q! x
//初始化5.11、5.9 、 5.5为GPIO口8 y. K2 C; l/ x8 } V% f8 L' X' s/ ~
savePinMux = HWREG(SOC_SYSCFG_0_REGS + SYSCFG0_PINMUX(11)) & (~(SYSCFG_PINMUX11_PINMUX11_27_24 | SYSCFG_PINMUX11_PINMUX11_19_16));
+ I, F& x2 o+ _! r: q7 C# j k" Z6 H$ [ @) C. V2 g, h! g
HWREG(SOC_SYSCFG_0_REGS + SYSCFG0_PINMUX(11)) = (PINMUX11_BUSY_V1_ENABLE | PINMUX11_BUSY_V2_ENABLE | savePinMux);- }9 i' T+ e. t! ?* f( s; X
) |1 h/ ^! T* O+ Q 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));
1 |1 Q' p) }7 Y+ G3 Q( s7 e F! r* p9 N- |/ p
HWREG(SOC_SYSCFG_0_REGS + SYSCFG0_PINMUX(12)) = (PINMUX12_RESET_ENABLE | PINMUX12_CONVST_ENABLE | PINMUX12_RD_ENABLE | PINMUX12_BUSY_C_ENABLE | savePinMux);# {" d i3 U- A2 ~- [# A. X. l
: O% Y3 U) K0 F- Z( T- x( U
}
! R# ^; z' O6 x6 f( P: o: M% B e7 Q8 c. n+ e9 E9 _. }% D2 X
1 Y0 H6 [8 G) ^$ O K4 p6 m7 Q% O/ Jstatic void ad7606_gpio_setup(ad7606 *ad) { p |) A: P3 `3 ~
/*Set the AD7606_PAR_BUSY to the input mode*/$ W" f" w1 _* o7 g1 Z Q5 h
//初始化5.11、5.9 、 5.5为中断口
, Y6 w- S* q% u$ H GPIODirModeSet(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_V1, GPIO_DIR_INPUT);; Z6 j2 U8 ]) Q; ?4 L4 j( b
GPIODirModeSet(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_V2, GPIO_DIR_INPUT);2 F, V& E0 t& I+ A
GPIODirModeSet(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_C, GPIO_DIR_INPUT);
$ C1 y' c. i0 q( U, I* P+ ~* m) T //GPIODirModeSet(SOC_GPIO_0_REGS, AD7606_PAR_BUSY, GPIO_DIR_INPUT);
0 N+ _- W0 s6 B: e /*Set the AD7606_PAR_BUSY to the Falling Edge Interrupt*/* a' S& p" N2 V) p" y" r
GPIOIntTypeSet(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_V1, GPIO_INT_TYPE_FALLEDGE);! R. C5 j8 t# x; `' }3 Z
GPIOIntTypeSet(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_V2, GPIO_INT_TYPE_FALLEDGE);, P! K- q4 l, [5 F% B
GPIOIntTypeSet(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_C, GPIO_INT_TYPE_FALLEDGE);1 p: n8 n0 a$ a# O8 u7 n0 U/ `
//GPIOIntTypeSet(SOC_GPIO_0_REGS, AD7606_PAR_BUSY, GPIO_INT_TYPE_FALLEDGE);, C) y' h4 U' e1 n( K5 D+ [: L
/*The interrupt setting allows AD7606_PAR_BUSY_GPIO_BANK*/& I8 r: g8 p) K4 d+ ~/ s5 r5 z
GPIOBankIntEnable(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_GPIO_BANK);
* X/ b( c' w- |# q6 G2 Z, D5 C6 R* B6 N8 Z* o
GPIODirModeSet(SOC_GPIO_0_REGS, AD7606_PAR_RESET, GPIO_DIR_OUTPUT);
& o, ], s$ j9 V1 `* ? GPIOPinWrite(SOC_GPIO_0_REGS, AD7606_PAR_RESET, GPIO_PIN_HIGH);) e7 l/ L2 r+ M3 U' ^
Task_sleep(1000);
2 K }# P7 O& y% d& S GPIOPinWrite(SOC_GPIO_0_REGS, AD7606_PAR_RESET, GPIO_PIN_LOW);
5 K) d1 X- U5 E: \' E Task_sleep(1000);: ^6 n$ W3 E% M. l9 \& d, n
6 q) f+ i9 S* ^/ I) e /*Set the AD7606_PAR_CONVST to output mode*/# ~/ D% K4 b+ i+ m0 G
GPIODirModeSet(SOC_GPIO_0_REGS, AD7606_PAR_CONVST, GPIO_DIR_OUTPUT);
1 c6 ^! P: T [% K4 B GPIOPinWrite(SOC_GPIO_0_REGS, AD7606_PAR_CONVST, GPIO_PIN_LOW);
8 C0 K: |' f+ ] R& U
* n( f* r6 L9 t# s" k% J* l, X% D8 } GPIODirModeSet(SOC_GPIO_0_REGS, AD7606_PAR_RD, GPIO_DIR_OUTPUT);
! a6 v6 y1 p2 X GPIOPinWrite(SOC_GPIO_0_REGS, AD7606_PAR_RD, GPIO_PIN_HIGH);0 F1 U8 s$ q" V4 Q
% D8 K" u3 y6 j+ l9 T
}
4 U/ J: F6 N0 l- L D2 J8 N! N: g; Z# i' I- h
2 H2 Y2 c# }) b+ Y: Z
static void ad7606_busy_hwi(UArg ad_addr) {' @# H9 g2 Z, b5 P* a
' l2 t% l: ]3 q3 ]$ J5 G, W( H
' _6 A( R$ L G$ t' F3 w+ d
/* Disable the interrupts for pins of bank AD7606_PAR_BUSY in GPIO.*/. {+ ?' ~' K; {* M' T
GPIOBankIntDisable(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_GPIO_BANK); //用仿真器debug,发现程序能进入这里。
# U- Y$ w& [( o% N3 _* R$ x( w: U: k$ W2 }% {* v, d) b+ `
if(GPIOPinIntStatus(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_V1) == GPIO_INT_PEND): e9 C1 [3 v; @$ z* n; M% I
{
- `" d& x U& [ GPIOPinIntClear(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_V1); //问题是:用仿真器debug,发现程序不能进入这里。
" \; A3 }$ E$ ^9 j cs_addr = SOC_EMIFA_CS5_ADDR ;4 [( P( m( l+ {& r
internal = 0 ;+ m, M! g \8 ?6 {! N
int_flag[0] = 1 ;
7 j/ \9 ^/ }8 y- O6 x& T( z }6 S; k' I. _9 D- U3 [
if(GPIOPinIntStatus(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_V2) == GPIO_INT_PEND)
`$ g% \$ n ]# t {
! C4 m0 S# B. S, Z6 U& j GPIOPinIntClear(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_V2); //问题是:用仿真器debug,发现程序不能进入这里。
6 D0 B: g% }4 b6 r cs_addr = SOC_EMIFA_CS4_ADDR ;* C# B" d; O+ e' \+ U
internal = 6 ;
& y7 }4 _ u- @* y0 s int_flag[1] = 1 ;
' o+ [+ k: Q0 V) m. z' Y2 U4 R* w2 y }
+ G# v, }4 {3 W2 C1 w$ S if(GPIOPinIntStatus(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_C) == GPIO_INT_PEND)9 v. y$ Z: E4 J2 _0 b
{
1 T) ^: w+ _; e& r GPIOPinIntClear(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_C); //问题是:用仿真器debug,发现程序不能进入这里。" c0 B+ n2 C C _2 {+ h5 B
cs_addr = SOC_EMIFA_CS2_ADDR ;
. ]$ t) e( Q# R( ~4 E9 Z( F$ k internal = 12 ;. G- n$ a7 c* L, c( ]: O. v" |
int_flag[2] = 1 ;
* t1 X# E/ u9 r+ P4 E/ C }
" j) f3 _; I J, y$ g
6 t& x+ ] c# T0 A GPIOPinWrite(SOC_GPIO_0_REGS, AD7606_PAR_CONVST, GPIO_PIN_LOW);
% i7 j1 D( B$ l
$ h o6 K& L2 k% w, L0 W GPIOBankIntEnable(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_GPIO_BANK);+ E( F( S! V. ?( o. y# {$ ~* e
}
6 N6 j, o" J! b1 T
8 \" r4 d" b- `$ m1 W |
|