|
|
您好。使用GPIO中断时,中断能进入ISR,但是不能区分具体的GPIO端口。程序如下:
$ e+ O9 w2 ~/ [& u2 N8 v#define AD7606_PAR_BUSY_GPIO_BANK 5; t U' a W. q* C, a3 a
#define AD7606_PAR_BUSY_GPIO_BANK_INT SYS_INT_GPIO_B5INT: n1 R/ c1 n/ _; y0 u
- N6 V! h. x% ~$ z4 F. u#define AD7606_PAR_BUSY_V1 GPIO_TO_PIN(5, 11) //BANK5的中断口5.11
7 z' s0 d" Y1 p6 b9 D4 D#define AD7606_PAR_BUSY_V2 GPIO_TO_PIN(5, 9) //BANK5的中断口5.9
% O" @. ^& E6 i: A#define AD7606_PAR_BUSY_C GPIO_TO_PIN(5, 5) //BANK5的中断口5.5
* l, z# L, \/ z% Z6 z#define AD7606_PAR_BUSY GPIO_TO_PIN(5, 4)
$ P/ d( U4 @2 D `4 s1 T0 F r" m9 u5 m
#define AD7606_PAR_CONVST GPIO_TO_PIN(5, 1)% _( ]* y7 ] r$ }5 M& L& ?" n
#define AD7606_PAR_RD GPIO_TO_PIN(5, 2)
Y6 n: {6 O/ h/ L' h* ~ E/ z* y9 [# x#define AD7606_PAR_RESET GPIO_TO_PIN(5, 0)) I$ G: q9 I- ?2 ~. B, i
D3 @; D$ n4 c: {8 X: |
2 K8 o$ _ O, w: m
2 a2 \! z) d5 w9 Nstatic void ad7606_irq_setup(ad7606 *ad) {8 Q! Z. G- c+ n# W
Hwi_Params hwiParams;6 q* X' J# P/ F z2 B3 p
Hwi_Handle myHwi;
; H7 c+ |8 K, W: Z/ ^- C, @5 V: y7 e Error_Block eb;
% F: r& }" B1 T8 H$ `6 i" S! ^! x* \" n' l8 g' o+ X
Error_init(&eb);
) k9 C# |# L9 e( q Hwi_Params_init(&hwiParams);
" u' A" D$ m- l/ H$ S+ H* ] hwiParams.arg = (unsigned int)ad;
+ F2 S7 i, @3 _: i& n. ` hwiParams.enableInt = FALSE;5 W1 o/ H" p+ F3 ^! o- k" B
hwiParams.eventId = SYS_INT_GPIO_B5INT;: [) H) o" P. t2 i" U- n
hwiParams.priority = 4;
0 K7 q, q* l& q myHwi = Hwi_create(8, ad7606_busy_hwi, &hwiParams, &eb); //注册BANK5中断处理函数
' ^; t5 z9 \- o: b1 L. } if (myHwi == NULL) 8 o; _% ?: E8 O+ {; l6 z
LOG_FATAL("failed to create hwi");
, Z* r) I) l* E& O1 s8 L* z- k2 i* ~9 z8 A, n' z; Z
/* enable both interrupts */% Q; W# x6 f1 P8 ] I9 }' ?
Hwi_enableInterrupt(ad->irq_event);
2 a0 j" d) b; T. P& F}
[' A( Q! u8 |. p; W
$ _/ d; T. y. V' \" Q; i# b2 |4 }0 U, e* Z* t
static void ad7606_gpio_pinmux_setup(ad7606 *ad) {
) U8 R4 `' X. l; C" ^3 @: t) t volatile unsigned int savePinMux = 0;
8 e, B+ }# s- u2 N //初始化5.11、5.9 、 5.5为GPIO口
$ l2 \+ N' F1 |9 t3 F+ f# r7 w3 c savePinMux = HWREG(SOC_SYSCFG_0_REGS + SYSCFG0_PINMUX(11)) & (~(SYSCFG_PINMUX11_PINMUX11_27_24 | SYSCFG_PINMUX11_PINMUX11_19_16));
1 P! h/ y+ `: `- `: r8 A3 u; t1 \/ Q
; I+ D3 g2 K6 @ Q2 P: P HWREG(SOC_SYSCFG_0_REGS + SYSCFG0_PINMUX(11)) = (PINMUX11_BUSY_V1_ENABLE | PINMUX11_BUSY_V2_ENABLE | savePinMux);+ A' S4 d+ d# {+ _1 P
9 l& D& D Z1 ]; i6 `
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));* b4 R! U& _5 ^& N: A! y- q
, F1 ^% t+ L! Y3 i/ R HWREG(SOC_SYSCFG_0_REGS + SYSCFG0_PINMUX(12)) = (PINMUX12_RESET_ENABLE | PINMUX12_CONVST_ENABLE | PINMUX12_RD_ENABLE | PINMUX12_BUSY_C_ENABLE | savePinMux);* Z; T& d7 C0 h+ O2 j# s/ l
" X. [1 h( ], L}* \% c* t2 N+ q- A: B" L
- g! j+ W$ X% Q/ H0 i. y O
' J9 O2 S1 E6 Jstatic void ad7606_gpio_setup(ad7606 *ad) {6 q# Z( w! ~: O6 d& r& i( L
/*Set the AD7606_PAR_BUSY to the input mode*/
* E/ y6 T( q6 Z+ m! |2 I, _% [ //初始化5.11、5.9 、 5.5为中断口
* w+ T! B! z/ L GPIODirModeSet(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_V1, GPIO_DIR_INPUT);, P4 f1 e3 h, m$ @+ u
GPIODirModeSet(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_V2, GPIO_DIR_INPUT);; J6 e. o, s& H/ S' ~/ S' }
GPIODirModeSet(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_C, GPIO_DIR_INPUT);5 E- z( P1 x& v2 ]+ } C2 D
//GPIODirModeSet(SOC_GPIO_0_REGS, AD7606_PAR_BUSY, GPIO_DIR_INPUT);% @' F; Q1 M' G3 _( ?
/*Set the AD7606_PAR_BUSY to the Falling Edge Interrupt*/2 s' I, `) W& F1 x% U
GPIOIntTypeSet(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_V1, GPIO_INT_TYPE_FALLEDGE);
$ V: A# o; @, o& R6 J) L GPIOIntTypeSet(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_V2, GPIO_INT_TYPE_FALLEDGE);
0 u6 H+ K# g u, |; P8 l GPIOIntTypeSet(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_C, GPIO_INT_TYPE_FALLEDGE);7 R# a+ i. U" G" ~ S0 F
//GPIOIntTypeSet(SOC_GPIO_0_REGS, AD7606_PAR_BUSY, GPIO_INT_TYPE_FALLEDGE);
. q0 x% I4 |* n& l* k P6 _1 c /*The interrupt setting allows AD7606_PAR_BUSY_GPIO_BANK*/, G) S% {9 D+ t4 G; o/ M* a
GPIOBankIntEnable(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_GPIO_BANK);
i5 d6 x) B8 {/ \4 p; i/ r0 i4 X/ g$ L7 Y
GPIODirModeSet(SOC_GPIO_0_REGS, AD7606_PAR_RESET, GPIO_DIR_OUTPUT);6 F I* f# A8 G3 W
GPIOPinWrite(SOC_GPIO_0_REGS, AD7606_PAR_RESET, GPIO_PIN_HIGH);0 @; r, r: c0 |: l9 P
Task_sleep(1000);1 b. K6 P+ k9 Z
GPIOPinWrite(SOC_GPIO_0_REGS, AD7606_PAR_RESET, GPIO_PIN_LOW);
% @# I' P8 x8 f. q% P- J; l+ h, R/ v Task_sleep(1000);$ c4 c( i2 g( W$ v
y' n: }2 \( K& q. z$ L- C4 u5 | /*Set the AD7606_PAR_CONVST to output mode*/
: p0 c4 d5 S/ I4 @; l* e7 Q GPIODirModeSet(SOC_GPIO_0_REGS, AD7606_PAR_CONVST, GPIO_DIR_OUTPUT);
0 p8 n# }2 Q3 r' |; o* s GPIOPinWrite(SOC_GPIO_0_REGS, AD7606_PAR_CONVST, GPIO_PIN_LOW);
% X" ~7 t) |4 ?" I) p8 P; u0 d) v6 d, X% }% Q$ t& Y
GPIODirModeSet(SOC_GPIO_0_REGS, AD7606_PAR_RD, GPIO_DIR_OUTPUT);! ?: `! t; ^# m$ E5 A
GPIOPinWrite(SOC_GPIO_0_REGS, AD7606_PAR_RD, GPIO_PIN_HIGH);3 J' k6 F8 Y d. h4 V; g
" {0 X" |$ _$ g2 p}* R0 ? D- {# D
1 t$ d0 u' [' r1 x# E, o I( {" B( R) | r) e$ m9 U/ `
static void ad7606_busy_hwi(UArg ad_addr) {
5 ]9 h( L) l" I2 `, |# L: C& F* z- n+ V6 U' Y# w9 Q9 Z9 S
, g1 `; f- T$ q! |0 p /* Disable the interrupts for pins of bank AD7606_PAR_BUSY in GPIO.*/
' V& `" ]8 M& B GPIOBankIntDisable(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_GPIO_BANK); //用仿真器debug,发现程序能进入这里。
" Z+ W2 m* _1 G# b) U- d+ H, z+ k1 i( q. o! ]% j
if(GPIOPinIntStatus(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_V1) == GPIO_INT_PEND)/ |- m& ^3 u2 u& u0 `
{
% V+ @* R) P+ g1 o6 j* Y: ] GPIOPinIntClear(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_V1); //问题是:用仿真器debug,发现程序不能进入这里。
2 O+ ^/ V8 F: g3 }1 u cs_addr = SOC_EMIFA_CS5_ADDR ;2 b9 w7 p! J+ ]* ?1 m3 x L
internal = 0 ;
& D1 ]: O1 m% I9 h, X0 j" [3 W int_flag[0] = 1 ;7 i8 Q* o, i+ t) _# ^) c
} t* ^/ i+ t6 K* |# X
if(GPIOPinIntStatus(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_V2) == GPIO_INT_PEND)1 H! X5 @5 O( g5 a! ], F
{. A; N" n6 d$ m: L1 J( k
GPIOPinIntClear(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_V2); //问题是:用仿真器debug,发现程序不能进入这里。
2 q$ ?3 T7 V# M1 L cs_addr = SOC_EMIFA_CS4_ADDR ;
" i0 \4 ~9 K2 b0 `, B# H& r internal = 6 ;
: c! _& r* y! t% O# c9 ^ \ int_flag[1] = 1 ;' |; K& N8 j7 w5 `
}
! F: ^, i# C; t: C4 q$ z i7 n' e if(GPIOPinIntStatus(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_C) == GPIO_INT_PEND)
$ }1 m/ g$ D+ k% R% I1 m {7 }$ ^8 K4 M- w- I
GPIOPinIntClear(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_C); //问题是:用仿真器debug,发现程序不能进入这里。
' ~2 x# N g8 k. w cs_addr = SOC_EMIFA_CS2_ADDR ;
# L! m3 r; h/ h# _6 h2 |" H& Y internal = 12 ;: C1 x O3 ~( D7 P2 y
int_flag[2] = 1 ;
- ~( `' E6 r) X. R6 S6 [9 b" e }
. I; x2 [% h4 q- ^
$ P6 D- L" E1 {! J% A GPIOPinWrite(SOC_GPIO_0_REGS, AD7606_PAR_CONVST, GPIO_PIN_LOW);8 T' G [0 q2 t( E( J) U1 c* Y
2 _. i7 i2 P9 I) ?# N' U" u- s GPIOBankIntEnable(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_GPIO_BANK);' }: b% h% u3 m( L
}
+ h0 Y! O6 M! p( X! P7 ]) z& z' O3 H6 X/ J8 k7 v6 x
& R4 c5 K5 ^* S; ^' G0 v' A
& s+ w8 a* f( H, u9 s/ M% V) \% l
7 `/ _6 \% E! m |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
|