|
|
您好。使用GPIO中断时,中断能进入ISR,但是不能区分具体的GPIO端口。程序如下:$ b7 t+ A# f% _
#define AD7606_PAR_BUSY_GPIO_BANK 5
6 m0 F5 t9 n/ m9 ]' T5 l#define AD7606_PAR_BUSY_GPIO_BANK_INT SYS_INT_GPIO_B5INT: F; v% x0 f% s% J: n
7 \+ q2 ~- G3 z8 d! c
#define AD7606_PAR_BUSY_V1 GPIO_TO_PIN(5, 11) //BANK5的中断口5.11
; [8 j, R3 a! a) x7 `, j7 H#define AD7606_PAR_BUSY_V2 GPIO_TO_PIN(5, 9) //BANK5的中断口5.9
; N7 ?8 \ _' k% e; Q1 l#define AD7606_PAR_BUSY_C GPIO_TO_PIN(5, 5) //BANK5的中断口5.5
) ~6 @6 C2 a1 t5 w7 C& W$ Y#define AD7606_PAR_BUSY GPIO_TO_PIN(5, 4)
; |/ P6 C1 ]$ r# K3 b& O, ~ ~7 l4 E7 j0 l& N% F' K
#define AD7606_PAR_CONVST GPIO_TO_PIN(5, 1)* h' j# L& e: k
#define AD7606_PAR_RD GPIO_TO_PIN(5, 2)9 t0 _/ O6 V" O* r [3 J0 |
#define AD7606_PAR_RESET GPIO_TO_PIN(5, 0)
* d" ^% S( _7 T9 ? ]4 Y# C# i- Z) j% |
: X% R* o( T# ]7 d+ A$ `/ J, U, }: q5 ~! R8 m
static void ad7606_irq_setup(ad7606 *ad) {
. U& P o7 d# n! L% S# t: _/ z Hwi_Params hwiParams;1 ^) }5 b" b9 Q, A1 s' H
Hwi_Handle myHwi;# d" q7 W) A7 K
Error_Block eb;; n) E7 p; F( {" K* s
/ k/ D6 x0 j" Q6 [( b3 k, H Error_init(&eb);" x3 T& \ f, ?$ i. A
Hwi_Params_init(&hwiParams);
; w- R# D6 @/ c1 { hwiParams.arg = (unsigned int)ad;
1 R9 n9 p J: O9 s; u# a4 \) Y( b9 i hwiParams.enableInt = FALSE;
% Q6 C2 f. G' L# X. b hwiParams.eventId = SYS_INT_GPIO_B5INT;3 P9 l" O8 T- X; h/ z3 M0 L9 [
hwiParams.priority = 4;
* J Y9 c0 m' d0 o myHwi = Hwi_create(8, ad7606_busy_hwi, &hwiParams, &eb); //注册BANK5中断处理函数
?+ w3 \, w) [1 c2 m& \ if (myHwi == NULL) ( @' v8 b0 e" U, z
LOG_FATAL("failed to create hwi");* a/ R Z# _# {6 q0 W" b6 r5 n
1 `. h& I9 R3 E# V+ d% G /* enable both interrupts */8 z. ~3 Q# r! X, ?
Hwi_enableInterrupt(ad->irq_event);7 c( c. X+ p: Y1 m
}, V( B! E* G# x4 `8 C# W7 ^7 C8 C* g1 u
5 l! M0 D: {" W0 }* I1 k, L
0 b5 {9 Z7 I1 Ystatic void ad7606_gpio_pinmux_setup(ad7606 *ad) {4 Q+ ~, q* t Q9 _# z9 O$ ^
volatile unsigned int savePinMux = 0;! Q$ Z. d% k' p9 a
//初始化5.11、5.9 、 5.5为GPIO口
8 y+ d* \+ l2 ` savePinMux = HWREG(SOC_SYSCFG_0_REGS + SYSCFG0_PINMUX(11)) & (~(SYSCFG_PINMUX11_PINMUX11_27_24 | SYSCFG_PINMUX11_PINMUX11_19_16));
5 R3 u/ V) d. P0 u9 ~# ^% [2 Y2 r7 T
/ s* B# X3 Z0 z9 I# T HWREG(SOC_SYSCFG_0_REGS + SYSCFG0_PINMUX(11)) = (PINMUX11_BUSY_V1_ENABLE | PINMUX11_BUSY_V2_ENABLE | savePinMux);
+ u' |& y2 J v# J+ w& [: X& }6 J' ?( ?, G. i
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));
7 E3 F6 K I" r2 d) e5 I
! a, }+ M& H; r/ K2 x. r) c* z HWREG(SOC_SYSCFG_0_REGS + SYSCFG0_PINMUX(12)) = (PINMUX12_RESET_ENABLE | PINMUX12_CONVST_ENABLE | PINMUX12_RD_ENABLE | PINMUX12_BUSY_C_ENABLE | savePinMux);
$ L1 _# ]6 \+ Y' L: Q- Y" r7 D1 G
}
5 H# S6 k- a* a7 { p
4 v5 e7 Z E0 D/ ^* Q. Z$ g4 x8 N: a- `8 `6 O- c7 l4 Q) E
static void ad7606_gpio_setup(ad7606 *ad) {8 @3 X3 e& w8 O% `6 |! H
/*Set the AD7606_PAR_BUSY to the input mode*/
' v5 H. S x9 y //初始化5.11、5.9 、 5.5为中断口
( v. g2 O: V1 \& q# c( |! Z. O GPIODirModeSet(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_V1, GPIO_DIR_INPUT);! ]9 ]. V$ Z; E
GPIODirModeSet(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_V2, GPIO_DIR_INPUT);
' o- N* B; B, |* X GPIODirModeSet(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_C, GPIO_DIR_INPUT);
7 R5 j3 L5 b4 t; ^3 ^1 U% D- ^: ? //GPIODirModeSet(SOC_GPIO_0_REGS, AD7606_PAR_BUSY, GPIO_DIR_INPUT);- s" I4 i7 K5 p' w' {6 _) J
/*Set the AD7606_PAR_BUSY to the Falling Edge Interrupt*/& q6 n) Q* w- B$ R3 `& O0 [
GPIOIntTypeSet(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_V1, GPIO_INT_TYPE_FALLEDGE);2 t0 l* ]% _8 Z8 V: e. _
GPIOIntTypeSet(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_V2, GPIO_INT_TYPE_FALLEDGE);
( }* e3 D- w& X$ T* l GPIOIntTypeSet(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_C, GPIO_INT_TYPE_FALLEDGE);+ W/ {# F, A$ v" ]/ w% b& L
//GPIOIntTypeSet(SOC_GPIO_0_REGS, AD7606_PAR_BUSY, GPIO_INT_TYPE_FALLEDGE);
7 b/ w. Y$ K/ C, O$ T- w /*The interrupt setting allows AD7606_PAR_BUSY_GPIO_BANK*/
; o) m# Z9 ]1 T GPIOBankIntEnable(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_GPIO_BANK);& D, Y9 J( B$ b+ h( N1 J, S; ^5 [3 z
0 O2 {( @" [( F
GPIODirModeSet(SOC_GPIO_0_REGS, AD7606_PAR_RESET, GPIO_DIR_OUTPUT);- Z6 K7 { n6 F q5 a0 y. J
GPIOPinWrite(SOC_GPIO_0_REGS, AD7606_PAR_RESET, GPIO_PIN_HIGH);
, j( T# R3 T/ T/ U. r+ j) `* U: A Task_sleep(1000);! y6 u3 @. I- x% p% `
GPIOPinWrite(SOC_GPIO_0_REGS, AD7606_PAR_RESET, GPIO_PIN_LOW);& ?: A$ p8 ^$ G, f. H
Task_sleep(1000);7 Y7 g8 n+ f- K# C. ^: n
- ~2 c5 u. n) s0 ?9 _* L3 H! I /*Set the AD7606_PAR_CONVST to output mode*/
, K/ ~# I6 Q" ?2 a' I7 f GPIODirModeSet(SOC_GPIO_0_REGS, AD7606_PAR_CONVST, GPIO_DIR_OUTPUT);
4 U- b" Z9 k0 K# [) b9 c GPIOPinWrite(SOC_GPIO_0_REGS, AD7606_PAR_CONVST, GPIO_PIN_LOW);
: `% N* j+ D' y8 W" k: v" [
) p, U I! m6 x GPIODirModeSet(SOC_GPIO_0_REGS, AD7606_PAR_RD, GPIO_DIR_OUTPUT);
3 z5 z- `1 \( c2 @* n GPIOPinWrite(SOC_GPIO_0_REGS, AD7606_PAR_RD, GPIO_PIN_HIGH);
) L$ G# u) a. }
% B$ I0 A" U# H' [7 y}3 X/ d( b8 k- [5 v" W7 ?4 {
3 t% n$ q0 J1 D+ ^& |! o m5 [
9 Q4 G& j. ?& N5 q
static void ad7606_busy_hwi(UArg ad_addr) {: v1 N" Z W: i/ I. T
7 y, k/ {7 t- J* x8 A$ `7 |/ e
7 [9 b/ O! r/ T /* Disable the interrupts for pins of bank AD7606_PAR_BUSY in GPIO.*/5 z1 o6 C) C1 [0 H( ]# L# S
GPIOBankIntDisable(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_GPIO_BANK); //用仿真器debug,发现程序能进入这里。8 Y4 j1 v* Z7 E; l) \: y; D
3 M& |. z. q% I) I if(GPIOPinIntStatus(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_V1) == GPIO_INT_PEND)% t% z& D& c# T" w' W2 A: ^
{1 G* y i M- g! g% }
GPIOPinIntClear(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_V1); //问题是:用仿真器debug,发现程序不能进入这里。
7 p/ j# E' ^4 L0 j cs_addr = SOC_EMIFA_CS5_ADDR ;' c2 l5 E( P0 b1 s- d4 S7 G
internal = 0 ;
; z2 N4 h& Y, k# { int_flag[0] = 1 ;7 @$ v1 I) f3 h
}% r7 v( d6 q; j6 X( W
if(GPIOPinIntStatus(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_V2) == GPIO_INT_PEND)
" Z2 [0 R$ `8 ~' y- J% K {
7 `* I! E# y% C: Z7 e' U GPIOPinIntClear(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_V2); //问题是:用仿真器debug,发现程序不能进入这里。' E9 V- I7 k* ^3 x, z
cs_addr = SOC_EMIFA_CS4_ADDR ;/ o. D6 n# X. f
internal = 6 ;
7 j4 i8 m9 u6 C% H' S int_flag[1] = 1 ;
* D# x }$ q* A* a }
! G8 t, E* w3 ~ \ if(GPIOPinIntStatus(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_C) == GPIO_INT_PEND)9 w3 \ f. H- K+ X3 b. n9 X5 p; j
{; q1 M2 j7 `4 b' h2 V
GPIOPinIntClear(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_C); //问题是:用仿真器debug,发现程序不能进入这里。
, X4 @' R4 f$ a' x, T( M cs_addr = SOC_EMIFA_CS2_ADDR ;
6 a5 J @, r1 I4 r Q1 A internal = 12 ;
/ j1 p, N' X2 O int_flag[2] = 1 ;
$ z! ?9 |" R6 Y }" _- ~2 A7 y1 a( ~+ _: n6 Q
" v- |1 Q) \- B7 ~# ~2 [
GPIOPinWrite(SOC_GPIO_0_REGS, AD7606_PAR_CONVST, GPIO_PIN_LOW);
: x$ D# k4 d! @
1 G, E- E! v: {9 P$ e1 [ GPIOBankIntEnable(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_GPIO_BANK);
6 _, w* M$ q ?7 L; w p4 A* Q}
! K7 E1 q. o- G, m. Y& s( W: U" Y9 k* M6 {5 U" @
|
|