|
您好。使用GPIO中断时,中断能进入ISR,但是不能区分具体的GPIO端口。程序如下:$ J$ C9 g5 b4 ?
#define AD7606_PAR_BUSY_GPIO_BANK 5
; [% y9 i! f# r3 S) Q1 ^) p& v6 A. g#define AD7606_PAR_BUSY_GPIO_BANK_INT SYS_INT_GPIO_B5INT- o8 U9 D% z2 Q
5 u( N0 ~* ? Y! E9 n3 `! u. u
#define AD7606_PAR_BUSY_V1 GPIO_TO_PIN(5, 11) //BANK5的中断口5.11
7 T7 l! H, g2 N0 ~+ _#define AD7606_PAR_BUSY_V2 GPIO_TO_PIN(5, 9) //BANK5的中断口5.9& V3 S9 I; H( A% V |% q
#define AD7606_PAR_BUSY_C GPIO_TO_PIN(5, 5) //BANK5的中断口5.5
: m) P9 V( A+ s$ O, Z#define AD7606_PAR_BUSY GPIO_TO_PIN(5, 4)
$ T! \0 ^6 V4 H& k, Y( u# u
9 S8 l* v# E/ n( @# o$ c#define AD7606_PAR_CONVST GPIO_TO_PIN(5, 1) H0 c6 l/ a' `1 }3 l$ t9 {
#define AD7606_PAR_RD GPIO_TO_PIN(5, 2)+ u9 w! \6 z7 C* F
#define AD7606_PAR_RESET GPIO_TO_PIN(5, 0)% @6 W& R M* g! ^# U V" w0 E3 E
, f. K' W& e- d: L9 b* y H" S
7 w2 f4 v- V' N& k1 \; x5 M6 Y* d% x! |+ I
static void ad7606_irq_setup(ad7606 *ad) {
% m/ T1 _/ N' }4 Q! T' f Hwi_Params hwiParams;; [$ P( m2 q8 O
Hwi_Handle myHwi;
& u: T- h0 D- l7 Q" z8 r Error_Block eb;. \0 \; R( w' ~+ g' B
2 }% s* x, a! n! l. @8 n% ]
Error_init(&eb);
! I. P' ^4 a1 ^6 _" s Hwi_Params_init(&hwiParams);
/ j& P% p; U5 |; k, d8 I1 ^5 f+ F hwiParams.arg = (unsigned int)ad;+ M5 B4 U7 x$ d
hwiParams.enableInt = FALSE;: O* f* T f; w. ^. p7 k
hwiParams.eventId = SYS_INT_GPIO_B5INT;
" i! E; ?" w: E' ^ hwiParams.priority = 4;
1 O5 G' J: L9 D7 U- { myHwi = Hwi_create(8, ad7606_busy_hwi, &hwiParams, &eb); //注册BANK5中断处理函数
% `( ?# E7 k" B3 f$ Y if (myHwi == NULL)
+ ~. z7 Y1 X1 i! N6 A LOG_FATAL("failed to create hwi");. j' @2 c: p' E; `( E3 H9 h# u8 M
' H! X" D2 L" P
/* enable both interrupts */* Q9 H& a O" m3 k" F
Hwi_enableInterrupt(ad->irq_event);& m: Y+ B0 Q0 Q0 @: ]% Z' C" \
}+ m H! E! C7 z* G6 _3 R9 ?/ @
g, F6 }2 z1 J
% P8 x' ?# I1 g1 `4 z+ cstatic void ad7606_gpio_pinmux_setup(ad7606 *ad) {
5 @& s2 @4 h: U0 N0 N H volatile unsigned int savePinMux = 0;
2 A2 r- I8 d2 d& ^3 k( t //初始化5.11、5.9 、 5.5为GPIO口
* j0 J" l6 Y) ?% n savePinMux = HWREG(SOC_SYSCFG_0_REGS + SYSCFG0_PINMUX(11)) & (~(SYSCFG_PINMUX11_PINMUX11_27_24 | SYSCFG_PINMUX11_PINMUX11_19_16));8 q8 w. R+ f# c4 v& |6 k
/ a% x/ Q. E0 h
HWREG(SOC_SYSCFG_0_REGS + SYSCFG0_PINMUX(11)) = (PINMUX11_BUSY_V1_ENABLE | PINMUX11_BUSY_V2_ENABLE | savePinMux); G$ U% [6 p C
* C* o$ H& @! U$ F& Z4 N5 X! P 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));) ]3 e. c* }/ D8 L
( Y, i& B: A; x1 a- t/ ^8 U* }
HWREG(SOC_SYSCFG_0_REGS + SYSCFG0_PINMUX(12)) = (PINMUX12_RESET_ENABLE | PINMUX12_CONVST_ENABLE | PINMUX12_RD_ENABLE | PINMUX12_BUSY_C_ENABLE | savePinMux);
- @6 I# w& f7 {+ r6 V6 ^. a# o
: p. G8 `' r: R" v2 l q! `}( y- y. ?5 d1 f( B! z1 e3 I
( M# W0 r2 e) @2 v
! Q! ~. h8 p& X8 @: Lstatic void ad7606_gpio_setup(ad7606 *ad) {
6 e" o# {2 }( F7 \/ B /*Set the AD7606_PAR_BUSY to the input mode*/$ F6 k" x# e# J
//初始化5.11、5.9 、 5.5为中断口6 a3 N; H1 x# Z: N; \& J( R
GPIODirModeSet(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_V1, GPIO_DIR_INPUT);
$ p2 u' x+ c3 B3 x- M5 \* i3 ^ GPIODirModeSet(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_V2, GPIO_DIR_INPUT);
: [7 l U _8 _; s$ X0 j GPIODirModeSet(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_C, GPIO_DIR_INPUT);( M* s* x) i8 U6 o
//GPIODirModeSet(SOC_GPIO_0_REGS, AD7606_PAR_BUSY, GPIO_DIR_INPUT);6 C7 _! L0 v0 P3 i1 f' x
/*Set the AD7606_PAR_BUSY to the Falling Edge Interrupt*/1 W' O" J1 u# A% b: z
GPIOIntTypeSet(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_V1, GPIO_INT_TYPE_FALLEDGE);
, G: D% o$ N9 b3 V3 m GPIOIntTypeSet(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_V2, GPIO_INT_TYPE_FALLEDGE);; b5 O; _; ^- J6 i1 f* K& ~) r
GPIOIntTypeSet(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_C, GPIO_INT_TYPE_FALLEDGE);
& M0 W- R+ P9 O( d: u6 m. X* l //GPIOIntTypeSet(SOC_GPIO_0_REGS, AD7606_PAR_BUSY, GPIO_INT_TYPE_FALLEDGE);
+ B1 v+ i5 t6 K, n) S7 x" A /*The interrupt setting allows AD7606_PAR_BUSY_GPIO_BANK*/
0 o7 H% `! Z: r1 B GPIOBankIntEnable(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_GPIO_BANK);! t6 @" t9 ^& |8 d
+ Z0 T0 [) l; {; j
GPIODirModeSet(SOC_GPIO_0_REGS, AD7606_PAR_RESET, GPIO_DIR_OUTPUT);0 n$ j& K1 \7 c+ C6 a$ @& V
GPIOPinWrite(SOC_GPIO_0_REGS, AD7606_PAR_RESET, GPIO_PIN_HIGH);
$ K/ _3 |' P2 t& m5 x5 Z/ ~, ~ Task_sleep(1000);
2 u7 Q8 ?5 O E) h1 ~& Z) E$ g GPIOPinWrite(SOC_GPIO_0_REGS, AD7606_PAR_RESET, GPIO_PIN_LOW);6 S; a: [% F. [; ~5 M5 q. H6 Y4 D9 e
Task_sleep(1000);
1 B/ i# X" b% P# K r% i6 M4 K }) G& ?, y( v
/*Set the AD7606_PAR_CONVST to output mode*/1 q' j+ Q* _/ Q2 f3 E% u
GPIODirModeSet(SOC_GPIO_0_REGS, AD7606_PAR_CONVST, GPIO_DIR_OUTPUT);
# g( r2 Y1 R% `6 c GPIOPinWrite(SOC_GPIO_0_REGS, AD7606_PAR_CONVST, GPIO_PIN_LOW);# o* r. A. ~0 a( [9 Y/ G1 i$ a
6 p! l" @/ e# l) h4 S
GPIODirModeSet(SOC_GPIO_0_REGS, AD7606_PAR_RD, GPIO_DIR_OUTPUT);
1 J% g' J, A# w% v2 g D5 y# t GPIOPinWrite(SOC_GPIO_0_REGS, AD7606_PAR_RD, GPIO_PIN_HIGH);
1 ^+ C0 w1 J* H# _6 t# o
; ~ \: A4 ~1 I2 x}
5 e( E1 D3 D3 @7 L/ d6 }7 O7 P: C# a, g. {5 |0 E
' S5 q5 |9 X" j1 P5 |
static void ad7606_busy_hwi(UArg ad_addr) { w3 U, d- V3 f
$ e$ ^1 i# |$ j; [2 y8 c6 a, {, K
! E; u! |& c2 j: d+ b# @
/* Disable the interrupts for pins of bank AD7606_PAR_BUSY in GPIO.*/8 @& V9 h# s( M. ]
GPIOBankIntDisable(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_GPIO_BANK); //用仿真器debug,发现程序能进入这里。
: Y5 ^7 ~- z- G' W' O- z% X( F. u/ Y
if(GPIOPinIntStatus(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_V1) == GPIO_INT_PEND)7 w3 u" w/ C* J$ ^3 G+ n: {
{
; D1 p2 `7 e6 t& T& i x GPIOPinIntClear(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_V1); //问题是:用仿真器debug,发现程序不能进入这里。
* x0 n3 l9 N% J* K3 Z% I, Z cs_addr = SOC_EMIFA_CS5_ADDR ;
9 x5 }$ g3 r8 y% w* U) I# K6 w internal = 0 ;! ~* P9 x/ W2 j5 N! _. h
int_flag[0] = 1 ;
& @ n1 s1 _+ d6 m! @: q6 I }% `, ~7 L I7 A5 L
if(GPIOPinIntStatus(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_V2) == GPIO_INT_PEND)
# |0 D+ E T; {2 e1 p {4 c- O- _/ P# S0 _' q) n3 a
GPIOPinIntClear(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_V2); //问题是:用仿真器debug,发现程序不能进入这里。9 O \+ E2 l5 n- c+ _1 [# E( Y
cs_addr = SOC_EMIFA_CS4_ADDR ;
( c0 G( x' z [- S/ i0 K internal = 6 ;
j" N9 Y/ ?, S int_flag[1] = 1 ;
! [+ j) d1 _" `- o! c5 O( A }
# W7 t {8 v7 [& q1 ` if(GPIOPinIntStatus(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_C) == GPIO_INT_PEND)
4 `6 ^" G2 v" x! e* t; z {
0 P" O0 @ Y; B/ S GPIOPinIntClear(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_C); //问题是:用仿真器debug,发现程序不能进入这里。
m. F0 v5 _! F) c, P" D+ Y3 r cs_addr = SOC_EMIFA_CS2_ADDR ;
2 y; @7 b1 n2 p, ` internal = 12 ;
0 W' e) b" d% A3 ~$ B int_flag[2] = 1 ;
" O- p4 V5 U7 s6 A }
{3 ^* n8 `9 x! E0 ] 2 b& i5 U! N+ P, d4 e% t6 F
GPIOPinWrite(SOC_GPIO_0_REGS, AD7606_PAR_CONVST, GPIO_PIN_LOW);
7 C& [; q4 P- d- y% g f
8 c* N1 [; P6 ~7 B) k7 V* g GPIOBankIntEnable(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_GPIO_BANK);
- R$ p1 k3 j' D) y' p. K' C}: {1 L8 L/ D# G' j$ L* L
3 y& P& @7 v3 Q9 J/ X: {! s) Q6 D- b8 I1 f( c# S" g
0 D& I5 _% [" L; q) m2 ~6 B }% }# w
|
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
|