|
|
您好。使用GPIO中断时,中断能进入ISR,但是不能区分具体的GPIO端口。程序如下:
) L- S: \3 i+ z6 {" _- e3 q1 @5 f/ d#define AD7606_PAR_BUSY_GPIO_BANK 52 {' R7 c0 b8 L+ }" b3 w
#define AD7606_PAR_BUSY_GPIO_BANK_INT SYS_INT_GPIO_B5INT
+ W) j" h$ i' ?2 O
M1 v3 Q( i. t7 h: w#define AD7606_PAR_BUSY_V1 GPIO_TO_PIN(5, 11) //BANK5的中断口5.11& `4 M; F* l1 R% e5 @6 P- I
#define AD7606_PAR_BUSY_V2 GPIO_TO_PIN(5, 9) //BANK5的中断口5.9
5 Q$ ?5 s- u0 R# n2 V#define AD7606_PAR_BUSY_C GPIO_TO_PIN(5, 5) //BANK5的中断口5.5* L: m3 a: S) ^ v* |/ [
#define AD7606_PAR_BUSY GPIO_TO_PIN(5, 4). j* Y7 X$ a: m! L5 z
, M( z5 L& S! [4 m8 `
#define AD7606_PAR_CONVST GPIO_TO_PIN(5, 1)
& k: _" ]+ J* F# \. }+ d# n; N/ d#define AD7606_PAR_RD GPIO_TO_PIN(5, 2): n: l, R5 y! B: @+ U. B
#define AD7606_PAR_RESET GPIO_TO_PIN(5, 0)
0 z# A9 Q% @8 n v$ b' v
/ V! x+ z) ~! P1 g4 p2 p7 T1 G
, n D- \& V0 }2 y, t: i
. v1 D+ E2 H! M& D* estatic void ad7606_irq_setup(ad7606 *ad) {
/ u- H2 K1 |! I. e Hwi_Params hwiParams;8 {) V5 P# I& N1 Z
Hwi_Handle myHwi;
, t) L+ A E3 f3 S: v) {) i Error_Block eb;
8 I8 {& `" }6 C# [$ }/ V, P7 e( Y0 \4 Y- f; U" j
Error_init(&eb);1 Z$ c) M; ?- _- U9 p
Hwi_Params_init(&hwiParams);
. |6 h- B2 w# D hwiParams.arg = (unsigned int)ad;8 L! K- @8 n( `* S2 y
hwiParams.enableInt = FALSE;
* o) F" T( ]6 {" z. i8 m hwiParams.eventId = SYS_INT_GPIO_B5INT;, I) E+ g. K# z; }# j8 O1 `0 Y$ i
hwiParams.priority = 4;3 G5 B# @+ W) t" ]+ ~
myHwi = Hwi_create(8, ad7606_busy_hwi, &hwiParams, &eb); //注册BANK5中断处理函数9 b$ o& t0 p* o9 K F! w
if (myHwi == NULL) # |& M& }6 [* |% o3 s1 K- O
LOG_FATAL("failed to create hwi");/ I+ e6 |0 i- F
, z1 G3 R& r6 k3 |: F* Q: Y2 n /* enable both interrupts */
( R* z$ ~1 r2 } @" {# ` Hwi_enableInterrupt(ad->irq_event);
4 M* B1 N' E Y2 P$ ?8 P& e}9 [7 J6 {' A0 T8 {
0 y4 [& y! c( ~/ I. i6 K! ]% Y ^
4 Y8 r4 ~ ]+ Q7 M4 R5 dstatic void ad7606_gpio_pinmux_setup(ad7606 *ad) {
8 q5 s- I/ E( P: W' S6 _* l volatile unsigned int savePinMux = 0;! @* x& x5 l, F: c5 [
//初始化5.11、5.9 、 5.5为GPIO口
& H4 x% M3 u: S& y savePinMux = HWREG(SOC_SYSCFG_0_REGS + SYSCFG0_PINMUX(11)) & (~(SYSCFG_PINMUX11_PINMUX11_27_24 | SYSCFG_PINMUX11_PINMUX11_19_16));1 H9 P( P- \, n" u. U
" {+ `, |. q7 ~! w/ u
HWREG(SOC_SYSCFG_0_REGS + SYSCFG0_PINMUX(11)) = (PINMUX11_BUSY_V1_ENABLE | PINMUX11_BUSY_V2_ENABLE | savePinMux);* S9 y2 m! l/ B$ {
, p' c R2 D+ j# |( O0 } 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));2 d8 c' d( ^9 B3 \) g" P- Z8 a* u
# f3 T- \- ~4 o6 `$ i; Q HWREG(SOC_SYSCFG_0_REGS + SYSCFG0_PINMUX(12)) = (PINMUX12_RESET_ENABLE | PINMUX12_CONVST_ENABLE | PINMUX12_RD_ENABLE | PINMUX12_BUSY_C_ENABLE | savePinMux);% C: I" c' e: Q6 i1 w
5 Q" o8 o5 F4 g4 I}
: G1 I; r6 R3 ?/ `, ]& t$ i; Z0 W3 g) o
- H# M4 y- G. ]: R' x8 N# _
static void ad7606_gpio_setup(ad7606 *ad) {
1 N# W2 p% j8 D6 C e /*Set the AD7606_PAR_BUSY to the input mode*/
$ q d7 ], Y( p+ N+ R. V //初始化5.11、5.9 、 5.5为中断口
. d- m* X) ~# X, O& g GPIODirModeSet(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_V1, GPIO_DIR_INPUT);
. y T6 K5 a2 ^1 |9 v1 q J GPIODirModeSet(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_V2, GPIO_DIR_INPUT);* A$ m" {) f7 A" y1 y! P [
GPIODirModeSet(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_C, GPIO_DIR_INPUT);
" |( ^7 J+ c( L% K- _ //GPIODirModeSet(SOC_GPIO_0_REGS, AD7606_PAR_BUSY, GPIO_DIR_INPUT);
4 ?) r3 ]* h5 @( [" X$ ^0 ?. Y /*Set the AD7606_PAR_BUSY to the Falling Edge Interrupt*/
; F6 t6 E( P) C |# H+ S GPIOIntTypeSet(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_V1, GPIO_INT_TYPE_FALLEDGE);3 ]8 G& K0 O0 G j. Z0 C6 a
GPIOIntTypeSet(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_V2, GPIO_INT_TYPE_FALLEDGE);) B3 K5 W) {6 v8 X! Q$ U+ w* I
GPIOIntTypeSet(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_C, GPIO_INT_TYPE_FALLEDGE);& v; s5 p4 s- Y1 \# _
//GPIOIntTypeSet(SOC_GPIO_0_REGS, AD7606_PAR_BUSY, GPIO_INT_TYPE_FALLEDGE);8 N# l1 `: U" H
/*The interrupt setting allows AD7606_PAR_BUSY_GPIO_BANK*/
& D! Z' b0 c% C/ j, C; m8 ~7 l8 B+ { GPIOBankIntEnable(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_GPIO_BANK);
( N4 b0 {, s4 ^" U7 c& g
$ u9 f( K$ [ g# Q6 t1 O GPIODirModeSet(SOC_GPIO_0_REGS, AD7606_PAR_RESET, GPIO_DIR_OUTPUT);: n1 L/ H! L d% E4 c# @6 S
GPIOPinWrite(SOC_GPIO_0_REGS, AD7606_PAR_RESET, GPIO_PIN_HIGH);0 a! w" ^3 j- X1 e( ~, O2 U
Task_sleep(1000);
* e% b+ ~" D( p/ I GPIOPinWrite(SOC_GPIO_0_REGS, AD7606_PAR_RESET, GPIO_PIN_LOW);# S! M6 G% C3 O" z/ V
Task_sleep(1000);
. v2 V) G+ }9 F# B9 T8 w( ` b
5 `6 n6 _% x9 S4 F) G8 ?1 b: b /*Set the AD7606_PAR_CONVST to output mode*// m" E) A8 Z- T& ~
GPIODirModeSet(SOC_GPIO_0_REGS, AD7606_PAR_CONVST, GPIO_DIR_OUTPUT);
5 a2 m2 p6 E% j: l GPIOPinWrite(SOC_GPIO_0_REGS, AD7606_PAR_CONVST, GPIO_PIN_LOW);
) W" ^* ~- f0 p. p
( ^( q6 R0 G, M) S: i. M' f GPIODirModeSet(SOC_GPIO_0_REGS, AD7606_PAR_RD, GPIO_DIR_OUTPUT);6 \8 ~+ d" B8 ^2 z- Z; u4 J" e
GPIOPinWrite(SOC_GPIO_0_REGS, AD7606_PAR_RD, GPIO_PIN_HIGH);
5 b0 _( y; A, f1 D5 m9 Y5 n4 n" ^/ l' |5 O: E1 B3 G; G2 d8 _
}% j# ~4 v; y- K- U+ c$ w
8 B6 O' l$ t, U9 b* B
$ w% J2 x+ {$ t& g; S- l
static void ad7606_busy_hwi(UArg ad_addr) {2 l/ g( f% |' R# c ~! L$ T1 L+ V
7 `3 f ]6 ]9 [* g5 Q6 l6 L
6 i3 a4 a; b* w. O" j5 ^, I
/* Disable the interrupts for pins of bank AD7606_PAR_BUSY in GPIO.*/
" K: M4 X( E7 A3 Y) l! ? GPIOBankIntDisable(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_GPIO_BANK); //用仿真器debug,发现程序能进入这里。
" O8 O" ?" O5 x3 p/ u% ?9 _" j! U' C3 X
if(GPIOPinIntStatus(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_V1) == GPIO_INT_PEND)( E$ Q* X& a; y L1 m" G/ x
{; j! x* U D) g- x
GPIOPinIntClear(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_V1); //问题是:用仿真器debug,发现程序不能进入这里。8 `# Q* N$ [0 X' E/ `: N/ j
cs_addr = SOC_EMIFA_CS5_ADDR ;9 @% w) ~* m. C) A0 j+ `! m
internal = 0 ;
8 f1 O! f! Q+ t6 I B int_flag[0] = 1 ;: h% V0 X i3 B# t) x
} H+ w; z' J+ C+ p; ^
if(GPIOPinIntStatus(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_V2) == GPIO_INT_PEND)
; H; O9 f3 u) |# e) K1 z {
; ?9 a- x2 l4 d: m8 N GPIOPinIntClear(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_V2); //问题是:用仿真器debug,发现程序不能进入这里。
$ |) m" X1 Z9 {- e' b* ?- U% J9 H cs_addr = SOC_EMIFA_CS4_ADDR ;
7 o. O7 B; t" G internal = 6 ;
+ u6 V1 j$ J! q& v: H int_flag[1] = 1 ;
+ C' F( l( i, @+ k' X }& Y H' U: w' x6 @5 [
if(GPIOPinIntStatus(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_C) == GPIO_INT_PEND)/ a; A0 \# v! j8 ]% \6 |2 f& Z9 @
{
$ C H+ V! F( y+ G9 N GPIOPinIntClear(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_C); //问题是:用仿真器debug,发现程序不能进入这里。
' h" H \- ]3 h8 F8 u cs_addr = SOC_EMIFA_CS2_ADDR ;4 C l; H N% l" ?( c
internal = 12 ;
1 m9 g' Z3 R, T2 G- \ int_flag[2] = 1 ;+ i3 ^& @5 `! B8 i2 h( l6 g
}: p7 P4 W+ z4 a# H/ `( l
5 s' S4 g8 x& E+ I GPIOPinWrite(SOC_GPIO_0_REGS, AD7606_PAR_CONVST, GPIO_PIN_LOW);
1 q% _9 n9 H/ S : G& V8 `2 c# c% q
GPIOBankIntEnable(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_GPIO_BANK);
) F5 Z3 I# e- \}
! c' O; q- y$ A5 u/ q; F5 Y3 @+ @
4 m+ f' U" D" ~' K" i8 z' I; k+ Y! D0 p: ^* Y
) Y& j9 F$ N% u6 }0 o+ [, ]% t
/ W- ?; g( u! j0 F7 t d
|
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
|