|
您好。使用GPIO中断时,中断能进入ISR,但是不能区分具体的GPIO端口。程序如下:! J Y2 }' W* ], [
#define AD7606_PAR_BUSY_GPIO_BANK 5" v+ j7 m o0 Y' E; K1 J) d6 b
#define AD7606_PAR_BUSY_GPIO_BANK_INT SYS_INT_GPIO_B5INT1 F2 m4 j' s: o% u8 T2 e
9 M( C2 J& d: j/ i3 u#define AD7606_PAR_BUSY_V1 GPIO_TO_PIN(5, 11) //BANK5的中断口5.11
# _ H1 g5 v# J" k1 v4 G#define AD7606_PAR_BUSY_V2 GPIO_TO_PIN(5, 9) //BANK5的中断口5.9. B" Y9 a4 |- X2 e9 p
#define AD7606_PAR_BUSY_C GPIO_TO_PIN(5, 5) //BANK5的中断口5.5
; {% I, ^0 ?7 a" { f4 ~5 K; _#define AD7606_PAR_BUSY GPIO_TO_PIN(5, 4)
! g) Q$ g% M* f& ?( P7 g! U8 V4 a3 j! ]7 J' F! B" e! ^2 k4 l
#define AD7606_PAR_CONVST GPIO_TO_PIN(5, 1)% ?: C. g! U+ D5 n, J- ^$ o
#define AD7606_PAR_RD GPIO_TO_PIN(5, 2)
* E1 n2 D' r6 C* Q) B* D#define AD7606_PAR_RESET GPIO_TO_PIN(5, 0)5 \! v( B; i2 _' X0 o! H Z9 `
- s& L3 {' v6 r Y
# F# V2 B, R/ T7 l4 r( b* }+ r( v- v, r" `0 q3 |
static void ad7606_irq_setup(ad7606 *ad) {
8 g; }% z% U7 ]' i m Hwi_Params hwiParams;
+ [7 V- c5 G. J: [& \( l8 u0 j Hwi_Handle myHwi;9 T" Y. i9 T) S! V& n% e9 @ E
Error_Block eb;$ V2 w. I# f; w* Y: m8 q0 G5 ^, E
. O7 W G5 i1 E V Error_init(&eb);
# {- }# I7 G" U' S Hwi_Params_init(&hwiParams);# f) N7 I6 I1 ^" H" V
hwiParams.arg = (unsigned int)ad;
z1 _2 P+ G. k% [' `, u hwiParams.enableInt = FALSE;0 L6 \6 s, P0 e' L. k5 h
hwiParams.eventId = SYS_INT_GPIO_B5INT;
; }* D5 U# v1 ~6 e8 l/ Y2 v6 N5 S; F hwiParams.priority = 4;7 z5 E; K$ w z, `7 \: x8 P
myHwi = Hwi_create(8, ad7606_busy_hwi, &hwiParams, &eb); //注册BANK5中断处理函数
% Z4 ^" m( l: w, a/ w if (myHwi == NULL) 5 E# ]7 {" i+ ~1 f4 I
LOG_FATAL("failed to create hwi");
) [' K6 D( M6 k. U) d* j
/ K R- \/ k& y4 B0 b /* enable both interrupts */
+ n( B. `+ y# o" q Hwi_enableInterrupt(ad->irq_event);1 q3 }& A% O2 O2 D3 v
}8 u& R# m* S$ C0 T
. u5 }% K9 ]" L0 ]% L) P7 T
6 g7 B, j, e) ]* }& k+ Gstatic void ad7606_gpio_pinmux_setup(ad7606 *ad) {+ @0 u6 N0 t) g& ], @% Y E" X
volatile unsigned int savePinMux = 0;
0 v& f9 V$ r5 \+ b. P a! M- T //初始化5.11、5.9 、 5.5为GPIO口
7 E _" M2 u3 Z3 O& o/ J9 ?5 C( t savePinMux = HWREG(SOC_SYSCFG_0_REGS + SYSCFG0_PINMUX(11)) & (~(SYSCFG_PINMUX11_PINMUX11_27_24 | SYSCFG_PINMUX11_PINMUX11_19_16));
$ e2 J7 N, V$ i- \. j4 u4 _+ w8 B) W* [
HWREG(SOC_SYSCFG_0_REGS + SYSCFG0_PINMUX(11)) = (PINMUX11_BUSY_V1_ENABLE | PINMUX11_BUSY_V2_ENABLE | savePinMux);
9 ^6 r9 ^, o& x/ |8 {% P" U' C( A0 \ M. K @
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)); s) C/ I* b. ^6 ?) m- n
" k4 z5 r) ~; |: u, o7 Y# {6 A
HWREG(SOC_SYSCFG_0_REGS + SYSCFG0_PINMUX(12)) = (PINMUX12_RESET_ENABLE | PINMUX12_CONVST_ENABLE | PINMUX12_RD_ENABLE | PINMUX12_BUSY_C_ENABLE | savePinMux);
& m# z0 a# c T( V& }2 K& A
o, u" R8 S) |( m" j}( W( o2 P0 V6 x+ _) E3 K1 A& Q+ y
9 S1 y- R8 f# a- M S+ K. C( ^" z# o
$ ^8 q; c7 p) L. Dstatic void ad7606_gpio_setup(ad7606 *ad) {
6 o" C) k( M+ c, H' \ /*Set the AD7606_PAR_BUSY to the input mode*/
( Z4 q; T) }; D+ d //初始化5.11、5.9 、 5.5为中断口
' j% I. ]1 o) c/ H \! ~, p/ F GPIODirModeSet(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_V1, GPIO_DIR_INPUT);
5 v" p. Z; j+ V [1 ` GPIODirModeSet(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_V2, GPIO_DIR_INPUT);! K9 s0 [: ?0 j6 ^6 E
GPIODirModeSet(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_C, GPIO_DIR_INPUT);- Z' J- v3 g3 }# [- C
//GPIODirModeSet(SOC_GPIO_0_REGS, AD7606_PAR_BUSY, GPIO_DIR_INPUT);
1 C* Q2 h& {1 m2 { /*Set the AD7606_PAR_BUSY to the Falling Edge Interrupt*/
$ W% z7 u5 `1 U' Z; |8 i) e GPIOIntTypeSet(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_V1, GPIO_INT_TYPE_FALLEDGE);
' d& u, Q' s5 e) k+ L5 k* a GPIOIntTypeSet(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_V2, GPIO_INT_TYPE_FALLEDGE);- D' r# S' _; Q" M: _/ d1 Y
GPIOIntTypeSet(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_C, GPIO_INT_TYPE_FALLEDGE);
* c' N9 h2 i8 ] o! P4 [ //GPIOIntTypeSet(SOC_GPIO_0_REGS, AD7606_PAR_BUSY, GPIO_INT_TYPE_FALLEDGE);* M) q, x; I6 k8 w6 k y$ ]! O0 U
/*The interrupt setting allows AD7606_PAR_BUSY_GPIO_BANK*/8 q6 x ~, f, I# j. ~
GPIOBankIntEnable(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_GPIO_BANK);
7 T% }% f: n+ [5 [3 j0 Z; I7 D* Y( |4 { s
GPIODirModeSet(SOC_GPIO_0_REGS, AD7606_PAR_RESET, GPIO_DIR_OUTPUT);: U3 E& J1 Z4 P% z6 M5 \
GPIOPinWrite(SOC_GPIO_0_REGS, AD7606_PAR_RESET, GPIO_PIN_HIGH);
6 U+ W/ e- o4 Z4 z- {! u6 O7 x" w Task_sleep(1000);
2 Y8 `3 o' P2 w$ {3 O4 o7 | GPIOPinWrite(SOC_GPIO_0_REGS, AD7606_PAR_RESET, GPIO_PIN_LOW);
; l- n7 f5 m% a7 U4 j Task_sleep(1000);: N- b, t3 x2 q+ j1 R* D1 k
( ` `3 G- x9 Y9 x N# l) f2 d9 G
/*Set the AD7606_PAR_CONVST to output mode*/
: n+ y& A0 X# Y8 z* F/ K: { t GPIODirModeSet(SOC_GPIO_0_REGS, AD7606_PAR_CONVST, GPIO_DIR_OUTPUT);
% S% H& b# ~4 v; ~4 n/ J( C GPIOPinWrite(SOC_GPIO_0_REGS, AD7606_PAR_CONVST, GPIO_PIN_LOW);, m7 t, H$ }& ?, i( }
* P7 D7 x. _# a. U8 r9 p3 b% S
GPIODirModeSet(SOC_GPIO_0_REGS, AD7606_PAR_RD, GPIO_DIR_OUTPUT);
' A+ @' X/ h! A. ? GPIOPinWrite(SOC_GPIO_0_REGS, AD7606_PAR_RD, GPIO_PIN_HIGH);: K% x4 g- _6 b$ L- J* B
- w- x# f4 D' G8 C) \
}4 d, J" A. Q% l3 m# @
, z8 G7 d7 E6 b" ` p( ]
" ]5 X, H6 K) f5 E. J( ]- Lstatic void ad7606_busy_hwi(UArg ad_addr) {6 W: M) N" J5 s8 ^
, z, q& z6 E3 [. S4 K
# b7 L4 @7 _- E% M1 k$ z! e8 F /* Disable the interrupts for pins of bank AD7606_PAR_BUSY in GPIO.*/+ a% D6 W) [: k
GPIOBankIntDisable(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_GPIO_BANK); //用仿真器debug,发现程序能进入这里。
- {5 F) B0 J- V6 ^$ P
* k& w# F8 K* x if(GPIOPinIntStatus(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_V1) == GPIO_INT_PEND)
+ o5 A/ ?5 U# r( x* [8 x0 V( B3 u {
) y. ~$ d1 n) y GPIOPinIntClear(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_V1); //问题是:用仿真器debug,发现程序不能进入这里。
7 _) N% k. Q! h) R/ b# ?" g( I& | cs_addr = SOC_EMIFA_CS5_ADDR ;
% N! o( x6 C, P1 s2 c# |( m8 O- U internal = 0 ;
) M" q. s- |3 N( Q4 J6 H! N int_flag[0] = 1 ;
7 P/ r' H6 @5 G9 l* ?0 K( U, X }7 `3 V2 B& s7 _/ c9 m, I
if(GPIOPinIntStatus(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_V2) == GPIO_INT_PEND)
2 L3 X0 H) j" v$ l$ B. |' } x {- } w4 q" |3 L/ Y7 S
GPIOPinIntClear(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_V2); //问题是:用仿真器debug,发现程序不能进入这里。; F$ u" ^' ?5 u
cs_addr = SOC_EMIFA_CS4_ADDR ;
# M' Q5 F. L" ~$ _# a internal = 6 ;+ ?% l! M3 V) i$ v' @* ]
int_flag[1] = 1 ;0 X+ y2 P' F( @# L
}
+ ~6 f! l4 o x" J) m if(GPIOPinIntStatus(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_C) == GPIO_INT_PEND)
) Y, K' T! Z, a# G3 k! H* J/ } {: ~/ c0 z% Q. V! [; c
GPIOPinIntClear(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_C); //问题是:用仿真器debug,发现程序不能进入这里。
3 f% ~# x; L9 r4 W) X! z, {! I- [ cs_addr = SOC_EMIFA_CS2_ADDR ;
/ x! e1 V; R r M8 c& T% Y- s internal = 12 ;' T" C& a+ ^4 f7 v( ]8 o* y' a
int_flag[2] = 1 ;5 I3 J6 V9 H H
}. P8 n6 T* s8 P9 |% o* I: M
2 Y( e* Z9 j: t+ R& J
GPIOPinWrite(SOC_GPIO_0_REGS, AD7606_PAR_CONVST, GPIO_PIN_LOW);3 Q/ |# [1 r+ m6 J( n3 J0 y
. r4 ]' v" W+ u% P3 { GPIOBankIntEnable(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_GPIO_BANK);
I4 h3 d" I6 n5 N3 g- P}8 \6 N: Z# G3 c7 T# V1 w
4 V# }9 t9 p" }0 ]; Y% ~1 U; v
: {3 ^1 j0 _4 Y- Z' u7 R) O$ s7 k& v) l: T
0 C" D9 U# G/ U0 k5 ~! _8 z
|
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
|