|
您好。使用GPIO中断时,中断能进入ISR,但是不能区分具体的GPIO端口。程序如下:
' K) D5 i! q4 { N1 F+ \#define AD7606_PAR_BUSY_GPIO_BANK 5
/ Q k8 b# U9 z" P1 `#define AD7606_PAR_BUSY_GPIO_BANK_INT SYS_INT_GPIO_B5INT
- a3 l+ W) {. f1 g& M* C
; d4 |6 z# P d; z#define AD7606_PAR_BUSY_V1 GPIO_TO_PIN(5, 11) //BANK5的中断口5.11
# \0 W* y* a5 ]. l3 }5 ]#define AD7606_PAR_BUSY_V2 GPIO_TO_PIN(5, 9) //BANK5的中断口5.9" w& e( o/ Q* I8 v/ z
#define AD7606_PAR_BUSY_C GPIO_TO_PIN(5, 5) //BANK5的中断口5.52 X# t- U6 }: R
#define AD7606_PAR_BUSY GPIO_TO_PIN(5, 4)
3 \. s% ]; l" F; T( L9 q* B" C1 X3 z9 b
#define AD7606_PAR_CONVST GPIO_TO_PIN(5, 1)
3 U2 F5 i8 d5 P/ t- M, {# p j#define AD7606_PAR_RD GPIO_TO_PIN(5, 2)* j) @& h5 v) p( f1 r# Z5 n
#define AD7606_PAR_RESET GPIO_TO_PIN(5, 0)" ?) H# y- m U6 u0 L
7 [7 C* u2 i: t( \4 }" o) S
' @5 O+ m- T7 P( K( R0 F1 i# U$ {
6 s) d5 P0 m: D1 kstatic void ad7606_irq_setup(ad7606 *ad) {
% B# X$ C; i9 h# P Hwi_Params hwiParams;8 w! ~( Z3 _. t+ |2 ]4 G8 }
Hwi_Handle myHwi;
5 L% d) {' I* D% ?# ~1 L6 L Error_Block eb;
9 s* o0 B5 g4 g
3 W. p6 d6 n0 P& b- c Error_init(&eb);. v! }0 |6 w q( M3 w
Hwi_Params_init(&hwiParams);
5 V; ~; i' g/ P }( |2 l hwiParams.arg = (unsigned int)ad;
; x4 p1 w% V, j6 J( e hwiParams.enableInt = FALSE;
, c" v( i) B/ X hwiParams.eventId = SYS_INT_GPIO_B5INT;. K9 k4 T/ Z/ |
hwiParams.priority = 4;7 P3 P% ^ d/ n
myHwi = Hwi_create(8, ad7606_busy_hwi, &hwiParams, &eb); //注册BANK5中断处理函数; ]' i0 s7 ~, N; u) I
if (myHwi == NULL)
: z3 b* |8 R- Y- `5 h' u LOG_FATAL("failed to create hwi");0 z4 h6 n" H5 Y3 L+ e5 L. Y
2 C; Z3 }$ O6 A( K% O. k0 {6 r5 ?9 g
/* enable both interrupts */
+ k) K+ J4 q4 }7 f' H ~% Z Hwi_enableInterrupt(ad->irq_event);
|/ Q% p$ U6 W+ M, e- W0 a q- ?( M}
3 H, \5 I* ]. r
4 w( c% H" {# |+ m. W# U* C* R( N8 R, Z( I5 t3 S) C" F4 i" H
static void ad7606_gpio_pinmux_setup(ad7606 *ad) {
- ~" D9 W( G3 y! N% L volatile unsigned int savePinMux = 0;
- A6 l! X0 {' h //初始化5.11、5.9 、 5.5为GPIO口
/ m5 Y T V( g: Y3 F, L9 N savePinMux = HWREG(SOC_SYSCFG_0_REGS + SYSCFG0_PINMUX(11)) & (~(SYSCFG_PINMUX11_PINMUX11_27_24 | SYSCFG_PINMUX11_PINMUX11_19_16));
! E: J9 V( A5 D3 |8 R, O; \/ Q) z' J1 w
HWREG(SOC_SYSCFG_0_REGS + SYSCFG0_PINMUX(11)) = (PINMUX11_BUSY_V1_ENABLE | PINMUX11_BUSY_V2_ENABLE | savePinMux);
$ e$ x: ` T& a% A
# D; K z) m E0 X4 A 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));; Y; H4 h0 y1 T, {' Q
1 [0 T9 c2 [% @
HWREG(SOC_SYSCFG_0_REGS + SYSCFG0_PINMUX(12)) = (PINMUX12_RESET_ENABLE | PINMUX12_CONVST_ENABLE | PINMUX12_RD_ENABLE | PINMUX12_BUSY_C_ENABLE | savePinMux);
8 ^6 F- [" G9 r% [, I* G% A, ^' d2 _' D
}0 q! z4 {. G, @0 P, A; ~4 @
" z P$ Q2 |' e* t
7 j7 J9 K& u; Z+ R2 M9 a
static void ad7606_gpio_setup(ad7606 *ad) {$ Y0 v5 o2 D: D% J: o
/*Set the AD7606_PAR_BUSY to the input mode*/% A$ |) ?8 ?9 f' h5 J( ?7 q
//初始化5.11、5.9 、 5.5为中断口
& P5 u, n/ t' _ K; g6 y GPIODirModeSet(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_V1, GPIO_DIR_INPUT);" S, V' G$ g; }: }# C+ U
GPIODirModeSet(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_V2, GPIO_DIR_INPUT);
0 G2 }) l, Z7 e9 n GPIODirModeSet(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_C, GPIO_DIR_INPUT);
5 y& `, ~# D, D! X& z# E" w //GPIODirModeSet(SOC_GPIO_0_REGS, AD7606_PAR_BUSY, GPIO_DIR_INPUT);9 b( ~# p: G5 C& K
/*Set the AD7606_PAR_BUSY to the Falling Edge Interrupt*/
4 S; d- ~' L4 X2 T, [! Y( Z GPIOIntTypeSet(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_V1, GPIO_INT_TYPE_FALLEDGE);1 H1 `6 X# g+ ]# f7 G
GPIOIntTypeSet(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_V2, GPIO_INT_TYPE_FALLEDGE);+ M% E: Y# o/ Y* ^' j) S* ~" Z
GPIOIntTypeSet(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_C, GPIO_INT_TYPE_FALLEDGE);6 U% ]) B7 I8 h7 o8 D& `
//GPIOIntTypeSet(SOC_GPIO_0_REGS, AD7606_PAR_BUSY, GPIO_INT_TYPE_FALLEDGE);4 K/ y# }" \1 ~" h
/*The interrupt setting allows AD7606_PAR_BUSY_GPIO_BANK*/5 ~% r/ { Z7 o' S
GPIOBankIntEnable(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_GPIO_BANK);/ I& e4 u: `9 n4 [& R
: P; ]" ^# U; V4 q GPIODirModeSet(SOC_GPIO_0_REGS, AD7606_PAR_RESET, GPIO_DIR_OUTPUT);" [7 |0 \6 t3 L" k
GPIOPinWrite(SOC_GPIO_0_REGS, AD7606_PAR_RESET, GPIO_PIN_HIGH);% `! D) t7 J, ^- S% k7 ?% ~. ?+ h
Task_sleep(1000);; P* u. G- M3 p
GPIOPinWrite(SOC_GPIO_0_REGS, AD7606_PAR_RESET, GPIO_PIN_LOW);; G! I1 B7 G& E; x2 y* J3 s
Task_sleep(1000);# s/ S S; Z& @( _1 R# h* K c% a
: k' P0 m- n M- F) G
/*Set the AD7606_PAR_CONVST to output mode*/
- |# ~4 H* \' B$ r( A) l GPIODirModeSet(SOC_GPIO_0_REGS, AD7606_PAR_CONVST, GPIO_DIR_OUTPUT);
' {1 K" ~# k" C# q GPIOPinWrite(SOC_GPIO_0_REGS, AD7606_PAR_CONVST, GPIO_PIN_LOW);
1 G: r- r8 Y- a4 E( U5 X
- c4 Z9 ]$ K0 V7 E/ f, p: d GPIODirModeSet(SOC_GPIO_0_REGS, AD7606_PAR_RD, GPIO_DIR_OUTPUT);
6 d: h( E4 x' |& a GPIOPinWrite(SOC_GPIO_0_REGS, AD7606_PAR_RD, GPIO_PIN_HIGH);/ X \5 m8 F4 \5 a& @
7 X/ w+ v/ M: Z9 c3 g7 b, R
}
$ q9 H+ L% a& z0 X/ y3 }
* w- f2 n3 Z1 j- V! Z$ ]. c6 X0 Y1 W3 M* F* k6 M
static void ad7606_busy_hwi(UArg ad_addr) {1 T& F2 W, _% Z, |
8 S H6 `+ b2 u6 R6 w. S# S ?
- z2 }7 {8 r* i' k1 g /* Disable the interrupts for pins of bank AD7606_PAR_BUSY in GPIO.*/
& W/ y7 Q, G T9 [, C0 F9 J GPIOBankIntDisable(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_GPIO_BANK); //用仿真器debug,发现程序能进入这里。
7 u/ g: R9 h; s3 k1 X' W
* B6 A1 _* y t4 E# {- S' f$ N if(GPIOPinIntStatus(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_V1) == GPIO_INT_PEND)& a" ~5 ~& g* {% O
{1 F$ X" a% T+ U
GPIOPinIntClear(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_V1); //问题是:用仿真器debug,发现程序不能进入这里。/ O0 a; i7 n/ o
cs_addr = SOC_EMIFA_CS5_ADDR ;
+ |! c$ R- c* F0 \, h5 ~ internal = 0 ;+ i- R$ N9 k3 i! l- L
int_flag[0] = 1 ;
& ?) ~6 U' N( g3 O7 a0 A }
7 v2 _; C; Z( `7 {7 a- d if(GPIOPinIntStatus(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_V2) == GPIO_INT_PEND)
/ D/ j7 n7 k3 N" N" _ {5 q( x0 U9 H$ l. O' \ J
GPIOPinIntClear(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_V2); //问题是:用仿真器debug,发现程序不能进入这里。
9 Z$ ]0 A/ U! t4 T( v& L# k cs_addr = SOC_EMIFA_CS4_ADDR ;
, U7 O$ c' F& c) H& |# x internal = 6 ;+ l( z" Z& N! o
int_flag[1] = 1 ;+ F- y- [% D4 d. [/ m0 L2 W& W
}
; T; Z% }8 q+ a if(GPIOPinIntStatus(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_C) == GPIO_INT_PEND). B8 a+ w6 D/ r7 A7 q
{5 n5 p; y/ Q( |, p1 M( N/ e
GPIOPinIntClear(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_C); //问题是:用仿真器debug,发现程序不能进入这里。* W1 {! x% A0 W+ s/ b+ g
cs_addr = SOC_EMIFA_CS2_ADDR ;
' H( A) f1 n e+ f internal = 12 ;; V# V7 r( ^' y' ^
int_flag[2] = 1 ; L$ N- V) J; x2 [
}+ r; ~/ J U! Y% N
2 U7 W2 \% D% F7 L; U
GPIOPinWrite(SOC_GPIO_0_REGS, AD7606_PAR_CONVST, GPIO_PIN_LOW);
7 R. A: j, q: [' i; l) Z* n; _, ~
6 o/ {5 b2 _6 s- X) r$ `1 Z/ B GPIOBankIntEnable(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_GPIO_BANK);
( j% _' J! i1 G4 p8 [8 d}
7 E9 Q9 f' F! f; g
/ Z$ v5 B/ r4 i- ~ |
|