|
|
您好。使用GPIO中断时,中断能进入ISR,但是不能区分具体的GPIO端口。程序如下:
+ h' n6 P8 z( C- H#define AD7606_PAR_BUSY_GPIO_BANK 5
2 n' T5 j" D3 G# J2 f3 n! D#define AD7606_PAR_BUSY_GPIO_BANK_INT SYS_INT_GPIO_B5INT$ Q+ T1 T3 z7 w% h3 d3 i
3 {1 _+ @- ]& \$ j+ G4 J#define AD7606_PAR_BUSY_V1 GPIO_TO_PIN(5, 11) //BANK5的中断口5.11
+ d$ O5 D( E+ b6 Q+ Z; T, K8 Q#define AD7606_PAR_BUSY_V2 GPIO_TO_PIN(5, 9) //BANK5的中断口5.9. q0 k+ E; I8 k
#define AD7606_PAR_BUSY_C GPIO_TO_PIN(5, 5) //BANK5的中断口5.5
' w8 V' H. t- l e/ c#define AD7606_PAR_BUSY GPIO_TO_PIN(5, 4)
$ B. @1 n! R' d0 q5 n) N' F1 y" m) Z2 {" ~/ D F% k& N& i; o0 A
#define AD7606_PAR_CONVST GPIO_TO_PIN(5, 1)
4 g* v1 f; z V3 T#define AD7606_PAR_RD GPIO_TO_PIN(5, 2)
# s" b$ H5 E3 ?! o/ A8 Q#define AD7606_PAR_RESET GPIO_TO_PIN(5, 0)6 M" B) b5 l# v6 _0 R# J
# f* G/ D8 _5 G" H7 w. y) C2 A z( ^: f2 P! d
9 Z# L$ O# W8 |3 X8 N
static void ad7606_irq_setup(ad7606 *ad) {
/ L ^3 G) {% H+ |) r$ E8 y Hwi_Params hwiParams;
1 S6 B, S4 D* {+ v' D; i Hwi_Handle myHwi;4 \' i# V7 y' y% [: P. @
Error_Block eb;
' x. K& k0 G& T& N+ d: a) h; n5 B. E1 e! F0 \5 ]" o9 U( ^
Error_init(&eb);2 Y- W- f# D2 m. D: w W
Hwi_Params_init(&hwiParams);
$ k4 \2 z! g% D- z1 H. ` hwiParams.arg = (unsigned int)ad;+ r# k! `/ e5 f0 U, _; R
hwiParams.enableInt = FALSE;
8 U }+ t) \$ ]0 d" [3 h, W$ x2 R hwiParams.eventId = SYS_INT_GPIO_B5INT;
; ]+ [) m. t: D" e% C% N6 `3 k) o hwiParams.priority = 4;
4 R; d- i9 }/ d myHwi = Hwi_create(8, ad7606_busy_hwi, &hwiParams, &eb); //注册BANK5中断处理函数
F7 y# O8 d" p( S r$ ~: M# o if (myHwi == NULL)
/ t$ _5 ?, ^& L LOG_FATAL("failed to create hwi");, x7 x6 N: y7 w
Y' y4 M% I, @, c: L
/* enable both interrupts */3 f4 }6 d+ @! }/ @$ J [6 c4 u5 d; f
Hwi_enableInterrupt(ad->irq_event);
7 q5 l: I6 b3 Y; _' \8 c4 U9 I}, H" ^4 Y- k9 G* ?5 z
( }9 K# F* Q0 Y
% c' X) [ f- ?" n$ Bstatic void ad7606_gpio_pinmux_setup(ad7606 *ad) {# M/ Y! o& y; @# E1 \$ N
volatile unsigned int savePinMux = 0;
- H/ ?3 s- \, i9 H x5 M0 a //初始化5.11、5.9 、 5.5为GPIO口
4 ^% Q: Y! ~- _3 M+ Q- U6 k( S: E% K: ] savePinMux = HWREG(SOC_SYSCFG_0_REGS + SYSCFG0_PINMUX(11)) & (~(SYSCFG_PINMUX11_PINMUX11_27_24 | SYSCFG_PINMUX11_PINMUX11_19_16));7 ]8 l0 f6 n4 z' M+ R/ j
0 o [5 B$ U. I& T HWREG(SOC_SYSCFG_0_REGS + SYSCFG0_PINMUX(11)) = (PINMUX11_BUSY_V1_ENABLE | PINMUX11_BUSY_V2_ENABLE | savePinMux);
/ f' U9 N% c. g ?5 r) [/ e% {9 [' @+ ` [
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));
[6 G9 \. f3 V. G q/ K- m: P
3 M( e6 {# u" W% e! _ HWREG(SOC_SYSCFG_0_REGS + SYSCFG0_PINMUX(12)) = (PINMUX12_RESET_ENABLE | PINMUX12_CONVST_ENABLE | PINMUX12_RD_ENABLE | PINMUX12_BUSY_C_ENABLE | savePinMux);/ G9 |9 I8 Z( s" A+ Z) K2 `
9 D1 ^* y6 F3 X}7 X. ` `( {- G5 |/ p4 ?
g& u2 t# s4 K) ]$ w( X9 T9 P
" B+ Q4 c" U0 @4 M7 L9 i' @0 b% d
static void ad7606_gpio_setup(ad7606 *ad) {% F9 z( g/ E. `; ]0 u
/*Set the AD7606_PAR_BUSY to the input mode*/* v) v: S6 }% {# |
//初始化5.11、5.9 、 5.5为中断口
8 V! r+ u$ S5 E( x. I GPIODirModeSet(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_V1, GPIO_DIR_INPUT);
/ b0 ]( @2 j4 M- [9 ^6 `( s9 n0 P GPIODirModeSet(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_V2, GPIO_DIR_INPUT);6 a& U- h1 y: g: t0 I4 b
GPIODirModeSet(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_C, GPIO_DIR_INPUT);* R0 W; k/ e- O! c0 l5 P
//GPIODirModeSet(SOC_GPIO_0_REGS, AD7606_PAR_BUSY, GPIO_DIR_INPUT);7 K/ k8 [( F1 t: E+ t* z6 @
/*Set the AD7606_PAR_BUSY to the Falling Edge Interrupt*/
) q" u1 c' r) n: t* T" @0 ?, _ GPIOIntTypeSet(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_V1, GPIO_INT_TYPE_FALLEDGE);
) r% n9 G! C2 e GPIOIntTypeSet(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_V2, GPIO_INT_TYPE_FALLEDGE);, [/ n, M- u% a/ t* P
GPIOIntTypeSet(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_C, GPIO_INT_TYPE_FALLEDGE);( I9 x5 h3 u8 k
//GPIOIntTypeSet(SOC_GPIO_0_REGS, AD7606_PAR_BUSY, GPIO_INT_TYPE_FALLEDGE);* f% w- T$ s" S7 z1 B* Q% r$ ^6 J
/*The interrupt setting allows AD7606_PAR_BUSY_GPIO_BANK*/
- o. n8 \5 D/ R: O% s GPIOBankIntEnable(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_GPIO_BANK);* {' H. [- _- [9 x# j
4 M2 ]4 R8 ^7 y1 o6 d! ?3 |! w GPIODirModeSet(SOC_GPIO_0_REGS, AD7606_PAR_RESET, GPIO_DIR_OUTPUT);
5 m1 r Y- G/ ]5 R0 B0 E GPIOPinWrite(SOC_GPIO_0_REGS, AD7606_PAR_RESET, GPIO_PIN_HIGH);) M. a+ z2 V. i/ X5 l3 }) L
Task_sleep(1000);0 X9 h$ ]8 h/ v9 @
GPIOPinWrite(SOC_GPIO_0_REGS, AD7606_PAR_RESET, GPIO_PIN_LOW);
3 `+ z. Z$ ?% P Task_sleep(1000);$ }2 G; g/ i% @; \( A% s- k2 q* |$ |% ?
o2 V3 h: H/ @8 e4 ?+ e! G' B
/*Set the AD7606_PAR_CONVST to output mode*/
. K+ Q; L+ y" Q GPIODirModeSet(SOC_GPIO_0_REGS, AD7606_PAR_CONVST, GPIO_DIR_OUTPUT);
! m8 \: y: C% _ GPIOPinWrite(SOC_GPIO_0_REGS, AD7606_PAR_CONVST, GPIO_PIN_LOW);
, Z; N) y& `% [) ]3 z1 c9 g' v$ \: {. J; c0 g5 Z, F
GPIODirModeSet(SOC_GPIO_0_REGS, AD7606_PAR_RD, GPIO_DIR_OUTPUT);5 P0 C/ R8 z3 U( s
GPIOPinWrite(SOC_GPIO_0_REGS, AD7606_PAR_RD, GPIO_PIN_HIGH);
; v* V% a2 G4 I3 d. c
|7 \5 |7 _" y: L5 @$ ?% F1 Q}
2 D9 z, _/ X1 u R& d+ Y* ?/ Z9 V1 A& `7 Y
" F! |6 S' ?% d( E
static void ad7606_busy_hwi(UArg ad_addr) {
- q" O, G* `4 p% b1 d; w7 P7 G* }' g2 G7 s
4 O. t0 _8 Z N! I2 r3 E
/* Disable the interrupts for pins of bank AD7606_PAR_BUSY in GPIO.*/
# B* s2 P8 X7 r1 x" n$ D2 k9 T/ g GPIOBankIntDisable(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_GPIO_BANK); //用仿真器debug,发现程序能进入这里。" P; w/ I0 k- T6 W3 d K' I
* ^- M# _ E& m: u( A/ D7 z% e1 y
if(GPIOPinIntStatus(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_V1) == GPIO_INT_PEND)
2 k+ b/ P. }/ {. J {
4 x! m: ^: J4 [ GPIOPinIntClear(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_V1); //问题是:用仿真器debug,发现程序不能进入这里。
1 Q# v3 K/ q! C/ _! u cs_addr = SOC_EMIFA_CS5_ADDR ;- M4 A# h! Y+ j1 g8 {
internal = 0 ;
6 b, l" p8 h' w- A, N' a! d int_flag[0] = 1 ;
% p( f7 C/ {! o) ^1 a8 ~# q }6 X" [+ _/ i# w/ j, Z- Y4 u
if(GPIOPinIntStatus(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_V2) == GPIO_INT_PEND)- J) A4 U0 G8 {/ t. V; U
{0 @2 s3 R. I. z: O M
GPIOPinIntClear(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_V2); //问题是:用仿真器debug,发现程序不能进入这里。 e3 ~$ c4 ?+ m( b& f
cs_addr = SOC_EMIFA_CS4_ADDR ;. f' c/ k; }/ R" m: U8 ~, ?; l
internal = 6 ;
T/ q# U* ]- h* r, j int_flag[1] = 1 ;5 L7 U9 C) E8 T3 i7 _4 F
}- {( a& L/ o; r) `* e& t: M
if(GPIOPinIntStatus(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_C) == GPIO_INT_PEND)
7 d0 q3 A; t- m' n) W {
3 }7 Y2 [9 k2 Q# [. h& f1 i GPIOPinIntClear(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_C); //问题是:用仿真器debug,发现程序不能进入这里。5 k0 s' h3 O' B. _2 |/ B j: U
cs_addr = SOC_EMIFA_CS2_ADDR ;
4 E+ d7 }* v% w# _7 ~ internal = 12 ;
% P2 ?" |1 x' ^' k$ _8 Z6 O, D int_flag[2] = 1 ;9 f% @( M) h. l1 A/ u
}$ w" K: J+ v+ W' {
: Z0 O' ]9 w) J+ d: K" ^( D' P# p; Z GPIOPinWrite(SOC_GPIO_0_REGS, AD7606_PAR_CONVST, GPIO_PIN_LOW);# G( ]8 ]3 x5 g+ L* ^
! Z0 y& _& f B- A0 ^7 z2 j GPIOBankIntEnable(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_GPIO_BANK);0 w3 u5 `0 n8 ?4 O# {6 n5 ?) R+ ^
}
3 ]) z- U, r/ b" |( W z# z) S; v
|
|