|
|
您好。使用GPIO中断时,中断能进入ISR,但是不能区分具体的GPIO端口。程序如下:
1 r* r( T: a" ~4 J- ]$ H#define AD7606_PAR_BUSY_GPIO_BANK 5/ P/ @$ |/ [1 R" a" o$ k8 ^
#define AD7606_PAR_BUSY_GPIO_BANK_INT SYS_INT_GPIO_B5INT
1 R0 j$ }+ _0 ^ f: l/ Y1 H* T
, ]! _' P6 {$ A7 D) `, k#define AD7606_PAR_BUSY_V1 GPIO_TO_PIN(5, 11) //BANK5的中断口5.11
7 h, ~ A+ c4 H3 n4 N {#define AD7606_PAR_BUSY_V2 GPIO_TO_PIN(5, 9) //BANK5的中断口5.9
, ~0 C$ T; Q7 h0 X k3 M4 M#define AD7606_PAR_BUSY_C GPIO_TO_PIN(5, 5) //BANK5的中断口5.5. n5 @, \6 C' Y% y/ j
#define AD7606_PAR_BUSY GPIO_TO_PIN(5, 4)
+ }; ?# \/ u' O4 b& d* a# M! ]+ n9 P( c4 A: b- u1 s7 x: }+ Q
#define AD7606_PAR_CONVST GPIO_TO_PIN(5, 1)
* j4 d* }8 R! I#define AD7606_PAR_RD GPIO_TO_PIN(5, 2)
5 C0 ?3 S( K! \+ S; C/ e5 k#define AD7606_PAR_RESET GPIO_TO_PIN(5, 0)
6 _4 k8 K f/ K9 P9 {9 x. T' {: d) n6 w
8 V% C: O4 M M( M
. s: X' v0 c1 y$ p2 F& x* Wstatic void ad7606_irq_setup(ad7606 *ad) {
; D) C1 n9 T% g) a: u0 e0 V5 i; x q, e Hwi_Params hwiParams;+ }" ]% r8 l! C0 E
Hwi_Handle myHwi;
+ V+ A" Z2 f, o+ ], N& k Error_Block eb;3 S" ]& p- t0 {; i
9 J c6 [- F9 ^; g
Error_init(&eb);# ~$ N8 G" o4 m# G$ M: K# s" \
Hwi_Params_init(&hwiParams);( ~# G* w# M9 _" Y( e
hwiParams.arg = (unsigned int)ad;
1 |4 ^2 o5 |( Z$ b* ` hwiParams.enableInt = FALSE;* t9 O r+ a* L/ J
hwiParams.eventId = SYS_INT_GPIO_B5INT; Q; {- D! i9 ?6 m& i& V
hwiParams.priority = 4;
- J0 [# o. S6 |! r+ s' g myHwi = Hwi_create(8, ad7606_busy_hwi, &hwiParams, &eb); //注册BANK5中断处理函数/ Y$ N! { _) D) W. B
if (myHwi == NULL)
! \# m9 U7 Q$ ?) U: q% ?$ G LOG_FATAL("failed to create hwi");8 G+ [9 J1 G( \
$ X% n8 V1 R5 {9 z
/* enable both interrupts */2 R) Z5 u, p+ A, P/ m$ K6 i. M
Hwi_enableInterrupt(ad->irq_event);
* U2 L8 c7 l6 n' G* j. ^# \0 j}
. B( W: f0 e/ t9 ^) L4 O L0 J8 ?+ J- P: y0 M- c& C8 R/ a" m
" v& {" l3 T$ V7 T. A# p! y% J
static void ad7606_gpio_pinmux_setup(ad7606 *ad) {7 Y* O, S9 R2 \ V( q. k
volatile unsigned int savePinMux = 0;
, f( ~3 _( X& q3 w; M0 b //初始化5.11、5.9 、 5.5为GPIO口
! z5 H" G1 u% t) s% R savePinMux = HWREG(SOC_SYSCFG_0_REGS + SYSCFG0_PINMUX(11)) & (~(SYSCFG_PINMUX11_PINMUX11_27_24 | SYSCFG_PINMUX11_PINMUX11_19_16));
& }. m; U! Q l" t" k0 k& B3 w7 v
2 O4 o7 m; L l6 U HWREG(SOC_SYSCFG_0_REGS + SYSCFG0_PINMUX(11)) = (PINMUX11_BUSY_V1_ENABLE | PINMUX11_BUSY_V2_ENABLE | savePinMux);, a3 ]. ~" k$ O3 l5 E
# j! E9 g- C& R: E- g 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));
) `% z5 D5 u" O% t# Y% r4 D" N$ \5 A" H
HWREG(SOC_SYSCFG_0_REGS + SYSCFG0_PINMUX(12)) = (PINMUX12_RESET_ENABLE | PINMUX12_CONVST_ENABLE | PINMUX12_RD_ENABLE | PINMUX12_BUSY_C_ENABLE | savePinMux);
( N5 z" O( x! O/ m8 M& g3 x5 A. ?
/ L+ H! a4 k+ V* G+ W}# F2 i" w; C0 Y6 U
8 Y6 P# r: a4 I4 y1 p0 i0 S* ^- T1 d& Q0 I* C& r# t
static void ad7606_gpio_setup(ad7606 *ad) {
$ W8 C; E) a1 C, J8 ` /*Set the AD7606_PAR_BUSY to the input mode*/; E. X' f a5 D r4 t) j6 [
//初始化5.11、5.9 、 5.5为中断口
3 u0 A; n, O2 H. @8 Z GPIODirModeSet(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_V1, GPIO_DIR_INPUT);. A3 M: O+ |3 E
GPIODirModeSet(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_V2, GPIO_DIR_INPUT);
@6 `1 _, w3 @. }7 q0 M GPIODirModeSet(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_C, GPIO_DIR_INPUT);
2 P- b4 y2 {0 M) N+ M- Q //GPIODirModeSet(SOC_GPIO_0_REGS, AD7606_PAR_BUSY, GPIO_DIR_INPUT);/ W3 g8 o6 C8 _
/*Set the AD7606_PAR_BUSY to the Falling Edge Interrupt*/5 \# q- z" ]$ Y, m- m# x( B
GPIOIntTypeSet(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_V1, GPIO_INT_TYPE_FALLEDGE);) V; |. Q5 S1 r; N) J. I/ y, S
GPIOIntTypeSet(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_V2, GPIO_INT_TYPE_FALLEDGE);
" w& N! t/ ~. k, R GPIOIntTypeSet(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_C, GPIO_INT_TYPE_FALLEDGE);
9 M+ j H1 W% N' z! U //GPIOIntTypeSet(SOC_GPIO_0_REGS, AD7606_PAR_BUSY, GPIO_INT_TYPE_FALLEDGE);
) V& p$ N' u, T6 k$ w /*The interrupt setting allows AD7606_PAR_BUSY_GPIO_BANK*/
. H5 u, H0 T1 B$ n x: k4 ^4 S7 z1 T GPIOBankIntEnable(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_GPIO_BANK);
* Z: g9 {- h1 c6 ]) O) }* d4 j7 M$ G o
GPIODirModeSet(SOC_GPIO_0_REGS, AD7606_PAR_RESET, GPIO_DIR_OUTPUT);( `! k, d- b: B" ?" M/ T8 A
GPIOPinWrite(SOC_GPIO_0_REGS, AD7606_PAR_RESET, GPIO_PIN_HIGH);$ x e$ J# Y6 a* L. n$ x
Task_sleep(1000);
0 O: R6 { j6 M: F GPIOPinWrite(SOC_GPIO_0_REGS, AD7606_PAR_RESET, GPIO_PIN_LOW);6 \ m) _+ @, i! E: a6 W
Task_sleep(1000);
, o$ q5 G2 D1 q! c s
0 v8 m) Y8 N9 n, b$ R8 G: o /*Set the AD7606_PAR_CONVST to output mode*/
' I% S/ C0 G# M GPIODirModeSet(SOC_GPIO_0_REGS, AD7606_PAR_CONVST, GPIO_DIR_OUTPUT);+ j4 T( b$ }. i! l" A3 `
GPIOPinWrite(SOC_GPIO_0_REGS, AD7606_PAR_CONVST, GPIO_PIN_LOW);( B4 U9 I4 Z* s: C( [' X
( C0 z% k( }( T" R1 N& G GPIODirModeSet(SOC_GPIO_0_REGS, AD7606_PAR_RD, GPIO_DIR_OUTPUT);
; C1 |- r) {! H5 d GPIOPinWrite(SOC_GPIO_0_REGS, AD7606_PAR_RD, GPIO_PIN_HIGH);
5 e H, U# v% ]. p7 o8 L# ]0 G7 p
}3 u: y( z4 F0 y" X) D! T
# m9 x1 X j9 M ^3 ^& L! |5 q$ s* W: D) s9 }! R# r L7 F5 V' X
static void ad7606_busy_hwi(UArg ad_addr) {
, ?8 ?! A4 i. b4 ]
+ |0 j+ w: b% U+ l D8 _
, ?7 z3 g; N% f5 b! J ]8 Z /* Disable the interrupts for pins of bank AD7606_PAR_BUSY in GPIO.*/
& [: G e7 m- C4 d/ Q; G5 U GPIOBankIntDisable(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_GPIO_BANK); //用仿真器debug,发现程序能进入这里。 l8 C6 Z9 l0 {- N. m; P6 e
: ~ s' c; O& U) F3 e8 F
if(GPIOPinIntStatus(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_V1) == GPIO_INT_PEND)6 y3 ]9 }; E$ q
{
. V9 Q& G( a0 X' \9 c9 k GPIOPinIntClear(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_V1); //问题是:用仿真器debug,发现程序不能进入这里。
2 n _7 V5 K/ ~4 w( Z- _, g2 x4 E2 c cs_addr = SOC_EMIFA_CS5_ADDR ;
. O4 r% Z8 W: {8 B5 t internal = 0 ;
2 G7 c; p1 t; C, f2 Y* D int_flag[0] = 1 ;
' Z" M5 ~% E* F# r( I }8 z4 Y) W y* r8 u6 ~
if(GPIOPinIntStatus(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_V2) == GPIO_INT_PEND)
# A$ }% `1 X" K% D9 @; a9 E {
* ?9 W% b4 g" E2 E5 }" Y2 z$ y GPIOPinIntClear(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_V2); //问题是:用仿真器debug,发现程序不能进入这里。" p) i7 a5 g2 Y
cs_addr = SOC_EMIFA_CS4_ADDR ;
3 [# \5 ^) U0 ]! W3 @4 y+ ]- S3 U7 n internal = 6 ;
0 p9 H# [- b- w7 D2 N) a) l9 o int_flag[1] = 1 ;# ?* w8 m1 `% G3 f" i9 E$ u+ C
}. C: x/ O* c" ~6 h3 Q
if(GPIOPinIntStatus(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_C) == GPIO_INT_PEND)* k8 e* L: S3 O+ y0 q
{% U/ ?' K( w( F% M
GPIOPinIntClear(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_C); //问题是:用仿真器debug,发现程序不能进入这里。1 x/ ^7 Z) @ o3 }
cs_addr = SOC_EMIFA_CS2_ADDR ;' x; z$ a+ Z( F& |
internal = 12 ;
% Q( H/ T$ r1 Z9 C0 p& z; p" _: S int_flag[2] = 1 ;
1 H7 ^: h& ?9 b1 _' p7 D6 | }. }4 e# m# P7 K" w& B; n3 T8 q
7 w% g! m* K) G5 f3 q3 P" W GPIOPinWrite(SOC_GPIO_0_REGS, AD7606_PAR_CONVST, GPIO_PIN_LOW);8 X( a2 A; J# }
1 ?+ g" O# i3 W' Y
GPIOBankIntEnable(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_GPIO_BANK);
! p6 \( k' D) C3 m. @}
1 o* d: M. j* A4 u
% s6 r, O7 p! W3 f6 C. _6 z3 h D. T' w" t3 d
$ v9 I4 {( }+ o2 L4 \2 t" Q# M6 h) K! f F9 q! S4 J- K
|
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
|