|
您好。使用GPIO中断时,中断能进入ISR,但是不能区分具体的GPIO端口。程序如下:
5 o8 E) R4 w, b$ P& s7 M#define AD7606_PAR_BUSY_GPIO_BANK 5
, I% }) U% X8 A# g) b7 j: q% |#define AD7606_PAR_BUSY_GPIO_BANK_INT SYS_INT_GPIO_B5INT; L0 Q' F1 N' _& q
) n" G9 K- x: o: b1 Y3 K& G' C
#define AD7606_PAR_BUSY_V1 GPIO_TO_PIN(5, 11) //BANK5的中断口5.11$ b: _* L1 a( t6 n7 p
#define AD7606_PAR_BUSY_V2 GPIO_TO_PIN(5, 9) //BANK5的中断口5.98 H: s5 ~4 P) }* X$ U
#define AD7606_PAR_BUSY_C GPIO_TO_PIN(5, 5) //BANK5的中断口5.5- E6 N$ w% P7 e e3 y. K+ b
#define AD7606_PAR_BUSY GPIO_TO_PIN(5, 4)7 \" F0 B+ K f$ C
0 r. U5 ]3 z4 y$ Q
#define AD7606_PAR_CONVST GPIO_TO_PIN(5, 1)! p+ s. O4 o8 l8 o) h% a- v5 D
#define AD7606_PAR_RD GPIO_TO_PIN(5, 2)& Q8 D- n4 h4 _' R
#define AD7606_PAR_RESET GPIO_TO_PIN(5, 0)9 ~4 x2 M: l/ Z9 u, a% \! r1 H5 u7 g
: C% u5 l1 _9 W" Z1 N0 b% ^* E$ |3 K
: T4 H0 j- l1 j' R
_. D5 [$ ~/ w i8 E6 Qstatic void ad7606_irq_setup(ad7606 *ad) {
/ Q G+ c- H% y, r Hwi_Params hwiParams;
) D# F' u4 U" O" u7 h% @$ W0 S Hwi_Handle myHwi;( H4 k0 l, t& V7 p' m
Error_Block eb;( X/ @( m$ d3 b$ p7 U
5 D$ Z' @) g8 q c; {: ^ Error_init(&eb);& x" u; Y9 N& P+ [: t4 G: ~
Hwi_Params_init(&hwiParams);
1 ]) a% p3 y0 }, i hwiParams.arg = (unsigned int)ad;
: F6 i# m- Y/ e) ?. t$ ?6 ? hwiParams.enableInt = FALSE;
5 o5 G9 l- {7 }8 E( Q hwiParams.eventId = SYS_INT_GPIO_B5INT;! H0 e6 p8 b! c! O# C
hwiParams.priority = 4;
# V& n8 `+ l: \! x0 } myHwi = Hwi_create(8, ad7606_busy_hwi, &hwiParams, &eb); //注册BANK5中断处理函数 m/ K: o- |" d# a$ Y: J, T
if (myHwi == NULL)
5 }2 O) p, {6 n: x. R5 A: ^1 v$ J LOG_FATAL("failed to create hwi");: T% i2 {( L( e8 ?: T* a
; B# H$ b7 R: H3 V& L /* enable both interrupts */. L/ Q, R8 B' ]0 W3 K) D
Hwi_enableInterrupt(ad->irq_event);0 M) Z; G$ t; f0 I% Z
}
I: Q+ Q, M+ W' F, G' y+ W8 {
. s h4 H. @, g- D# O" }
static void ad7606_gpio_pinmux_setup(ad7606 *ad) {3 s6 }0 T6 V! c2 @3 ^
volatile unsigned int savePinMux = 0;: A0 A$ G/ ~" R4 B, L2 s% x
//初始化5.11、5.9 、 5.5为GPIO口
7 n0 i# }: n5 V( c0 h/ _ savePinMux = HWREG(SOC_SYSCFG_0_REGS + SYSCFG0_PINMUX(11)) & (~(SYSCFG_PINMUX11_PINMUX11_27_24 | SYSCFG_PINMUX11_PINMUX11_19_16));" m) n2 t" \& a# ^- C
/ u% G" N/ y: `
HWREG(SOC_SYSCFG_0_REGS + SYSCFG0_PINMUX(11)) = (PINMUX11_BUSY_V1_ENABLE | PINMUX11_BUSY_V2_ENABLE | savePinMux);& {8 n8 Q, p" ?; ]
# |- J% k4 C; r1 [( N/ ~, b4 x 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));- E6 i* g+ o& R' K2 ~
$ D4 P; i9 x7 g# a' L HWREG(SOC_SYSCFG_0_REGS + SYSCFG0_PINMUX(12)) = (PINMUX12_RESET_ENABLE | PINMUX12_CONVST_ENABLE | PINMUX12_RD_ENABLE | PINMUX12_BUSY_C_ENABLE | savePinMux);
+ X+ ~$ K* M$ r" V& _+ V0 \: Y: Z3 `5 u, X
}& k4 J: I4 |8 M: O Y, _
8 t7 o, O/ d2 E0 z7 f0 Q
1 c3 O; N' |/ O0 m
static void ad7606_gpio_setup(ad7606 *ad) {% o- d& L9 y) b, |
/*Set the AD7606_PAR_BUSY to the input mode*/; y! r0 ?! I$ u2 _* D) ?
//初始化5.11、5.9 、 5.5为中断口8 d% F& i: M" Y! Y
GPIODirModeSet(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_V1, GPIO_DIR_INPUT);
. a/ u% }" o+ [! ~5 |, v GPIODirModeSet(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_V2, GPIO_DIR_INPUT);
) N! p# ?/ F8 T GPIODirModeSet(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_C, GPIO_DIR_INPUT);
: X/ p y" m; j. l //GPIODirModeSet(SOC_GPIO_0_REGS, AD7606_PAR_BUSY, GPIO_DIR_INPUT);
9 j- V$ r. @8 r1 Y% j0 v; v /*Set the AD7606_PAR_BUSY to the Falling Edge Interrupt*/5 a$ w# e; H6 |
GPIOIntTypeSet(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_V1, GPIO_INT_TYPE_FALLEDGE);
* ~2 r9 a, U. n8 L: f" a GPIOIntTypeSet(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_V2, GPIO_INT_TYPE_FALLEDGE);
/ W- X) e1 }4 L6 p2 D0 t GPIOIntTypeSet(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_C, GPIO_INT_TYPE_FALLEDGE);! [* ?- f9 i/ W
//GPIOIntTypeSet(SOC_GPIO_0_REGS, AD7606_PAR_BUSY, GPIO_INT_TYPE_FALLEDGE);
4 `& e8 x. g+ K4 S" I1 j; ^- m" M4 h /*The interrupt setting allows AD7606_PAR_BUSY_GPIO_BANK*/
5 ?7 M9 i9 H. s GPIOBankIntEnable(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_GPIO_BANK);- ~+ t7 z0 C/ \ N& Y! G- u X. H
! U# r) m# g7 P5 d2 X0 Y1 {
GPIODirModeSet(SOC_GPIO_0_REGS, AD7606_PAR_RESET, GPIO_DIR_OUTPUT);
m. e, H1 [' @5 M# J d GPIOPinWrite(SOC_GPIO_0_REGS, AD7606_PAR_RESET, GPIO_PIN_HIGH);9 K: U4 m: s' F, N, K
Task_sleep(1000);' V( Q* o e, {+ A
GPIOPinWrite(SOC_GPIO_0_REGS, AD7606_PAR_RESET, GPIO_PIN_LOW);
3 k2 r4 h$ U, b Task_sleep(1000);4 I d9 k* e4 L9 ]
/ E& `1 i" I. M+ g# U1 n
/*Set the AD7606_PAR_CONVST to output mode*/% U. l4 K6 l }: M
GPIODirModeSet(SOC_GPIO_0_REGS, AD7606_PAR_CONVST, GPIO_DIR_OUTPUT);
7 l. T0 h7 p: c. f$ h" ` @ GPIOPinWrite(SOC_GPIO_0_REGS, AD7606_PAR_CONVST, GPIO_PIN_LOW);
5 h9 V4 Q9 H6 @ s$ z4 d+ G- D( b$ M0 \/ W( d. X# c
GPIODirModeSet(SOC_GPIO_0_REGS, AD7606_PAR_RD, GPIO_DIR_OUTPUT);
& [9 U Y" d! F3 a- I7 r9 U# ` GPIOPinWrite(SOC_GPIO_0_REGS, AD7606_PAR_RD, GPIO_PIN_HIGH);
7 L, e! l- k9 `: N% @5 v* A- S1 b; {0 \
}
2 x! [3 |: g* L- I2 l
! R; y( {. c& K0 y* N% P/ J
/ z4 C: Z& J7 s& ?* S; Xstatic void ad7606_busy_hwi(UArg ad_addr) {
: S3 f& T7 D: I
( t/ K6 {/ E7 i( D0 @
* A% ]1 J. Z( a' t: s' d /* Disable the interrupts for pins of bank AD7606_PAR_BUSY in GPIO.*/
6 Y! N3 u5 i8 g, @1 b" a B GPIOBankIntDisable(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_GPIO_BANK); //用仿真器debug,发现程序能进入这里。
( y0 g- b! i+ s0 @7 ~( X
* t" A# M8 Y' V' D# ^9 W, P4 U7 m if(GPIOPinIntStatus(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_V1) == GPIO_INT_PEND)
8 w! q* Y+ r! J {
, r! u& ~( U8 h l GPIOPinIntClear(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_V1); //问题是:用仿真器debug,发现程序不能进入这里。
9 u3 s5 t; u& M( l; a t cs_addr = SOC_EMIFA_CS5_ADDR ;9 Q* N- y6 X% [* Y! R6 Y6 ^
internal = 0 ;9 ^4 Q* z. u, H2 @
int_flag[0] = 1 ;
; t1 B. \1 @- w }* ~# n4 X' ~/ m! Q) ]( k! s
if(GPIOPinIntStatus(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_V2) == GPIO_INT_PEND)
! W/ K6 a4 f7 H# f9 e7 H/ S$ B1 } {& N( O& @' J3 z6 y" H& e5 I
GPIOPinIntClear(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_V2); //问题是:用仿真器debug,发现程序不能进入这里。" j. Z0 \. @+ b$ d/ ?+ j
cs_addr = SOC_EMIFA_CS4_ADDR ;1 C) H0 t/ F- \1 p, w+ y
internal = 6 ;
- o" r& a/ y- ^7 [4 c int_flag[1] = 1 ;1 _. {$ H# s3 l3 a8 p7 h' u
}
5 v3 }' R, J2 L; q" I: Z if(GPIOPinIntStatus(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_C) == GPIO_INT_PEND)
~5 r5 [: N. A* Q: ?% {, e {
& a, Z/ E! h5 ~ GPIOPinIntClear(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_C); //问题是:用仿真器debug,发现程序不能进入这里。
3 @9 r- j6 z* [7 Z cs_addr = SOC_EMIFA_CS2_ADDR ;4 _1 @/ _# W7 ^* J/ E
internal = 12 ;
8 b) u) u: `. O* P7 H& Q2 n0 D int_flag[2] = 1 ;
/ `" q. j4 C# {8 n* C }
9 L6 c& I3 r; N7 b) a( I ( Q' m1 z0 i3 G! j [1 H2 M1 r" O
GPIOPinWrite(SOC_GPIO_0_REGS, AD7606_PAR_CONVST, GPIO_PIN_LOW);
6 B% L' N, a6 Y9 X( A+ C! S
/ i+ P# @) ^7 D+ S6 W GPIOBankIntEnable(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_GPIO_BANK);
P5 |7 `+ P4 r; [}" x" G4 |+ H& ~$ f
; m* V0 q# E: _2 w3 n4 t) N0 J1 H
2 c4 M" l, K! y/ H2 L& [9 S! s! ?+ w5 N- M
0 F: `9 e! e; ]7 d! c0 `" e5 M |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
|