|
|
您好。使用GPIO中断时,中断能进入ISR,但是不能区分具体的GPIO端口。程序如下:) y7 f+ ~" D2 Z" i
#define AD7606_PAR_BUSY_GPIO_BANK 5
& _" P2 O9 b: M8 S. x#define AD7606_PAR_BUSY_GPIO_BANK_INT SYS_INT_GPIO_B5INT
, l5 e% A, H7 s0 m$ |
; b. Y( e+ g) z9 ], |7 U6 F#define AD7606_PAR_BUSY_V1 GPIO_TO_PIN(5, 11) //BANK5的中断口5.111 a4 y: V; p/ y
#define AD7606_PAR_BUSY_V2 GPIO_TO_PIN(5, 9) //BANK5的中断口5.9
/ J: ?% d$ U- w( R3 E, I#define AD7606_PAR_BUSY_C GPIO_TO_PIN(5, 5) //BANK5的中断口5.5
Z+ `1 T5 A- b+ S; }6 C1 N#define AD7606_PAR_BUSY GPIO_TO_PIN(5, 4)5 M- Y8 h" w8 l# ^
% R" s% J9 a# ` m3 b#define AD7606_PAR_CONVST GPIO_TO_PIN(5, 1)2 }7 S9 H. z7 O$ |: A8 V& `- o
#define AD7606_PAR_RD GPIO_TO_PIN(5, 2)
3 p3 N: B- v/ O+ q7 V8 g7 N#define AD7606_PAR_RESET GPIO_TO_PIN(5, 0)' P0 H3 F/ d# t) G0 w
# r: E `8 t5 }) U4 w" t" U7 R$ J) C
& p0 b; |# n9 X
static void ad7606_irq_setup(ad7606 *ad) {
; I% X ], L; K, l. t; T Hwi_Params hwiParams;
8 T7 ^, H1 n4 q0 p Hwi_Handle myHwi;
' @9 W$ q* Q% ~' y2 A+ C$ W8 ~ Error_Block eb;+ V* J' X" p; M) Z+ q2 z, B5 f
" H4 S; b0 C- g5 P
Error_init(&eb);$ Y# e5 d4 j- U
Hwi_Params_init(&hwiParams);
- j/ l9 T" S2 J1 E) T+ c hwiParams.arg = (unsigned int)ad;6 ~# E F, G* T6 M( @! s+ d* Q0 F
hwiParams.enableInt = FALSE;9 T+ K8 g* ?8 t" L7 @% O9 V3 E
hwiParams.eventId = SYS_INT_GPIO_B5INT;2 K. y# p; F8 K8 Z0 n8 ]
hwiParams.priority = 4;
1 z, {- g1 }! J z3 h" G2 q myHwi = Hwi_create(8, ad7606_busy_hwi, &hwiParams, &eb); //注册BANK5中断处理函数
3 w( J$ I% t& k) y6 W$ u if (myHwi == NULL) ; ~3 i' q0 ~1 p; Q1 X1 k/ O
LOG_FATAL("failed to create hwi");% G m/ X9 ] k. c: v
/ l! ~6 D3 Y, h% a* S( R& B
/* enable both interrupts */( `; R% m9 }$ J6 z: ]0 ~+ L% j
Hwi_enableInterrupt(ad->irq_event);8 ]) M1 s! ]* X- [% [
}
& C1 ~$ y0 z K8 B9 P4 B. I# Q
* B- ?- G) B$ [4 D8 g
+ b: o, O; L- a0 f- q6 E; astatic void ad7606_gpio_pinmux_setup(ad7606 *ad) {
: T# Q, a; ~- }/ C5 P5 T4 I/ [3 A volatile unsigned int savePinMux = 0;
( W2 [' E9 p; x* f //初始化5.11、5.9 、 5.5为GPIO口
+ p& S6 f* D! V4 [7 ^ savePinMux = HWREG(SOC_SYSCFG_0_REGS + SYSCFG0_PINMUX(11)) & (~(SYSCFG_PINMUX11_PINMUX11_27_24 | SYSCFG_PINMUX11_PINMUX11_19_16));3 |( f# D R! I5 X8 O! @
/ b( g) U! z q( K
HWREG(SOC_SYSCFG_0_REGS + SYSCFG0_PINMUX(11)) = (PINMUX11_BUSY_V1_ENABLE | PINMUX11_BUSY_V2_ENABLE | savePinMux);
5 _. E' _4 U) O& b; @7 `7 _9 {; V2 v# Y: A
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));
# H' L- P5 `+ c: Q# F8 J$ L. n( L5 C: i# f2 {6 m
HWREG(SOC_SYSCFG_0_REGS + SYSCFG0_PINMUX(12)) = (PINMUX12_RESET_ENABLE | PINMUX12_CONVST_ENABLE | PINMUX12_RD_ENABLE | PINMUX12_BUSY_C_ENABLE | savePinMux);
* `: y+ l; \0 F* X. Y* m: T, h3 W( t( @7 H# a$ R
}( _9 U6 o d) ~
* ^* a# T" x$ q2 ^7 o& {4 A- z; ?1 M$ B8 A4 x" B' [' L
static void ad7606_gpio_setup(ad7606 *ad) {
6 \% q; l; ?7 e* }9 P$ { E /*Set the AD7606_PAR_BUSY to the input mode*/' M, {% I/ C# P$ c8 d, [
//初始化5.11、5.9 、 5.5为中断口2 P' H% v) Z+ z8 l/ G
GPIODirModeSet(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_V1, GPIO_DIR_INPUT);
( [. Q# Z: c1 K; Y) a GPIODirModeSet(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_V2, GPIO_DIR_INPUT);! x' P/ Z9 Q8 N5 }7 P' x
GPIODirModeSet(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_C, GPIO_DIR_INPUT);
W+ Z! E$ ?1 |$ E& ~' S3 M- C //GPIODirModeSet(SOC_GPIO_0_REGS, AD7606_PAR_BUSY, GPIO_DIR_INPUT); }: N$ r R0 I+ r
/*Set the AD7606_PAR_BUSY to the Falling Edge Interrupt*/1 S' r. ?9 g4 \# x4 ~! E/ k" e( C$ o
GPIOIntTypeSet(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_V1, GPIO_INT_TYPE_FALLEDGE);
! P3 g0 O# E1 B% o7 n. C GPIOIntTypeSet(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_V2, GPIO_INT_TYPE_FALLEDGE);' J/ ]8 ~+ l! s) W
GPIOIntTypeSet(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_C, GPIO_INT_TYPE_FALLEDGE);
$ I! H/ ~) p5 g0 a8 c; k$ K //GPIOIntTypeSet(SOC_GPIO_0_REGS, AD7606_PAR_BUSY, GPIO_INT_TYPE_FALLEDGE);- p' h3 o/ F' G# s( j8 ^# p) I d
/*The interrupt setting allows AD7606_PAR_BUSY_GPIO_BANK*/. F# n: e) t( L1 q1 t1 m0 `" b
GPIOBankIntEnable(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_GPIO_BANK);
4 L* Y0 t9 W& r4 l7 ^& j5 E1 I9 h3 w7 d3 [( X; a8 l1 _
GPIODirModeSet(SOC_GPIO_0_REGS, AD7606_PAR_RESET, GPIO_DIR_OUTPUT);. h+ }; P, ~4 Y5 B
GPIOPinWrite(SOC_GPIO_0_REGS, AD7606_PAR_RESET, GPIO_PIN_HIGH);
5 _/ K( X2 f! f+ y K( k, Y/ Q Task_sleep(1000);
5 J; p6 w1 A6 E# Q& D- A GPIOPinWrite(SOC_GPIO_0_REGS, AD7606_PAR_RESET, GPIO_PIN_LOW);4 i' F- ?8 F l
Task_sleep(1000);
\3 X# S0 _5 e, I
; e3 |( K4 M; ~; e+ G8 a /*Set the AD7606_PAR_CONVST to output mode*/
" ?# o! J; i \ GPIODirModeSet(SOC_GPIO_0_REGS, AD7606_PAR_CONVST, GPIO_DIR_OUTPUT);
) C! K0 H/ H, W' X GPIOPinWrite(SOC_GPIO_0_REGS, AD7606_PAR_CONVST, GPIO_PIN_LOW);( C0 t" X9 |$ `5 F
, K$ `* F% h# C* n4 W2 `" Y GPIODirModeSet(SOC_GPIO_0_REGS, AD7606_PAR_RD, GPIO_DIR_OUTPUT);
9 T+ e* O, P& Y GPIOPinWrite(SOC_GPIO_0_REGS, AD7606_PAR_RD, GPIO_PIN_HIGH);. \ m c: U5 V$ _/ [7 H; Y
' J, i' K: [* `' F0 k, e2 J}
* t3 p9 R c- S4 D0 j! K0 _2 m$ C+ ]! Q1 m; T$ Q W: _
- y% a2 N2 v$ Q& cstatic void ad7606_busy_hwi(UArg ad_addr) {
3 f0 Y! w5 h4 [2 c( u- U; ^0 K- t( k. o: G1 J
4 r) t0 B0 @2 G) |; ?' a
/* Disable the interrupts for pins of bank AD7606_PAR_BUSY in GPIO.*/, u2 f6 A5 ?- r% O' |
GPIOBankIntDisable(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_GPIO_BANK); //用仿真器debug,发现程序能进入这里。
1 [+ `9 b' [9 {# w
& Z% \# a1 U+ ?& @/ K; S if(GPIOPinIntStatus(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_V1) == GPIO_INT_PEND)
; ^' ^5 o8 U7 M3 q. Z! o {9 Z- v4 x2 P, n: `" L
GPIOPinIntClear(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_V1); //问题是:用仿真器debug,发现程序不能进入这里。2 U9 n* d$ o4 A
cs_addr = SOC_EMIFA_CS5_ADDR ;
D, S# K8 _8 k4 k3 |5 f9 b% [ internal = 0 ;' S, `/ o9 y- r( r$ f1 w! q, e3 z
int_flag[0] = 1 ;* n* w& B% ^. b. S4 F7 q
}; L8 G; r- Z& {" ]5 e1 b
if(GPIOPinIntStatus(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_V2) == GPIO_INT_PEND)
0 H. f4 e/ \) V- O7 ? {, M9 E- ?. U6 D$ y6 l
GPIOPinIntClear(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_V2); //问题是:用仿真器debug,发现程序不能进入这里。% M4 X9 ]( V/ p& A5 _1 y- P
cs_addr = SOC_EMIFA_CS4_ADDR ;- n7 X" l( S( o$ N$ `) m2 `' o
internal = 6 ;
% H0 o$ m" F+ {5 B' g4 A- ~ int_flag[1] = 1 ;
# B! e0 z8 L& {( X, D }2 B( |. K+ A; K
if(GPIOPinIntStatus(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_C) == GPIO_INT_PEND)& k+ ], n0 P& N# U0 D
{- P4 U4 E4 h. c; @9 k
GPIOPinIntClear(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_C); //问题是:用仿真器debug,发现程序不能进入这里。
$ Y* g9 P) Y4 ]9 \9 P7 | cs_addr = SOC_EMIFA_CS2_ADDR ;( e) P' O! V2 k( ], S/ k
internal = 12 ;, F; g* }7 L) D8 m- Z+ @1 ]; M
int_flag[2] = 1 ;
, h- v& o* i* b5 ]: G }
5 `) ^; ]# g" _- v# i% }" _ ; B* V( V! |, L- d" g6 w, t5 Y4 E
GPIOPinWrite(SOC_GPIO_0_REGS, AD7606_PAR_CONVST, GPIO_PIN_LOW);
! f1 ?+ Z7 y# e
+ W( ~+ a" ]6 p" d GPIOBankIntEnable(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_GPIO_BANK);
1 n# @+ K& ^0 @: ^% f" H8 p0 F}$ N6 ~4 O, m8 d9 W9 m2 m
5 x* Q- q/ i9 a5 L4 @
. O4 m: A: |! F' R: P; _0 M
# v" d. V7 V% Q* Y$ C: o, v8 X: G6 V. R9 b. t/ T
|
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
|