|
您好。使用GPIO中断时,中断能进入ISR,但是不能区分具体的GPIO端口。程序如下:% i* j3 D/ N4 s) S4 \2 A" T& u
#define AD7606_PAR_BUSY_GPIO_BANK 5! k6 w" x' d+ z2 B2 q# o( s) k
#define AD7606_PAR_BUSY_GPIO_BANK_INT SYS_INT_GPIO_B5INT* _# Z+ W3 Q9 e
8 C6 _( P" A/ h#define AD7606_PAR_BUSY_V1 GPIO_TO_PIN(5, 11) //BANK5的中断口5.11
7 \5 \) C: T( b. p% ^5 b: s#define AD7606_PAR_BUSY_V2 GPIO_TO_PIN(5, 9) //BANK5的中断口5.9
6 l7 x+ ]! L5 H#define AD7606_PAR_BUSY_C GPIO_TO_PIN(5, 5) //BANK5的中断口5.5 V0 k1 w, j+ R! K
#define AD7606_PAR_BUSY GPIO_TO_PIN(5, 4)2 L! ?- n' H: o1 ?& `6 Y
* T3 E' S9 V/ V6 s
#define AD7606_PAR_CONVST GPIO_TO_PIN(5, 1)0 C2 A. J# a( u& q
#define AD7606_PAR_RD GPIO_TO_PIN(5, 2)
3 p/ r: e9 k: Z/ o9 h#define AD7606_PAR_RESET GPIO_TO_PIN(5, 0)8 Q1 i h. k# [1 U5 Y
5 |$ [+ W9 V4 H) B4 U2 m
0 [% M9 c: n; k5 X& ]; \
& G* m# O& S, {6 e+ u2 ^: K) A d" Rstatic void ad7606_irq_setup(ad7606 *ad) {( C1 E, p4 \7 b7 C' P% k6 }% U6 F9 x
Hwi_Params hwiParams;+ D2 Y; T9 P8 ^! `0 u2 z& u
Hwi_Handle myHwi;
6 ~" }3 N ^+ K$ d Error_Block eb;
9 E6 ?# F [/ p5 ]5 D, o6 k# h% Z f5 ~- u, ^; t& g6 i9 [
Error_init(&eb);+ G0 g1 |8 [7 d3 ?/ ~; n {8 D4 N
Hwi_Params_init(&hwiParams);$ l* t( p9 \: |1 [
hwiParams.arg = (unsigned int)ad;
9 |4 q* w8 e$ j: ? _. Z hwiParams.enableInt = FALSE;
: Q1 Q& S. ]3 h, r( p6 ] hwiParams.eventId = SYS_INT_GPIO_B5INT;
5 t5 e3 S5 z* M$ [% A/ { E @5 C) } hwiParams.priority = 4;/ [. q2 Q8 S/ X4 ]3 E
myHwi = Hwi_create(8, ad7606_busy_hwi, &hwiParams, &eb); //注册BANK5中断处理函数# Z; D( W6 m, `' b0 e; F/ i5 F5 h
if (myHwi == NULL) + _5 B0 e2 O/ D/ `
LOG_FATAL("failed to create hwi");
7 e J% @2 s5 t- g
" g: f8 B& I, u& [* @ /* enable both interrupts */
5 R3 z* r# n2 A$ e Hwi_enableInterrupt(ad->irq_event);
8 u/ Y* M0 ?4 U( Q# P% \7 u}1 w( w5 `' \) \4 d$ i# F
% h' m3 g. f9 e: F- `* N: ~8 l) ^8 c# b, Q# Q2 Z* ^& `
static void ad7606_gpio_pinmux_setup(ad7606 *ad) {. A- I* |" y5 |
volatile unsigned int savePinMux = 0;
+ d) U6 o6 U/ Q( R# E6 z //初始化5.11、5.9 、 5.5为GPIO口
7 |/ ]9 G9 i" y savePinMux = HWREG(SOC_SYSCFG_0_REGS + SYSCFG0_PINMUX(11)) & (~(SYSCFG_PINMUX11_PINMUX11_27_24 | SYSCFG_PINMUX11_PINMUX11_19_16));
- }, M0 s8 H: U6 o5 v# [3 T7 ~: l- Q6 \- r9 C9 t+ f& E$ P
HWREG(SOC_SYSCFG_0_REGS + SYSCFG0_PINMUX(11)) = (PINMUX11_BUSY_V1_ENABLE | PINMUX11_BUSY_V2_ENABLE | savePinMux);
, K' Q5 v) {4 [3 j0 n$ q. K# [) X9 e4 h' j
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));
" j; M6 p" k% D% T& @: D) _7 I6 r7 P6 r5 v2 c# E
HWREG(SOC_SYSCFG_0_REGS + SYSCFG0_PINMUX(12)) = (PINMUX12_RESET_ENABLE | PINMUX12_CONVST_ENABLE | PINMUX12_RD_ENABLE | PINMUX12_BUSY_C_ENABLE | savePinMux);
( y' V& A/ o- \; ]2 ]
. O k" o, @" x/ S2 T}
/ s* x$ a$ J S* q
0 m# s. m! `6 p
' G7 B f- s% h3 M/ c, \0 Zstatic void ad7606_gpio_setup(ad7606 *ad) {
7 @ e8 V5 L: }$ M2 O. r /*Set the AD7606_PAR_BUSY to the input mode*/* K7 f+ k3 Z6 y5 S/ _
//初始化5.11、5.9 、 5.5为中断口
( j$ I, {/ C. r$ A- y GPIODirModeSet(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_V1, GPIO_DIR_INPUT);" f0 y0 a+ P5 r5 z
GPIODirModeSet(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_V2, GPIO_DIR_INPUT);
3 ^' F9 }; T3 Q7 n2 _ GPIODirModeSet(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_C, GPIO_DIR_INPUT);. k9 ?1 l5 q( Q+ n
//GPIODirModeSet(SOC_GPIO_0_REGS, AD7606_PAR_BUSY, GPIO_DIR_INPUT);+ j4 Q- M. Q8 {
/*Set the AD7606_PAR_BUSY to the Falling Edge Interrupt*/
1 ~0 L4 a! |' k& _* B+ I H GPIOIntTypeSet(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_V1, GPIO_INT_TYPE_FALLEDGE);. Y z$ H! k4 O& H9 R0 _5 \
GPIOIntTypeSet(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_V2, GPIO_INT_TYPE_FALLEDGE);8 Q8 _5 n1 C' h
GPIOIntTypeSet(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_C, GPIO_INT_TYPE_FALLEDGE);# X& c* q+ z6 _. j
//GPIOIntTypeSet(SOC_GPIO_0_REGS, AD7606_PAR_BUSY, GPIO_INT_TYPE_FALLEDGE);: @; ]" u6 S! I3 p
/*The interrupt setting allows AD7606_PAR_BUSY_GPIO_BANK*/# N9 z6 j! \& p
GPIOBankIntEnable(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_GPIO_BANK);
& F3 w0 O1 Y# }# p8 c
, G7 ^& h: D+ S1 g- o4 ^ GPIODirModeSet(SOC_GPIO_0_REGS, AD7606_PAR_RESET, GPIO_DIR_OUTPUT);3 D ]% g3 m7 y. J W+ l% K
GPIOPinWrite(SOC_GPIO_0_REGS, AD7606_PAR_RESET, GPIO_PIN_HIGH);0 e, _ x' q6 t; b% X7 A
Task_sleep(1000);
5 i* R5 p* [, v) d7 m q GPIOPinWrite(SOC_GPIO_0_REGS, AD7606_PAR_RESET, GPIO_PIN_LOW);
- Z. g/ E. c* H0 n0 |" w Task_sleep(1000);
! j6 S3 _' \$ l6 F" k. m2 ?% F* h( n. g U
/*Set the AD7606_PAR_CONVST to output mode*/
5 K% a8 \0 U' L) K$ `* ~ GPIODirModeSet(SOC_GPIO_0_REGS, AD7606_PAR_CONVST, GPIO_DIR_OUTPUT);. o; c! t/ ~6 {- Z! r3 D$ P3 |4 r
GPIOPinWrite(SOC_GPIO_0_REGS, AD7606_PAR_CONVST, GPIO_PIN_LOW);; J+ n F4 ?* J) O$ O
2 b% B! D5 L: n5 C( h GPIODirModeSet(SOC_GPIO_0_REGS, AD7606_PAR_RD, GPIO_DIR_OUTPUT);' u; r, z% O6 ~
GPIOPinWrite(SOC_GPIO_0_REGS, AD7606_PAR_RD, GPIO_PIN_HIGH);
7 r1 h& ?# |. W) h3 b4 [! c1 l! d- C7 J2 H1 q; f/ f8 D7 l
}+ k0 V' S* }- e$ s
% z1 N6 A) I* j9 y0 j
: r/ K. m# s0 ~5 ]static void ad7606_busy_hwi(UArg ad_addr) {& z% a1 p7 N$ n+ d* F- z
/ ^: Y5 J1 }9 v" W. Y
/ l" v* Q3 I! }2 k7 C) J- E1 _ /* Disable the interrupts for pins of bank AD7606_PAR_BUSY in GPIO.*/
, x3 V& u T, @* T! \0 c y$ {: L GPIOBankIntDisable(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_GPIO_BANK); //用仿真器debug,发现程序能进入这里。
0 E$ n. M9 M1 D
0 J# B2 D% M# o2 }% w9 @: F3 G. U if(GPIOPinIntStatus(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_V1) == GPIO_INT_PEND)
u% w* Q0 u8 e* J ` {
7 h! B. j, _4 H! T2 N! Q7 z& c GPIOPinIntClear(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_V1); //问题是:用仿真器debug,发现程序不能进入这里。
+ C: k6 ?$ z) d. t( {- ~ cs_addr = SOC_EMIFA_CS5_ADDR ;
, s7 m8 W5 n/ ?! d" E2 a internal = 0 ;
$ w: n/ [9 [" ]/ R7 u5 G0 ?. B" h int_flag[0] = 1 ;
/ `$ d! r0 M# Q3 v+ I0 f8 e }
3 m! D8 }: D3 C+ l. h+ M8 s if(GPIOPinIntStatus(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_V2) == GPIO_INT_PEND)
/ A% \7 E0 x/ X5 }8 x4 O: _ {! z7 A/ ~" `1 }+ j& J
GPIOPinIntClear(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_V2); //问题是:用仿真器debug,发现程序不能进入这里。
7 C, r" g& r- @5 X; z9 T cs_addr = SOC_EMIFA_CS4_ADDR ;
. X) Y2 k. I) {/ c) o# E internal = 6 ;" c& |" x& K5 B9 q1 J3 i1 Z
int_flag[1] = 1 ;# |0 ?; e* [& a5 a8 D0 d5 W
}
i2 u" G# I* p* E if(GPIOPinIntStatus(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_C) == GPIO_INT_PEND)3 R/ z6 w5 C8 ]: n+ C+ s% @
{
- p9 n2 ^/ h, l; W0 x8 D7 V; M GPIOPinIntClear(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_C); //问题是:用仿真器debug,发现程序不能进入这里。
C! H. _7 K- ~3 l) N cs_addr = SOC_EMIFA_CS2_ADDR ;0 a% v9 O$ b+ S$ F' C8 Q
internal = 12 ;
# C! s8 p! Y* V* i- T1 p4 y7 { int_flag[2] = 1 ;
' E+ C& v3 x9 X }
' J+ Z' @5 ~, [0 w& w. k
9 T6 ?. ]" i# J# n$ | GPIOPinWrite(SOC_GPIO_0_REGS, AD7606_PAR_CONVST, GPIO_PIN_LOW);/ l! Y1 `& K! E# s! a5 V' e
5 @# [$ A, l: i GPIOBankIntEnable(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_GPIO_BANK);4 Q1 K* K5 L; k$ Y" t8 |$ M
}
2 P e& V7 }& q1 L7 J! ~; V' m% `3 P1 V9 ]5 K+ p
|
|