|
|
您好。使用GPIO中断时,中断能进入ISR,但是不能区分具体的GPIO端口。程序如下:
6 b% |( F5 Q6 y3 l#define AD7606_PAR_BUSY_GPIO_BANK 5
0 E+ n8 l: G# W% G#define AD7606_PAR_BUSY_GPIO_BANK_INT SYS_INT_GPIO_B5INT
) W% Y, J$ A/ L: g4 X& M+ Q4 _; Y* ~( }/ e4 e5 f L0 |4 L4 Y9 B
#define AD7606_PAR_BUSY_V1 GPIO_TO_PIN(5, 11) //BANK5的中断口5.11+ x4 {5 o$ z9 |0 b9 e& ^( {$ ?
#define AD7606_PAR_BUSY_V2 GPIO_TO_PIN(5, 9) //BANK5的中断口5.9$ {$ E ~. g1 s R& L$ S3 _/ d9 @
#define AD7606_PAR_BUSY_C GPIO_TO_PIN(5, 5) //BANK5的中断口5.5
8 n) e! s1 K# p C; U* v#define AD7606_PAR_BUSY GPIO_TO_PIN(5, 4)
* W" z6 S, ?1 w. N7 f
7 `" j' y; q q# e2 P* R#define AD7606_PAR_CONVST GPIO_TO_PIN(5, 1)
9 p" I; S2 l& p" b+ ]; A# u8 r4 n#define AD7606_PAR_RD GPIO_TO_PIN(5, 2)6 o, D8 [! \; ^( g/ r% u, W
#define AD7606_PAR_RESET GPIO_TO_PIN(5, 0)
( |- Y4 e! F3 P. h+ }
# v$ e; u3 F2 q. i6 X1 R: E# b, B8 A% x+ D
- ~" C! C- p! z/ T- v% h9 }% b5 ]* }% w7 P4 Q q' x
static void ad7606_irq_setup(ad7606 *ad) {8 w% _7 G f7 x5 x" @/ a6 Y4 B& ]) h
Hwi_Params hwiParams;3 P9 U$ I/ f z3 I% G4 E4 v
Hwi_Handle myHwi;
" d( {0 U3 ^9 P' C) Q9 _& A$ } Error_Block eb;
2 @% _# r i6 g9 N/ W; I `- J0 {" ?9 |9 F
Error_init(&eb);: R1 R) y) \9 A3 s
Hwi_Params_init(&hwiParams);5 j7 |# Z* a) ~
hwiParams.arg = (unsigned int)ad;. e* I( Q% o2 [ M9 O. d; n
hwiParams.enableInt = FALSE;8 X7 E, p( F9 r; X+ \) H
hwiParams.eventId = SYS_INT_GPIO_B5INT;
, p5 `% n- a1 W& w, v; C hwiParams.priority = 4;; F1 i( S8 J3 j) R4 n) g6 T% u* K
myHwi = Hwi_create(8, ad7606_busy_hwi, &hwiParams, &eb); //注册BANK5中断处理函数
+ Z: J8 I2 q. T if (myHwi == NULL)
7 }- A$ R! t, H6 X$ ^ LOG_FATAL("failed to create hwi");
' G# U6 |5 U2 ~1 x5 B- S" E1 J( m' {: V4 t R$ m9 o2 {
/* enable both interrupts */- s- c7 ^) u) b; T( e/ t
Hwi_enableInterrupt(ad->irq_event);
& C+ w4 ^3 r$ N4 Z}6 i, m+ [2 B9 F" Q6 O
( T( I' J/ i+ o) m k; C: d- S+ p, k6 A! U
static void ad7606_gpio_pinmux_setup(ad7606 *ad) {
2 C2 S' F3 O, P volatile unsigned int savePinMux = 0;: B0 [, @! a5 v! q4 E
//初始化5.11、5.9 、 5.5为GPIO口% q/ ~6 ~, K, P% ]' G: I
savePinMux = HWREG(SOC_SYSCFG_0_REGS + SYSCFG0_PINMUX(11)) & (~(SYSCFG_PINMUX11_PINMUX11_27_24 | SYSCFG_PINMUX11_PINMUX11_19_16));' v( T* b1 G6 S
* }0 V. ]% Y. p* U0 f+ b, r HWREG(SOC_SYSCFG_0_REGS + SYSCFG0_PINMUX(11)) = (PINMUX11_BUSY_V1_ENABLE | PINMUX11_BUSY_V2_ENABLE | savePinMux);
/ r9 z& J6 G ^5 J3 L, g1 i. a+ k
. V8 o2 Q+ }" Y, 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));
! u7 e9 Q3 W) R# p! [" b7 A( M* r
/ l) E5 S! v8 ^3 Q HWREG(SOC_SYSCFG_0_REGS + SYSCFG0_PINMUX(12)) = (PINMUX12_RESET_ENABLE | PINMUX12_CONVST_ENABLE | PINMUX12_RD_ENABLE | PINMUX12_BUSY_C_ENABLE | savePinMux);$ i" Y5 h% ]* D- F
) J$ p# U: w5 w: }' u( t9 ?* d}
$ d; l/ H; M0 D8 i8 O& i% r# K, j% m& f6 n6 a3 I( S! C |" c0 }4 }
/ _, l& K' d' g ^
static void ad7606_gpio_setup(ad7606 *ad) {
% j [ i4 F3 _. l2 E3 g /*Set the AD7606_PAR_BUSY to the input mode*/8 p: C P$ ]4 |) J# E; m! T$ F- N
//初始化5.11、5.9 、 5.5为中断口
_' V( j" W% E* p: w1 z8 n; m GPIODirModeSet(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_V1, GPIO_DIR_INPUT);' T# Y4 r/ a8 j* ^
GPIODirModeSet(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_V2, GPIO_DIR_INPUT);% `6 O2 b5 J9 b' l P! q; b
GPIODirModeSet(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_C, GPIO_DIR_INPUT);' [+ H. c+ j. @( @! c0 ?& Z
//GPIODirModeSet(SOC_GPIO_0_REGS, AD7606_PAR_BUSY, GPIO_DIR_INPUT);1 `9 j* s7 {: f g, d; z
/*Set the AD7606_PAR_BUSY to the Falling Edge Interrupt*/
2 b/ i! I9 [" p4 Q" Y, V% X GPIOIntTypeSet(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_V1, GPIO_INT_TYPE_FALLEDGE);
+ c) Q5 B F/ C2 t) f/ m GPIOIntTypeSet(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_V2, GPIO_INT_TYPE_FALLEDGE);+ D9 U5 L* ?" ?9 t# v
GPIOIntTypeSet(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_C, GPIO_INT_TYPE_FALLEDGE);$ ~8 H! b% d* ]
//GPIOIntTypeSet(SOC_GPIO_0_REGS, AD7606_PAR_BUSY, GPIO_INT_TYPE_FALLEDGE);
; D3 D- ]8 y$ u( I /*The interrupt setting allows AD7606_PAR_BUSY_GPIO_BANK*/; W3 R2 O) y0 G4 v3 H
GPIOBankIntEnable(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_GPIO_BANK);
& U- ?$ N+ {" n' {# d0 U! V' _; m- i( i
GPIODirModeSet(SOC_GPIO_0_REGS, AD7606_PAR_RESET, GPIO_DIR_OUTPUT);! z) ^5 }/ j8 M8 _, `2 W
GPIOPinWrite(SOC_GPIO_0_REGS, AD7606_PAR_RESET, GPIO_PIN_HIGH);
' Q+ v6 c* Z) X% U6 g1 x8 r Task_sleep(1000);
- b- E" Y4 b# y0 r& X) V0 k GPIOPinWrite(SOC_GPIO_0_REGS, AD7606_PAR_RESET, GPIO_PIN_LOW);
8 c1 Y1 @" a' L Task_sleep(1000);
( G" P! D( S5 t4 n/ }, b" |; X T0 g p: Y& v- Q+ F6 g3 F
/*Set the AD7606_PAR_CONVST to output mode*/
/ A' o& u# C1 {9 A; n7 P GPIODirModeSet(SOC_GPIO_0_REGS, AD7606_PAR_CONVST, GPIO_DIR_OUTPUT);
/ A' W* j. v8 ?+ l/ H GPIOPinWrite(SOC_GPIO_0_REGS, AD7606_PAR_CONVST, GPIO_PIN_LOW);" [1 N% e6 e( @* N
! c3 Y% v( F/ K) I- l7 j GPIODirModeSet(SOC_GPIO_0_REGS, AD7606_PAR_RD, GPIO_DIR_OUTPUT);
6 r$ U+ g/ ]5 J" G8 w GPIOPinWrite(SOC_GPIO_0_REGS, AD7606_PAR_RD, GPIO_PIN_HIGH);9 y! U( E9 Y- V
; @; K0 v% V( ~* y9 D& m' K5 O}
H5 m1 R. i, ~! m; P4 R' }8 ^ b) [
6 P+ d6 K j) X; N3 ^
static void ad7606_busy_hwi(UArg ad_addr) {7 T [# j A/ _, _& e( i9 R
" u" s/ P6 G0 j2 F" P4 l
! c9 \9 K- R2 b/ d& ]" }8 f% E /* Disable the interrupts for pins of bank AD7606_PAR_BUSY in GPIO.*/
: l" S5 i' x' }# P2 L GPIOBankIntDisable(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_GPIO_BANK); //用仿真器debug,发现程序能进入这里。
- o8 I/ _- ^7 t3 F" ?' r! J' P( \, c4 u& O+ d! v& P9 m
if(GPIOPinIntStatus(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_V1) == GPIO_INT_PEND)
v& H ?' ?, _ {) p( e& J& V- N, s- ^. Y0 H
GPIOPinIntClear(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_V1); //问题是:用仿真器debug,发现程序不能进入这里。1 x% f$ ] j+ w8 C" {! u
cs_addr = SOC_EMIFA_CS5_ADDR ;' z/ b$ W% S- p5 p$ ?+ z
internal = 0 ;
5 [0 w7 |6 a( l, {5 i; h: x/ Q/ p int_flag[0] = 1 ;
7 a$ @. a& t% f }
! F2 }% b. ] X+ j: } if(GPIOPinIntStatus(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_V2) == GPIO_INT_PEND)
3 n. E; h A& @* `: X+ Z {
A# e! E! ?- L8 l$ x9 W" G GPIOPinIntClear(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_V2); //问题是:用仿真器debug,发现程序不能进入这里。1 D8 q5 L+ X7 w( _4 R1 Y; Y8 w
cs_addr = SOC_EMIFA_CS4_ADDR ;
- Q! _( u! @: X. d internal = 6 ;- v8 h2 }7 f& K4 A! X4 V
int_flag[1] = 1 ;1 s: X; ^; ?& [( C+ t2 F0 @
}2 f, G/ ~% G. v0 _2 {: N& e
if(GPIOPinIntStatus(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_C) == GPIO_INT_PEND)
3 U' \* k; ?1 Y; @ {
/ y5 x( [- f) U4 ^0 } GPIOPinIntClear(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_C); //问题是:用仿真器debug,发现程序不能进入这里。
1 d) C- H" @7 P" Y- o cs_addr = SOC_EMIFA_CS2_ADDR ;
. j8 c! o2 v, P/ g) {0 \! J internal = 12 ;
& i3 C5 Z& D! J4 v+ ?( ? int_flag[2] = 1 ;
& H _* G( l1 n4 S, K& T3 K } I5 E% O& { p4 s, A. x
4 R0 q( _; \7 c GPIOPinWrite(SOC_GPIO_0_REGS, AD7606_PAR_CONVST, GPIO_PIN_LOW);
5 B a/ O. L0 F) l% J : S; o& X$ |3 e) N' U8 Y6 Q
GPIOBankIntEnable(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_GPIO_BANK); g+ n' `" n2 q6 M5 [; H Y4 b
}3 E2 P j6 V1 A+ D X5 n
# V; _; F, n- L7 [- ?4 D" q3 Z8 S' t
* W1 a x7 O" D2 i) [ T
8 Q4 y6 ^ X* e! s P |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
|