|
|
您好。使用GPIO中断时,中断能进入ISR,但是不能区分具体的GPIO端口。程序如下:5 y6 g. `0 [- Q! [0 C( v; t
#define AD7606_PAR_BUSY_GPIO_BANK 5$ Q: Z/ K. S2 M" y
#define AD7606_PAR_BUSY_GPIO_BANK_INT SYS_INT_GPIO_B5INT
1 ^( p0 F2 ~; Q6 o5 ^
; ^ A n" `) l# i#define AD7606_PAR_BUSY_V1 GPIO_TO_PIN(5, 11) //BANK5的中断口5.111 f8 ^2 R0 h7 o) O+ L3 d
#define AD7606_PAR_BUSY_V2 GPIO_TO_PIN(5, 9) //BANK5的中断口5.9) X' M2 }1 ^$ D2 G" D" P9 E
#define AD7606_PAR_BUSY_C GPIO_TO_PIN(5, 5) //BANK5的中断口5.5% D5 a. |5 h4 c8 Q% J
#define AD7606_PAR_BUSY GPIO_TO_PIN(5, 4)
* L, ~ ]$ n1 | F
- V& {- H6 ]2 I8 k: b. L$ V#define AD7606_PAR_CONVST GPIO_TO_PIN(5, 1)
" b1 n- K9 j. [6 ?#define AD7606_PAR_RD GPIO_TO_PIN(5, 2)2 U5 y3 |% W6 G, ?
#define AD7606_PAR_RESET GPIO_TO_PIN(5, 0)% c: V, d$ t2 r% T" s
- Q0 O! T- \" x* ?
+ o. l) B5 b9 V7 ~7 ^
; Q$ N* E4 K: P( W0 g. A O4 Wstatic void ad7606_irq_setup(ad7606 *ad) {6 ~2 D) e. j$ Y e7 e+ F
Hwi_Params hwiParams;
?; x3 Z8 h$ p7 u ^ Hwi_Handle myHwi;
2 r o1 ~9 B2 S( f+ ~: V! p Error_Block eb;4 D# F, e7 @9 d9 E3 H
! u1 v2 j9 N0 U- f' I7 J' H
Error_init(&eb);) [# S- a" q& B* ^8 i
Hwi_Params_init(&hwiParams);0 Q$ l0 D/ [$ D4 t" B; [
hwiParams.arg = (unsigned int)ad;
3 f5 [( E% ^' J$ _4 y hwiParams.enableInt = FALSE;8 N; s0 R+ Y2 N+ b+ {6 W
hwiParams.eventId = SYS_INT_GPIO_B5INT;: y& d- J) H$ c2 G1 E1 i- F& o0 T3 x
hwiParams.priority = 4;
" X8 ^$ R9 O' ?! T+ X myHwi = Hwi_create(8, ad7606_busy_hwi, &hwiParams, &eb); //注册BANK5中断处理函数
4 q3 F, M! ^, y' O3 \8 [$ i V; Y6 S if (myHwi == NULL) % M! d( r- O2 s% B
LOG_FATAL("failed to create hwi");* i. m1 w- ^$ l4 e. P) d
; f! b9 o9 ^( u: [' N7 a" K( s /* enable both interrupts */, ?6 W+ P! U0 R0 l. ~
Hwi_enableInterrupt(ad->irq_event);
) E4 A! ]5 Q* B/ D# X}9 l5 ?5 T5 L& ~$ o2 |
+ r3 O# p3 b2 f0 K8 L0 V
7 l. M- T+ M4 g/ i) D Ystatic void ad7606_gpio_pinmux_setup(ad7606 *ad) {
% u# J' x& `! t L# u& R volatile unsigned int savePinMux = 0;5 G0 p% q6 E' S8 ]- N3 O
//初始化5.11、5.9 、 5.5为GPIO口2 E7 F) w, g, l" ]
savePinMux = HWREG(SOC_SYSCFG_0_REGS + SYSCFG0_PINMUX(11)) & (~(SYSCFG_PINMUX11_PINMUX11_27_24 | SYSCFG_PINMUX11_PINMUX11_19_16));6 B' [" t0 \) ]! C: [* S1 D7 H5 X e/ G
) G- Z6 X% Z% W$ h
HWREG(SOC_SYSCFG_0_REGS + SYSCFG0_PINMUX(11)) = (PINMUX11_BUSY_V1_ENABLE | PINMUX11_BUSY_V2_ENABLE | savePinMux);
* A' w* Y& e+ P5 s7 z6 _9 |3 q S K" ~- K1 X% w4 g* U% K' S: R
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 Y: q) B, w; f# w& B, d! b8 {' C+ ~! u; i" v
HWREG(SOC_SYSCFG_0_REGS + SYSCFG0_PINMUX(12)) = (PINMUX12_RESET_ENABLE | PINMUX12_CONVST_ENABLE | PINMUX12_RD_ENABLE | PINMUX12_BUSY_C_ENABLE | savePinMux);
1 S- J! Z0 R; s _% Y0 h
2 S! y" I/ N" N$ m' q3 a1 @3 u4 H}; o; h# C$ K4 a0 X
; p9 l( l1 t. Y4 K$ l$ {8 X$ f3 o, k
& ~7 P/ a) B4 t2 j5 B O# ]
static void ad7606_gpio_setup(ad7606 *ad) {5 s2 u1 w+ `7 e+ L
/*Set the AD7606_PAR_BUSY to the input mode*/, s, u! S( d$ o; j) c/ E% ~6 z' z* o
//初始化5.11、5.9 、 5.5为中断口: j. t5 O) |4 y- _& b, A
GPIODirModeSet(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_V1, GPIO_DIR_INPUT);2 W) P8 k0 o& [- s! v
GPIODirModeSet(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_V2, GPIO_DIR_INPUT);
* L5 V6 M$ p+ w( c4 s GPIODirModeSet(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_C, GPIO_DIR_INPUT);
. c! J" F3 ]8 G# P+ s //GPIODirModeSet(SOC_GPIO_0_REGS, AD7606_PAR_BUSY, GPIO_DIR_INPUT);
5 O3 J+ y. D0 f7 B /*Set the AD7606_PAR_BUSY to the Falling Edge Interrupt*/8 R# P) N% B6 t/ G6 j/ z
GPIOIntTypeSet(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_V1, GPIO_INT_TYPE_FALLEDGE);
0 d- o0 `0 y! z: i$ w7 Q5 S# l$ J GPIOIntTypeSet(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_V2, GPIO_INT_TYPE_FALLEDGE);0 p+ e; m7 t5 x5 E: A
GPIOIntTypeSet(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_C, GPIO_INT_TYPE_FALLEDGE);
; F) W t- O0 | //GPIOIntTypeSet(SOC_GPIO_0_REGS, AD7606_PAR_BUSY, GPIO_INT_TYPE_FALLEDGE);
; @: f: |; s4 i! L8 e) c& L( } /*The interrupt setting allows AD7606_PAR_BUSY_GPIO_BANK*/* e) W" r* S2 X# r
GPIOBankIntEnable(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_GPIO_BANK);
! c4 y2 N0 v0 }' V8 [6 @7 ?- [: M7 X: [7 W! E1 @* `$ r7 _
GPIODirModeSet(SOC_GPIO_0_REGS, AD7606_PAR_RESET, GPIO_DIR_OUTPUT);( S3 h: p" {1 f1 V! \
GPIOPinWrite(SOC_GPIO_0_REGS, AD7606_PAR_RESET, GPIO_PIN_HIGH); M' h; q4 o9 H5 f5 u& V
Task_sleep(1000);
% N" X/ e% X3 K1 x, c+ ^ GPIOPinWrite(SOC_GPIO_0_REGS, AD7606_PAR_RESET, GPIO_PIN_LOW);/ I! l! q7 ?/ Q5 X8 K6 O
Task_sleep(1000);
s3 g9 W4 E) q# N: Q# ]1 H4 ]$ ]9 V' F% \
/*Set the AD7606_PAR_CONVST to output mode*/
4 J5 _' ^" ?' n GPIODirModeSet(SOC_GPIO_0_REGS, AD7606_PAR_CONVST, GPIO_DIR_OUTPUT);
( _: U i8 y2 H% ]0 R( t GPIOPinWrite(SOC_GPIO_0_REGS, AD7606_PAR_CONVST, GPIO_PIN_LOW);8 D3 k8 _& R# f" U
3 W* _$ k7 L" F! U5 S GPIODirModeSet(SOC_GPIO_0_REGS, AD7606_PAR_RD, GPIO_DIR_OUTPUT);
; Q& p4 s/ _$ W GPIOPinWrite(SOC_GPIO_0_REGS, AD7606_PAR_RD, GPIO_PIN_HIGH);
9 l! W& O* I$ b6 p: Y7 A
0 p) z0 k4 D. a3 z2 P6 p}9 t- H1 }$ m) }4 Q! G4 d8 B- H% _# W
9 Y4 F2 F4 X7 b9 i4 | n
8 B$ P# L4 e2 B8 e9 Rstatic void ad7606_busy_hwi(UArg ad_addr) {
8 i8 [ g9 S; C
. x+ u; M* v" B+ ]1 P% i6 A
& u: F, P9 S& k: m /* Disable the interrupts for pins of bank AD7606_PAR_BUSY in GPIO.*/
7 }1 w7 h0 M4 V9 R9 O GPIOBankIntDisable(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_GPIO_BANK); //用仿真器debug,发现程序能进入这里。, l! A+ H# d* W6 V2 b' ?$ X
W8 K- T, ~ \4 Q) p- e
if(GPIOPinIntStatus(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_V1) == GPIO_INT_PEND)- @8 f; W5 ]2 T, q2 h \/ o4 U
{0 X6 G, ~/ E& L. f" i
GPIOPinIntClear(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_V1); //问题是:用仿真器debug,发现程序不能进入这里。/ k9 B) [6 h7 j) b2 e5 v
cs_addr = SOC_EMIFA_CS5_ADDR ;
; u! Y) J5 W2 H3 F internal = 0 ;3 E. a* N; D% _& E0 ~
int_flag[0] = 1 ;6 o" o% Q' ]% H3 a
}0 O- ~; f* {% L' v" R' L
if(GPIOPinIntStatus(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_V2) == GPIO_INT_PEND); w4 V K3 |. E1 T" M
{
8 C( \( i% v% w( \, M GPIOPinIntClear(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_V2); //问题是:用仿真器debug,发现程序不能进入这里。
+ g D6 a7 @3 _$ j9 H4 Z. j, ]6 w cs_addr = SOC_EMIFA_CS4_ADDR ;2 m4 k( W, |+ D2 d! e! T
internal = 6 ;
0 X9 D* L6 Y3 T" x7 w! u int_flag[1] = 1 ; D: X/ `1 Z# K7 `! g& m! k# M
}: }' z; g) W5 o
if(GPIOPinIntStatus(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_C) == GPIO_INT_PEND)
" u! ?: N/ F1 |2 G {
% _- p" E1 z7 ^& e) B* M9 e GPIOPinIntClear(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_C); //问题是:用仿真器debug,发现程序不能进入这里。
: c' x% i* `7 n, L$ J: \$ j3 T cs_addr = SOC_EMIFA_CS2_ADDR ;$ O7 N" y- c5 A2 b
internal = 12 ;
n2 g- U3 k2 S) y1 q& z9 _/ ? int_flag[2] = 1 ;/ K1 \3 Q: X6 S$ t0 ~6 Z* S( [
}
# w: H F. X; a. V+ U+ | 0 Z7 G+ O+ `' N, j
GPIOPinWrite(SOC_GPIO_0_REGS, AD7606_PAR_CONVST, GPIO_PIN_LOW);
+ a; ~: _) |( b! Z( g( J, } ( }+ I" w* Q7 e: g
GPIOBankIntEnable(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_GPIO_BANK);. M) K2 z& V+ W$ i% ^
}
' f. A* b, B& } v2 V" _3 x* z! _; \( n( m
|
|