|
|
您好。使用GPIO中断时,中断能进入ISR,但是不能区分具体的GPIO端口。程序如下:
" Z3 H! N& x/ L' e* `0 B#define AD7606_PAR_BUSY_GPIO_BANK 5/ L- h5 t5 V( A& R
#define AD7606_PAR_BUSY_GPIO_BANK_INT SYS_INT_GPIO_B5INT @+ o$ s" L' p+ B c
, R7 |* P0 j9 j' m0 y2 L3 j) L
#define AD7606_PAR_BUSY_V1 GPIO_TO_PIN(5, 11) //BANK5的中断口5.11
; ^' `0 n1 L, U+ S; ^#define AD7606_PAR_BUSY_V2 GPIO_TO_PIN(5, 9) //BANK5的中断口5.9& u1 R0 |+ b& p/ Z4 C
#define AD7606_PAR_BUSY_C GPIO_TO_PIN(5, 5) //BANK5的中断口5.5
8 O% C1 O8 ~0 d+ V4 q/ e#define AD7606_PAR_BUSY GPIO_TO_PIN(5, 4)
$ J0 b+ V6 S/ d" u# U# n3 R8 o; q; x6 |1 [
#define AD7606_PAR_CONVST GPIO_TO_PIN(5, 1), b% T a3 }4 L$ d% q6 A) F; u
#define AD7606_PAR_RD GPIO_TO_PIN(5, 2)
) @' j* J" r7 C. w. w8 A8 M#define AD7606_PAR_RESET GPIO_TO_PIN(5, 0)7 O, m x# G0 h7 J: a
( ~) l6 h/ b; l* q! [
3 T) J5 v. E1 C* r, B k
5 ~, H p9 X: I2 _% wstatic void ad7606_irq_setup(ad7606 *ad) {
1 Y1 }9 v, L, ]9 O( T. v Hwi_Params hwiParams;
1 Q* |7 D& v, F Hwi_Handle myHwi; Y: z, ?. y. e+ [2 W# s# f; A
Error_Block eb;
7 V% Y$ D `* t& I6 d( T% Y! k0 [
Error_init(&eb);4 S% j/ t, e$ |0 [" K$ Q) P6 C
Hwi_Params_init(&hwiParams);5 A( F+ n. ?+ S5 A" T6 a5 U
hwiParams.arg = (unsigned int)ad;
9 z) d0 o: ?/ ?8 h/ \$ ^" ^ hwiParams.enableInt = FALSE;
3 K) g& ]( Q* f/ H% W hwiParams.eventId = SYS_INT_GPIO_B5INT;
. G* l6 K) F% P) G: o9 t, Z7 n5 B* z hwiParams.priority = 4;1 Y3 |8 d8 p" b. H
myHwi = Hwi_create(8, ad7606_busy_hwi, &hwiParams, &eb); //注册BANK5中断处理函数
( t$ }- I( j3 Y6 J if (myHwi == NULL)
) s4 i* U4 ?' {) K LOG_FATAL("failed to create hwi");
$ l v% s0 F: |: }
! u& s7 ~6 o* H& I' X* O /* enable both interrupts */
' @+ L- k( {! C0 t Hwi_enableInterrupt(ad->irq_event);& F, U) ?, T$ Q ^. x/ X+ h
}0 O0 c+ i8 C) W4 D
7 \, Z3 k: w" v) i
, S. E8 }7 Y q6 w( ^: Vstatic void ad7606_gpio_pinmux_setup(ad7606 *ad) {0 N k; y7 `# e! ]
volatile unsigned int savePinMux = 0;2 [' M/ e0 P3 T& g0 n, @1 K2 g7 G# c8 ~
//初始化5.11、5.9 、 5.5为GPIO口) W8 `) e5 z- K2 b; z6 ?9 {
savePinMux = HWREG(SOC_SYSCFG_0_REGS + SYSCFG0_PINMUX(11)) & (~(SYSCFG_PINMUX11_PINMUX11_27_24 | SYSCFG_PINMUX11_PINMUX11_19_16));
. Y! M% _" m4 i; J( V, u8 c
& z) w3 g9 U& u0 m HWREG(SOC_SYSCFG_0_REGS + SYSCFG0_PINMUX(11)) = (PINMUX11_BUSY_V1_ENABLE | PINMUX11_BUSY_V2_ENABLE | savePinMux);
# e' ~" R, H c! K
% L V9 v$ Q+ w. J# q" t 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));7 t+ M5 N; ~/ ]7 P w9 l
- {6 f4 R6 Z5 A) E5 f/ ?: G8 c; A$ g HWREG(SOC_SYSCFG_0_REGS + SYSCFG0_PINMUX(12)) = (PINMUX12_RESET_ENABLE | PINMUX12_CONVST_ENABLE | PINMUX12_RD_ENABLE | PINMUX12_BUSY_C_ENABLE | savePinMux);4 x' `# ?% F$ U5 i9 u
: @+ N! D8 x; [) ?, s* |
}8 S0 E& M( C3 X& U5 g
% C. w# F% ^& @
3 X! t3 s( ? m; N% dstatic void ad7606_gpio_setup(ad7606 *ad) {- |& {/ `7 f+ x- z" Y
/*Set the AD7606_PAR_BUSY to the input mode*/
+ X3 E! g2 H' z7 u7 S' `. q //初始化5.11、5.9 、 5.5为中断口3 d% f( D. P' x/ @6 Y
GPIODirModeSet(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_V1, GPIO_DIR_INPUT);
( I" i% k. @3 _. H+ S6 X2 C GPIODirModeSet(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_V2, GPIO_DIR_INPUT);
8 b! b0 x$ ~% B GPIODirModeSet(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_C, GPIO_DIR_INPUT);
0 l) I8 F: Y6 Y: G8 m //GPIODirModeSet(SOC_GPIO_0_REGS, AD7606_PAR_BUSY, GPIO_DIR_INPUT);
6 C! c8 O+ u* _1 [5 Z /*Set the AD7606_PAR_BUSY to the Falling Edge Interrupt*/
9 S: G. ?; U5 Q" y! D0 ?$ n GPIOIntTypeSet(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_V1, GPIO_INT_TYPE_FALLEDGE);
/ ~ u' h# w# k GPIOIntTypeSet(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_V2, GPIO_INT_TYPE_FALLEDGE);
0 ^8 s# x. @, b; @: Z. \: R GPIOIntTypeSet(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_C, GPIO_INT_TYPE_FALLEDGE);1 K. y; P% ~. ]5 i% _
//GPIOIntTypeSet(SOC_GPIO_0_REGS, AD7606_PAR_BUSY, GPIO_INT_TYPE_FALLEDGE);
& [* k; Q& F6 S3 |4 ]1 u8 g /*The interrupt setting allows AD7606_PAR_BUSY_GPIO_BANK*/
7 b7 M- G8 |1 ?: U5 u H+ H GPIOBankIntEnable(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_GPIO_BANK);
7 F- q: o6 h7 d: y7 O. P/ a
2 f I- O+ h/ u" l$ P, w, Z GPIODirModeSet(SOC_GPIO_0_REGS, AD7606_PAR_RESET, GPIO_DIR_OUTPUT);
8 ~: E) S- ^. r0 B4 b$ B GPIOPinWrite(SOC_GPIO_0_REGS, AD7606_PAR_RESET, GPIO_PIN_HIGH);
* j% P% u7 J5 U5 |( ~+ g Task_sleep(1000);
- |% b2 j5 S( r$ b2 h$ B: m GPIOPinWrite(SOC_GPIO_0_REGS, AD7606_PAR_RESET, GPIO_PIN_LOW);* n/ L0 B. \: `) a( A' X4 v
Task_sleep(1000);" D$ `0 W* D8 e( p8 t/ J8 I
, g$ ?3 F* q5 N4 n; r C) O3 _
/*Set the AD7606_PAR_CONVST to output mode*/* T) K$ p1 y& A$ ^
GPIODirModeSet(SOC_GPIO_0_REGS, AD7606_PAR_CONVST, GPIO_DIR_OUTPUT);' f! X( Y8 Q. o. [
GPIOPinWrite(SOC_GPIO_0_REGS, AD7606_PAR_CONVST, GPIO_PIN_LOW);
6 F0 I# b3 n, H# m( j
# `# Y) X L' z7 n GPIODirModeSet(SOC_GPIO_0_REGS, AD7606_PAR_RD, GPIO_DIR_OUTPUT);
& s9 z1 e L$ S5 V; ? GPIOPinWrite(SOC_GPIO_0_REGS, AD7606_PAR_RD, GPIO_PIN_HIGH);* [4 k: i% }8 t+ {4 D6 `
+ W& t: k( ]) Q) ]! L) D& G8 _
}7 ]8 s/ E2 p7 M
3 G4 n3 ]7 k' H- q+ B( O: o2 `% M# U9 Y: p& |
static void ad7606_busy_hwi(UArg ad_addr) {
3 R: K$ |2 _3 K5 b) v- X) V$ [
7 g- D! {' N1 y
" ? w: |4 c$ i& t /* Disable the interrupts for pins of bank AD7606_PAR_BUSY in GPIO.*/
& ^7 t( O" x. b# ` GPIOBankIntDisable(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_GPIO_BANK); //用仿真器debug,发现程序能进入这里。
2 }0 r2 q2 Z3 ~, H- Z/ T, T2 \/ ?! y- |, ]( ]5 L
if(GPIOPinIntStatus(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_V1) == GPIO_INT_PEND)+ R* \* a. v" z5 }
{* O, J$ o4 V, U# G$ y* d
GPIOPinIntClear(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_V1); //问题是:用仿真器debug,发现程序不能进入这里。
3 x e; Y- V5 q, ~) ~3 _4 O cs_addr = SOC_EMIFA_CS5_ADDR ;
- _2 z H" G+ _: |& m' \( q internal = 0 ;
$ i! L' k& A2 B/ M int_flag[0] = 1 ;1 r2 u9 L1 R1 f% l4 G8 k
}% I" k7 t* d$ R% N. X: r p9 l
if(GPIOPinIntStatus(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_V2) == GPIO_INT_PEND)" m! I; r" X1 d
{
# }' s" ^. g8 r$ o% U/ O/ g GPIOPinIntClear(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_V2); //问题是:用仿真器debug,发现程序不能进入这里。' {1 d" [- M: _5 o( l, c
cs_addr = SOC_EMIFA_CS4_ADDR ;
+ C% |# P# J5 G internal = 6 ; w5 X5 w$ Y4 K; P8 \* [
int_flag[1] = 1 ;
1 G2 a1 u, U% Z1 [6 U }1 l9 Y3 M Z9 Q; U0 r% f6 `
if(GPIOPinIntStatus(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_C) == GPIO_INT_PEND)
6 O* G' |& ]6 o, d; O& l {
d" F8 ?# q8 K9 k8 }& ^% ^3 N GPIOPinIntClear(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_C); //问题是:用仿真器debug,发现程序不能进入这里。, ~9 @ D @1 Q- V& t, _
cs_addr = SOC_EMIFA_CS2_ADDR ;- v1 p& V( C! z8 T2 j
internal = 12 ;
5 j- L _* y b- d$ X$ s int_flag[2] = 1 ;6 k, y% `7 P6 F7 m+ T2 _: f
}
2 E0 i% y2 q3 M* Z- ?
6 ]! u5 u6 u5 |3 V. S1 e! G! K: s) V GPIOPinWrite(SOC_GPIO_0_REGS, AD7606_PAR_CONVST, GPIO_PIN_LOW);- i! d+ B3 U5 e( X& E- \
; k4 @1 D* b5 ^# [+ w. m+ t) Z+ o GPIOBankIntEnable(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_GPIO_BANK);
6 x# X& [; L6 Y1 u: |. b}
v/ \. x. d R# Y* o: O
4 v9 ~* h; k2 @' v |
|