|
|
您好。使用GPIO中断时,中断能进入ISR,但是不能区分具体的GPIO端口。程序如下:
- s( z4 E' ?9 V4 |/ h#define AD7606_PAR_BUSY_GPIO_BANK 5
1 F- L* o' d* Z- Q#define AD7606_PAR_BUSY_GPIO_BANK_INT SYS_INT_GPIO_B5INT
+ z- Y/ C+ _+ a) I p* K% V
$ f2 F) a( P1 @#define AD7606_PAR_BUSY_V1 GPIO_TO_PIN(5, 11) //BANK5的中断口5.11
: q4 h. y9 ]7 w& q, l, b4 }#define AD7606_PAR_BUSY_V2 GPIO_TO_PIN(5, 9) //BANK5的中断口5.9
& V( L, X3 @1 v e E. ~9 Q$ r7 b- S#define AD7606_PAR_BUSY_C GPIO_TO_PIN(5, 5) //BANK5的中断口5.5
7 Y$ ]& D6 d- {- {4 h( Z#define AD7606_PAR_BUSY GPIO_TO_PIN(5, 4)$ e' ?/ u8 k) R3 G. p n
! }" H; f2 f H6 H$ |7 ~#define AD7606_PAR_CONVST GPIO_TO_PIN(5, 1)! w8 Y1 y$ Z! ]9 q: [9 t
#define AD7606_PAR_RD GPIO_TO_PIN(5, 2)
: L* x- [- j; ? f. e% j#define AD7606_PAR_RESET GPIO_TO_PIN(5, 0)
; S) U0 P9 o6 B: T+ E/ z
`/ m% M" }' H
' w; T$ d) R8 S$ Y3 p5 `1 {1 @2 P1 o4 M! L
static void ad7606_irq_setup(ad7606 *ad) {% T k* k. ?8 k$ _* j
Hwi_Params hwiParams;6 s! g- U" t" A) @4 P/ ^0 u; o
Hwi_Handle myHwi;
8 w/ }9 b& v) U2 O p Error_Block eb;& U1 I! L& Q2 ~" ?" \$ c
' i! ?4 \2 Q- f; q5 d# q Error_init(&eb);( b* h! [/ ~5 P* J& A0 s. E
Hwi_Params_init(&hwiParams);
. G4 O) r3 |7 x6 T T1 x0 S hwiParams.arg = (unsigned int)ad;
. \) L9 `* q4 g. U% M hwiParams.enableInt = FALSE;* r V! r6 `- f4 F D# p
hwiParams.eventId = SYS_INT_GPIO_B5INT;
/ I, @" t8 v F; R9 X hwiParams.priority = 4;. C0 `% z3 Y O5 x
myHwi = Hwi_create(8, ad7606_busy_hwi, &hwiParams, &eb); //注册BANK5中断处理函数' }2 P, r' B( G
if (myHwi == NULL)
! w# F+ m: H' i7 L/ ?7 g1 F+ ^/ M. c LOG_FATAL("failed to create hwi");
2 {) L, r- A: x3 t3 }2 H3 F3 L% l4 J# m0 S
/* enable both interrupts */
. T' B6 u) U; {- f/ O( t Hwi_enableInterrupt(ad->irq_event);
9 m- Q! D: Q7 Q, K7 _}! n/ ^% F( S7 w) M3 h; M' r& A& ]
# v* m/ v3 Y3 r9 L; M/ l# `5 X
* Y4 J' c1 v; i5 K/ ]0 f
static void ad7606_gpio_pinmux_setup(ad7606 *ad) {
% l' h1 @# }7 P- q- d8 L& H volatile unsigned int savePinMux = 0;2 p4 a$ k" x5 U& o
//初始化5.11、5.9 、 5.5为GPIO口
9 O& K6 |3 t J8 x2 R% g7 C+ U savePinMux = HWREG(SOC_SYSCFG_0_REGS + SYSCFG0_PINMUX(11)) & (~(SYSCFG_PINMUX11_PINMUX11_27_24 | SYSCFG_PINMUX11_PINMUX11_19_16));1 n- U) ]+ _* G, R' M9 d
. u- `. d( D0 u1 C1 b7 `3 b4 E: F
HWREG(SOC_SYSCFG_0_REGS + SYSCFG0_PINMUX(11)) = (PINMUX11_BUSY_V1_ENABLE | PINMUX11_BUSY_V2_ENABLE | savePinMux);+ z _: Q8 k# |9 _, E
6 I! s" J8 o5 c5 D# T9 B8 m 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)); S9 F6 a* U# J" r! B
. ~, g- N" |9 L- T3 s HWREG(SOC_SYSCFG_0_REGS + SYSCFG0_PINMUX(12)) = (PINMUX12_RESET_ENABLE | PINMUX12_CONVST_ENABLE | PINMUX12_RD_ENABLE | PINMUX12_BUSY_C_ENABLE | savePinMux);9 c# S) N0 V5 m& f7 k
3 K: @9 G" `) s1 x1 s) ~}" k; x* s: U/ K" Q0 R3 W+ E1 @. }
{0 G) T8 |' A$ p) ?( ^
3 @7 T% m2 q, Q4 @9 U+ e: |8 r0 u
static void ad7606_gpio_setup(ad7606 *ad) {
! D M! W7 Y T9 c: n* W /*Set the AD7606_PAR_BUSY to the input mode*/
1 j2 D* T9 b$ G2 h; s* B //初始化5.11、5.9 、 5.5为中断口. u2 c f) Y, h e: M k: C. K# b' Q
GPIODirModeSet(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_V1, GPIO_DIR_INPUT);" @* r% L5 E7 i% d
GPIODirModeSet(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_V2, GPIO_DIR_INPUT);( I( ?- ]( S+ ~3 ]: D* }6 U7 l2 h
GPIODirModeSet(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_C, GPIO_DIR_INPUT);& A2 U N* Z, H& [
//GPIODirModeSet(SOC_GPIO_0_REGS, AD7606_PAR_BUSY, GPIO_DIR_INPUT);
k( g6 U0 n V. d0 c7 n _ /*Set the AD7606_PAR_BUSY to the Falling Edge Interrupt*/2 w, h$ L! c' L; g' O& }6 S# b
GPIOIntTypeSet(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_V1, GPIO_INT_TYPE_FALLEDGE);
& `8 d: p. G+ a- l1 {7 g GPIOIntTypeSet(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_V2, GPIO_INT_TYPE_FALLEDGE);
4 V% ? ~5 t/ x+ U1 h/ O GPIOIntTypeSet(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_C, GPIO_INT_TYPE_FALLEDGE);0 L" P! U. f1 i5 Y! x
//GPIOIntTypeSet(SOC_GPIO_0_REGS, AD7606_PAR_BUSY, GPIO_INT_TYPE_FALLEDGE);
+ N; E& D4 z! ^* k5 ^9 r /*The interrupt setting allows AD7606_PAR_BUSY_GPIO_BANK*/
3 c6 P6 B+ c" Y: w GPIOBankIntEnable(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_GPIO_BANK);: z- z) ~* }/ _8 m5 y
( w+ p+ T3 G6 e# W! u GPIODirModeSet(SOC_GPIO_0_REGS, AD7606_PAR_RESET, GPIO_DIR_OUTPUT);. K" m) P( E2 Z: e9 N- M, w2 W
GPIOPinWrite(SOC_GPIO_0_REGS, AD7606_PAR_RESET, GPIO_PIN_HIGH);
$ Q2 k, @& A/ c2 x0 t* l: y Task_sleep(1000);
7 V& w8 {7 p( [ GPIOPinWrite(SOC_GPIO_0_REGS, AD7606_PAR_RESET, GPIO_PIN_LOW);
]4 K% A3 I' s; W$ ^! Z Task_sleep(1000);
7 x% i' G! M5 z
5 s, k# Y" o5 ^* s' x* X% f4 q /*Set the AD7606_PAR_CONVST to output mode*/
0 N3 O! x4 E; K GPIODirModeSet(SOC_GPIO_0_REGS, AD7606_PAR_CONVST, GPIO_DIR_OUTPUT);
6 P- c) V, |7 L; |1 E GPIOPinWrite(SOC_GPIO_0_REGS, AD7606_PAR_CONVST, GPIO_PIN_LOW);
" w; ]: K$ H9 g: }( x- X. s2 p
+ `( p; U/ d. A" G# a GPIODirModeSet(SOC_GPIO_0_REGS, AD7606_PAR_RD, GPIO_DIR_OUTPUT);
$ @ d+ N3 e k+ v GPIOPinWrite(SOC_GPIO_0_REGS, AD7606_PAR_RD, GPIO_PIN_HIGH);
3 k5 [, D$ ?0 z! e. i7 ?' ~- o" v; I8 h* ]1 ?. n0 O" i. b
}, ~5 Q: X8 [; S: N
! u1 g+ c9 o8 y2 E( y: q4 c1 ^% h' L
# }: m' ]* Z& c) _static void ad7606_busy_hwi(UArg ad_addr) {
+ g. h D" P$ |+ i8 q4 N7 }
- M/ \5 f" A8 {+ q' U3 D4 a0 k" f/ Q4 \2 I
/* Disable the interrupts for pins of bank AD7606_PAR_BUSY in GPIO.*/: t; @ r; K* t: g( Y ~
GPIOBankIntDisable(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_GPIO_BANK); //用仿真器debug,发现程序能进入这里。
: A" z; m( N; \4 b# {
7 `4 j& n) m2 S& ]8 T if(GPIOPinIntStatus(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_V1) == GPIO_INT_PEND)! i' l$ F7 x. y. o3 E( [6 R$ ?
{
. o5 I' Y! `# g/ r5 \ K GPIOPinIntClear(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_V1); //问题是:用仿真器debug,发现程序不能进入这里。7 |" u: s) C3 r+ _; a P
cs_addr = SOC_EMIFA_CS5_ADDR ;
7 o+ i- c+ L+ O internal = 0 ;
# Z3 |0 c2 `7 E3 y9 U6 p, ? R1 R int_flag[0] = 1 ;
! {8 \ M( O- g2 f, Y }$ B6 {% b" b7 Z8 S
if(GPIOPinIntStatus(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_V2) == GPIO_INT_PEND)! b7 |) q9 C p" e3 J7 @8 ~
{/ m, l2 }0 g( U0 e# J" f6 S
GPIOPinIntClear(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_V2); //问题是:用仿真器debug,发现程序不能进入这里。
. [( v/ k, M& b7 m0 ? cs_addr = SOC_EMIFA_CS4_ADDR ;! U# r% B: j. [4 z2 }1 H
internal = 6 ;
- O% L" ?; J- L! f int_flag[1] = 1 ;; l1 u/ P; m, ?
}
( a1 h' {. M+ r3 Q if(GPIOPinIntStatus(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_C) == GPIO_INT_PEND): C9 G8 F' D$ x& H1 f
{! P4 E* t8 k: `4 e; @) z
GPIOPinIntClear(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_C); //问题是:用仿真器debug,发现程序不能进入这里。
3 _& I. M$ \3 I! D" p/ A0 ] cs_addr = SOC_EMIFA_CS2_ADDR ;9 `( S7 |9 U9 J( L/ z
internal = 12 ;
E1 g$ h& v9 |4 C. |& b int_flag[2] = 1 ;" q% \# q' J! F1 P: A* X
}, ~0 Z% u: X: F: Z
: f$ f, p+ N4 C% D' [3 H2 a2 \ GPIOPinWrite(SOC_GPIO_0_REGS, AD7606_PAR_CONVST, GPIO_PIN_LOW);
' J3 Q: Z3 Z! S. O5 ^2 v# Y/ D , g0 W1 Y. u8 s' F. K8 m3 r1 y
GPIOBankIntEnable(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_GPIO_BANK);' }# _0 }% i/ g" m( e7 M
}
# l: c0 ~4 g6 D3 n
# c% Z0 e) C" P2 t. ^
- ^4 u# z" d2 \4 ^: {. v6 J2 C8 n
4 a# t$ f1 i1 U
|
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
|