|
您好。使用GPIO中断时,中断能进入ISR,但是不能区分具体的GPIO端口。程序如下:
4 P" _9 h: n/ U#define AD7606_PAR_BUSY_GPIO_BANK 5
2 F, y3 n) U. T, W#define AD7606_PAR_BUSY_GPIO_BANK_INT SYS_INT_GPIO_B5INT
* I3 H. l2 f5 e, v1 Q) t: y+ ]: {( t; D7 u- ~; ?
#define AD7606_PAR_BUSY_V1 GPIO_TO_PIN(5, 11) //BANK5的中断口5.11% P8 [2 V# J- C
#define AD7606_PAR_BUSY_V2 GPIO_TO_PIN(5, 9) //BANK5的中断口5.9% ~ G/ A! w% |4 W* @2 ]5 S* s
#define AD7606_PAR_BUSY_C GPIO_TO_PIN(5, 5) //BANK5的中断口5.58 Q5 ?# v% W. h: ?3 q
#define AD7606_PAR_BUSY GPIO_TO_PIN(5, 4)
# z8 Q( X! Y. A3 M; y9 x/ [1 U2 r |6 [! c0 A9 H, O
#define AD7606_PAR_CONVST GPIO_TO_PIN(5, 1)
9 B2 [0 _! T% K) l1 O#define AD7606_PAR_RD GPIO_TO_PIN(5, 2)
1 I) _ E0 V" C( H#define AD7606_PAR_RESET GPIO_TO_PIN(5, 0)" R! d; H& t0 w$ z. d1 X0 |/ O/ [
$ b0 d' R7 l0 ~% \! [
6 h0 h, f0 G4 b) d
: ]) P5 P _/ `! n0 Y rstatic void ad7606_irq_setup(ad7606 *ad) {1 F' V2 o+ ~4 ^* g2 }9 C
Hwi_Params hwiParams;
( T! W, j# P# K- R- h# a Hwi_Handle myHwi;2 Z D" t3 A) c% A9 f$ l
Error_Block eb;+ O+ F) |1 |, T6 {
; Q( m6 I6 C/ ]3 X6 g9 l u
Error_init(&eb);
7 g# W7 x' s' B Hwi_Params_init(&hwiParams);
8 { i4 d6 X6 l* L4 H- ] hwiParams.arg = (unsigned int)ad;$ u# P* T8 R( d7 m- o
hwiParams.enableInt = FALSE;" K0 o) U! `1 P9 N
hwiParams.eventId = SYS_INT_GPIO_B5INT;
3 X W( c% {( e- e8 P5 D hwiParams.priority = 4;
2 w; a+ z0 M& N& ~( P myHwi = Hwi_create(8, ad7606_busy_hwi, &hwiParams, &eb); //注册BANK5中断处理函数
, l. v6 v9 [9 U2 m6 q5 o; \ t if (myHwi == NULL)
. D- m* x# [- F) c LOG_FATAL("failed to create hwi");0 B8 O! S2 K) l2 d9 B5 g# ?
; i8 ~. H) S/ D /* enable both interrupts */) ~# Z6 h' Q- A' Y
Hwi_enableInterrupt(ad->irq_event);
" a! W; `3 E) z' w- r1 V7 s}
- W. j$ d; v0 w3 c. u
' L( t& s i6 p1 ~6 `; I+ b7 V# s s0 q5 J
static void ad7606_gpio_pinmux_setup(ad7606 *ad) {4 }" \& K. a. j/ l) ?
volatile unsigned int savePinMux = 0;
* k& k' n' k( P //初始化5.11、5.9 、 5.5为GPIO口4 j$ A r$ H. g6 o8 Q
savePinMux = HWREG(SOC_SYSCFG_0_REGS + SYSCFG0_PINMUX(11)) & (~(SYSCFG_PINMUX11_PINMUX11_27_24 | SYSCFG_PINMUX11_PINMUX11_19_16));5 A U( v: }) D$ B& I# o
: D0 @4 E3 ~& } HWREG(SOC_SYSCFG_0_REGS + SYSCFG0_PINMUX(11)) = (PINMUX11_BUSY_V1_ENABLE | PINMUX11_BUSY_V2_ENABLE | savePinMux);8 ?8 R. V0 C+ Q$ V
X% \2 w' ]5 B# M4 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));/ N2 d$ k. {4 s3 U
9 U$ i/ A5 `/ D; L HWREG(SOC_SYSCFG_0_REGS + SYSCFG0_PINMUX(12)) = (PINMUX12_RESET_ENABLE | PINMUX12_CONVST_ENABLE | PINMUX12_RD_ENABLE | PINMUX12_BUSY_C_ENABLE | savePinMux);3 a, c8 T! ^9 y. C z' ^+ ?+ [( N
! |7 D+ v- {- B. E. ~% |- |
}& `; t, M3 ?5 b# w! k& }
$ T0 h' O- @- C3 Y( J; W) J0 `
5 I6 I4 E# ~9 n- e; |3 p' v0 s" Lstatic void ad7606_gpio_setup(ad7606 *ad) {# U$ Z& K4 ], M# p7 m. l
/*Set the AD7606_PAR_BUSY to the input mode*/
4 V& o* z" O' t( H l6 W" b+ E- @ //初始化5.11、5.9 、 5.5为中断口3 l! U1 T# B4 L, E) |
GPIODirModeSet(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_V1, GPIO_DIR_INPUT);
7 X6 J) S1 k& C' [3 @ GPIODirModeSet(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_V2, GPIO_DIR_INPUT);& n! A* z& D5 v5 z
GPIODirModeSet(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_C, GPIO_DIR_INPUT);: d# D- E. ?6 g' @4 H
//GPIODirModeSet(SOC_GPIO_0_REGS, AD7606_PAR_BUSY, GPIO_DIR_INPUT);
& c) N7 v: P) f7 d& ` /*Set the AD7606_PAR_BUSY to the Falling Edge Interrupt*/# h+ h# R" M! o, f9 R5 a; i0 Q
GPIOIntTypeSet(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_V1, GPIO_INT_TYPE_FALLEDGE);' D- X4 ~) A7 ?) F: ?, R* D
GPIOIntTypeSet(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_V2, GPIO_INT_TYPE_FALLEDGE);
5 w1 x& e' { d6 r* i GPIOIntTypeSet(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_C, GPIO_INT_TYPE_FALLEDGE);* N# C3 d" N0 N2 P# o+ q7 o/ t+ b
//GPIOIntTypeSet(SOC_GPIO_0_REGS, AD7606_PAR_BUSY, GPIO_INT_TYPE_FALLEDGE);4 F5 |; d6 _ c. Z$ R9 L4 m
/*The interrupt setting allows AD7606_PAR_BUSY_GPIO_BANK*/! _4 j% h, U1 a& R
GPIOBankIntEnable(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_GPIO_BANK);
* N) F2 k9 K% j7 t% ?) f+ l5 O
2 r( g* M; E* M+ }+ Y! \ GPIODirModeSet(SOC_GPIO_0_REGS, AD7606_PAR_RESET, GPIO_DIR_OUTPUT);5 E' q* O5 L7 S4 `
GPIOPinWrite(SOC_GPIO_0_REGS, AD7606_PAR_RESET, GPIO_PIN_HIGH);
0 O3 x9 V' U! ^' t9 { Task_sleep(1000);, n5 b6 d+ S0 l" q
GPIOPinWrite(SOC_GPIO_0_REGS, AD7606_PAR_RESET, GPIO_PIN_LOW);
8 |; d' z, q5 b: x/ X Y0 P Task_sleep(1000);
/ m w! q# k @, q! D) H ~. `! N, C- {) J0 C }, K- x
/*Set the AD7606_PAR_CONVST to output mode*/
& P+ }+ h- }- v1 G5 l2 B( F GPIODirModeSet(SOC_GPIO_0_REGS, AD7606_PAR_CONVST, GPIO_DIR_OUTPUT);( [# O% y) U; z/ u! }7 d: d8 ~, N
GPIOPinWrite(SOC_GPIO_0_REGS, AD7606_PAR_CONVST, GPIO_PIN_LOW);; ]0 M x- V9 m8 G/ X3 D9 J( i
% H7 h& k- ]+ s, \( B# H GPIODirModeSet(SOC_GPIO_0_REGS, AD7606_PAR_RD, GPIO_DIR_OUTPUT);2 @0 S9 B3 c: O, o
GPIOPinWrite(SOC_GPIO_0_REGS, AD7606_PAR_RD, GPIO_PIN_HIGH);
7 `. j( l; x; t9 p8 J( z5 r8 A2 A8 Y; i* }" \9 }
}
/ j7 {4 |& @& ^; w# U% D0 k( J2 B4 m. u2 L- B5 F3 ?) _, X0 r4 ^
# q6 x% v$ i2 u8 j7 B/ Y A" o P
static void ad7606_busy_hwi(UArg ad_addr) {
9 S6 ~3 J' |9 e* f N8 m4 d4 l! I' D
3 J7 c) l. Q1 r
/* Disable the interrupts for pins of bank AD7606_PAR_BUSY in GPIO.*/
! e$ ~+ }, q j GPIOBankIntDisable(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_GPIO_BANK); //用仿真器debug,发现程序能进入这里。' a$ g" Q& W$ c5 f- d
% g L, g4 v8 n: i) E& h) y. G if(GPIOPinIntStatus(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_V1) == GPIO_INT_PEND)$ O0 w( Y5 M; Q& U0 z
{' o, A% Q- E" c, D9 v2 j1 w X
GPIOPinIntClear(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_V1); //问题是:用仿真器debug,发现程序不能进入这里。/ n% _% Q+ O: q8 ?
cs_addr = SOC_EMIFA_CS5_ADDR ;
+ m+ R# T# S0 S! a4 h- |; O internal = 0 ;
4 w! Z1 N$ w7 H) e5 P: ?% _- G int_flag[0] = 1 ;
7 W! F( Q% r( U$ \ }
: P0 r, ?6 u5 ~* |! Z' g if(GPIOPinIntStatus(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_V2) == GPIO_INT_PEND)( K% Z: A& ]( V! k0 c( @5 O; a# N
{
; s7 y! E' W9 Q' C GPIOPinIntClear(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_V2); //问题是:用仿真器debug,发现程序不能进入这里。
2 Y! g- G; {+ @3 q8 x cs_addr = SOC_EMIFA_CS4_ADDR ;* l9 f- K' W- h# Z* @- U5 |( u
internal = 6 ;) z6 Z( v& U; }4 Q7 b& o$ I9 c/ ]
int_flag[1] = 1 ;: W3 m( X- k+ X3 {
}
" h1 p8 Y& j, X: m7 G1 s if(GPIOPinIntStatus(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_C) == GPIO_INT_PEND)/ w' t# p: }* F* K
{
: ~# d" d4 Y% e4 i" h GPIOPinIntClear(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_C); //问题是:用仿真器debug,发现程序不能进入这里。8 Y3 q4 c( W# @7 _. o3 }8 u
cs_addr = SOC_EMIFA_CS2_ADDR ;$ \0 v7 V+ r, P
internal = 12 ;# R1 k, ^9 `' H
int_flag[2] = 1 ;( h& K1 W0 g1 Z
}' m. R" G6 C& R* {* b$ e
5 n# c/ U( @' x L1 E4 M1 U- p- n GPIOPinWrite(SOC_GPIO_0_REGS, AD7606_PAR_CONVST, GPIO_PIN_LOW);4 K% y& h; _+ ` i
# D# s3 E4 J5 f) O; Z& ^
GPIOBankIntEnable(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_GPIO_BANK);
/ f z( j! W. b. n. y3 Z, K6 W}. p/ M- g8 Q0 T, `8 M8 U& Y3 ^4 d4 t
" L' M; E) e# X' V6 H3 h( G
; a% @5 q% c$ W2 H
) x# z1 d3 W4 R; z
5 _. Z8 D+ c, f0 l6 V6 _ |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
|