|
|
您好。使用GPIO中断时,中断能进入ISR,但是不能区分具体的GPIO端口。程序如下:7 G) p$ |& L/ q# Y# m, H) `
#define AD7606_PAR_BUSY_GPIO_BANK 58 C- a3 _& f; J* D. h. Y Q
#define AD7606_PAR_BUSY_GPIO_BANK_INT SYS_INT_GPIO_B5INT
" w8 V3 b5 M8 P) H* f; K
- R+ H; M" P t# A/ @3 y0 f$ z A#define AD7606_PAR_BUSY_V1 GPIO_TO_PIN(5, 11) //BANK5的中断口5.11
9 d5 [: T$ j7 U' A, d! C#define AD7606_PAR_BUSY_V2 GPIO_TO_PIN(5, 9) //BANK5的中断口5.9. s- Z# Y4 C( n/ P
#define AD7606_PAR_BUSY_C GPIO_TO_PIN(5, 5) //BANK5的中断口5.5
3 E3 @$ m) `: n# F% u D#define AD7606_PAR_BUSY GPIO_TO_PIN(5, 4)/ h& }1 M+ a: R; h8 J2 E/ I+ h
3 u, y5 I6 N! e2 B#define AD7606_PAR_CONVST GPIO_TO_PIN(5, 1). S9 q# {4 I+ M0 H! S, I# h
#define AD7606_PAR_RD GPIO_TO_PIN(5, 2)
( q% h2 d1 p/ L: t2 _! Q#define AD7606_PAR_RESET GPIO_TO_PIN(5, 0)
) F2 P$ {1 \. k ^2 d4 {* |2 b7 Z0 R, s5 P2 ]& ~) X
|2 w9 T* ^& n# ^: J8 ^! x: b8 y% F$ |3 m7 ^. c, u- I
static void ad7606_irq_setup(ad7606 *ad) {
" z0 Q, p- C7 g3 m& o; \% _! B: [ Hwi_Params hwiParams;3 E, I5 V2 v$ B; d0 J% t, i
Hwi_Handle myHwi;
7 u- y/ |! ~+ z% ]8 e Error_Block eb;2 h: H4 B6 q6 _1 m# |
& T" B. @4 S3 ~2 j# a Error_init(&eb);1 }5 \ B( t* m1 T/ x
Hwi_Params_init(&hwiParams);
9 E9 L8 e1 V* L$ r0 R hwiParams.arg = (unsigned int)ad;, Z! K Z9 F* c$ ]8 C0 o
hwiParams.enableInt = FALSE;4 O3 G* Z% t0 `% O1 F5 H# H9 l4 \% D
hwiParams.eventId = SYS_INT_GPIO_B5INT;
8 e2 _% U* b5 s9 \- l# t$ ~5 A hwiParams.priority = 4;
, a: x2 h$ q8 q! O1 p% P myHwi = Hwi_create(8, ad7606_busy_hwi, &hwiParams, &eb); //注册BANK5中断处理函数
. U9 v) {3 |5 W if (myHwi == NULL) 1 F2 Z6 Z& O' s1 |* w
LOG_FATAL("failed to create hwi");. I% @2 ], E8 \, q2 Y6 a" L! j
: E( I2 h3 ?/ D( L9 G
/* enable both interrupts */9 n7 x1 w8 [# J5 n
Hwi_enableInterrupt(ad->irq_event);" V$ N5 \$ W# |6 X y2 c1 r/ `" v
}8 M4 {7 T: t: c4 @5 ~
; H" F- a3 Y* s M3 S. ^' g/ R
$ t4 n9 J6 e& G$ k
static void ad7606_gpio_pinmux_setup(ad7606 *ad) {" [0 `6 T v5 k' x) [1 C
volatile unsigned int savePinMux = 0;
0 B C' N0 l5 q) ]. x! n //初始化5.11、5.9 、 5.5为GPIO口
5 q5 ?- E0 q7 Y3 | savePinMux = HWREG(SOC_SYSCFG_0_REGS + SYSCFG0_PINMUX(11)) & (~(SYSCFG_PINMUX11_PINMUX11_27_24 | SYSCFG_PINMUX11_PINMUX11_19_16));8 v9 B( s8 v C
- {% v+ ]0 B, v$ n, o7 I7 ~; P- W) r+ x
HWREG(SOC_SYSCFG_0_REGS + SYSCFG0_PINMUX(11)) = (PINMUX11_BUSY_V1_ENABLE | PINMUX11_BUSY_V2_ENABLE | savePinMux);* [6 ]+ Z* J& ?* `2 z5 m4 {7 V
* _* Q6 d% Y8 }0 O' c" L) b3 l 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));$ }8 a$ P8 ]& \7 {0 l2 T' A p
% b! O/ e8 B$ X3 T, s HWREG(SOC_SYSCFG_0_REGS + SYSCFG0_PINMUX(12)) = (PINMUX12_RESET_ENABLE | PINMUX12_CONVST_ENABLE | PINMUX12_RD_ENABLE | PINMUX12_BUSY_C_ENABLE | savePinMux);6 Y9 L: I% z5 Q0 j9 U; E6 x" p
/ ] w& D) N7 i# u _}
/ h% b. _9 w5 g
, l4 d9 [7 U/ \
/ E5 a0 C _' ?( |3 Qstatic void ad7606_gpio_setup(ad7606 *ad) {
k! J( j. \- L /*Set the AD7606_PAR_BUSY to the input mode*// z& s& R/ ]% h( @) V9 t& y% I
//初始化5.11、5.9 、 5.5为中断口$ |' G+ Z! z3 O2 \/ I
GPIODirModeSet(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_V1, GPIO_DIR_INPUT);! s* N+ [: T( U# Q
GPIODirModeSet(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_V2, GPIO_DIR_INPUT);
: W' m* S; S5 I: q6 d! u5 |( V GPIODirModeSet(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_C, GPIO_DIR_INPUT);' J y' `# e4 g& X/ m( b' V
//GPIODirModeSet(SOC_GPIO_0_REGS, AD7606_PAR_BUSY, GPIO_DIR_INPUT);
. e) P9 ]% c" o1 u; j /*Set the AD7606_PAR_BUSY to the Falling Edge Interrupt*/
" m. n1 `) C* p4 x3 @ GPIOIntTypeSet(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_V1, GPIO_INT_TYPE_FALLEDGE);
" G6 s0 A; V/ `+ P& I GPIOIntTypeSet(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_V2, GPIO_INT_TYPE_FALLEDGE);
( J1 V0 W, A. Q' A# P0 t9 L8 a P) v L GPIOIntTypeSet(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_C, GPIO_INT_TYPE_FALLEDGE);
: ~" y) u9 M. v3 c# l //GPIOIntTypeSet(SOC_GPIO_0_REGS, AD7606_PAR_BUSY, GPIO_INT_TYPE_FALLEDGE);0 A7 M/ N/ t, M$ ~6 K
/*The interrupt setting allows AD7606_PAR_BUSY_GPIO_BANK*/. F! m2 }. d I
GPIOBankIntEnable(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_GPIO_BANK);
; d6 C. z( P$ G& Q0 y/ }- t
- a% T' ?% F: U& b8 |0 } GPIODirModeSet(SOC_GPIO_0_REGS, AD7606_PAR_RESET, GPIO_DIR_OUTPUT);
- @6 Y0 [: b. d" P, E GPIOPinWrite(SOC_GPIO_0_REGS, AD7606_PAR_RESET, GPIO_PIN_HIGH);
8 p) R; ]+ v, W, B" F* m: Q9 z Task_sleep(1000);0 Y1 W8 `; ^0 H( ?6 A% j* b
GPIOPinWrite(SOC_GPIO_0_REGS, AD7606_PAR_RESET, GPIO_PIN_LOW);% p) o" |( d9 O5 ?
Task_sleep(1000);6 e- ^' y: u& u
+ l) _1 `" m" B" e# Y) x7 L: O
/*Set the AD7606_PAR_CONVST to output mode*/0 K4 C" J% f O
GPIODirModeSet(SOC_GPIO_0_REGS, AD7606_PAR_CONVST, GPIO_DIR_OUTPUT);2 P: z) b% z0 v# _7 `" w5 J
GPIOPinWrite(SOC_GPIO_0_REGS, AD7606_PAR_CONVST, GPIO_PIN_LOW);
# L( s$ G3 g0 z( ~& B4 k/ }- S, N, `$ `
GPIODirModeSet(SOC_GPIO_0_REGS, AD7606_PAR_RD, GPIO_DIR_OUTPUT);
2 M, i( ~1 k9 a GPIOPinWrite(SOC_GPIO_0_REGS, AD7606_PAR_RD, GPIO_PIN_HIGH);
7 H# N: a! U( k; Y' `7 X- s& A, z. b) r1 @6 j5 @
}/ t$ l# ]- s7 s+ e$ |3 D( v
- Q1 g1 U# P& s* w
! E0 Q6 C0 w. U" Astatic void ad7606_busy_hwi(UArg ad_addr) {
) ?* F; ^' v/ A) Q
8 Q& o- `& y: ~# w' ~
1 `" H) N; ~- O6 d- m6 ~3 ? /* Disable the interrupts for pins of bank AD7606_PAR_BUSY in GPIO.*// L' D! k- z# Q) U+ v, ^" q
GPIOBankIntDisable(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_GPIO_BANK); //用仿真器debug,发现程序能进入这里。. O3 d% b6 J7 K( L7 ]0 A
# D# V# c0 V7 q& v3 R+ ~7 O
if(GPIOPinIntStatus(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_V1) == GPIO_INT_PEND)
! o& ~- x% N8 ]( M5 f" b: M {
% V1 z. Q" n! D GPIOPinIntClear(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_V1); //问题是:用仿真器debug,发现程序不能进入这里。! k5 o& R( c- y1 z
cs_addr = SOC_EMIFA_CS5_ADDR ;
; D: |6 t6 g: M+ _2 @) K+ ` internal = 0 ;% ^/ ~* m: J" \9 n5 ?# B
int_flag[0] = 1 ;
# V* D n/ Z( h$ |. G }
% u5 l& p; s" `) C if(GPIOPinIntStatus(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_V2) == GPIO_INT_PEND); z" |" `( h: x
{9 \" ^# ?& \( }7 I8 w
GPIOPinIntClear(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_V2); //问题是:用仿真器debug,发现程序不能进入这里。
, ~2 o$ I v0 l1 P% L& [) ~- d cs_addr = SOC_EMIFA_CS4_ADDR ;0 @0 c* H4 z' s* S# F$ s
internal = 6 ;
! x( `# `4 I! }* U! r! X' J int_flag[1] = 1 ;' f% N- u; O1 C
}
# u, L6 w2 S1 X( B1 W if(GPIOPinIntStatus(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_C) == GPIO_INT_PEND). z) F1 _3 j; T- Y1 d. d& |+ p
{
* u$ R; Y+ ]: M3 u, `8 V" l, k GPIOPinIntClear(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_C); //问题是:用仿真器debug,发现程序不能进入这里。; R6 Z6 D( J9 p# N
cs_addr = SOC_EMIFA_CS2_ADDR ;
7 z2 `8 J8 i. k9 _) j8 W( C internal = 12 ;
$ |0 j, G2 L! L8 _ int_flag[2] = 1 ;
/ G5 W R4 v$ t( N# c) d8 S A( @1 c }
2 F2 \1 Q# P; p6 w) q
" J5 D0 i, R- R# Q# o1 n7 f# J GPIOPinWrite(SOC_GPIO_0_REGS, AD7606_PAR_CONVST, GPIO_PIN_LOW);: @/ N+ l. @, U" w8 V& c
4 N- N: \" w+ `2 e9 P
GPIOBankIntEnable(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_GPIO_BANK);& C2 n2 V I7 t0 L' U. H, x
}/ @8 q9 K* \' H) z
! p4 b# z: Z, V2 _' D
) y9 n6 l, n% g$ x# C% l" K( f& T; r; C, G' u5 D
( b# ?. ]* \: `- [5 \0 I' P
|
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
|