|
您好。使用GPIO中断时,中断能进入ISR,但是不能区分具体的GPIO端口。程序如下:2 _- S( i6 u1 N
#define AD7606_PAR_BUSY_GPIO_BANK 53 _* k" \5 A" @6 z9 B1 e. q
#define AD7606_PAR_BUSY_GPIO_BANK_INT SYS_INT_GPIO_B5INT
4 n& Q x) W1 U6 N* z7 Y6 Y5 \7 {! L. s; V( w0 Y' N- s
#define AD7606_PAR_BUSY_V1 GPIO_TO_PIN(5, 11) //BANK5的中断口5.11
# h0 e# X" K- o7 T0 _8 L( |7 F#define AD7606_PAR_BUSY_V2 GPIO_TO_PIN(5, 9) //BANK5的中断口5.96 Q7 {2 V9 b& i4 x+ K0 M, \+ v
#define AD7606_PAR_BUSY_C GPIO_TO_PIN(5, 5) //BANK5的中断口5.5, m7 c7 h$ ]- o6 f
#define AD7606_PAR_BUSY GPIO_TO_PIN(5, 4)
' S/ I) `: o. L6 ?: S: ~' a6 g; W- Y2 S8 I: t
#define AD7606_PAR_CONVST GPIO_TO_PIN(5, 1)
9 ~& x6 _- i3 b% r7 T$ r" V9 Z/ p#define AD7606_PAR_RD GPIO_TO_PIN(5, 2)0 S$ N m; k$ O9 ]9 l
#define AD7606_PAR_RESET GPIO_TO_PIN(5, 0)8 O. q9 K+ M' L
2 y4 j. U }4 x( z* x# [, J* u
1 r" g+ t+ p, v; \, O
m" `8 C9 j, l8 i/ | a; \( xstatic void ad7606_irq_setup(ad7606 *ad) {: Y f; f$ O" m2 Z
Hwi_Params hwiParams;" t, I4 s u# W% a' s
Hwi_Handle myHwi;- b8 i0 C4 L! X# I9 z+ K
Error_Block eb;
! o! \& e; ] i. W
# g1 ~* e* s- h* l! v1 D9 J& z Error_init(&eb);# D6 d2 e" W- {0 m- {
Hwi_Params_init(&hwiParams);
" z x6 ^# Z1 |* ? U% H hwiParams.arg = (unsigned int)ad;/ \( O# G+ j: D q/ a( t7 h
hwiParams.enableInt = FALSE;
1 Z9 N9 l9 E/ ^0 i& G, Q hwiParams.eventId = SYS_INT_GPIO_B5INT;
3 x6 h& z% s5 s9 Y hwiParams.priority = 4;
: _5 ?9 M: O, _. i myHwi = Hwi_create(8, ad7606_busy_hwi, &hwiParams, &eb); //注册BANK5中断处理函数
: N* J, `6 n' t* l1 L& x4 ?7 ]8 C7 J if (myHwi == NULL)
& W" e7 F0 d9 k l! V- N u LOG_FATAL("failed to create hwi");
/ C! s# w* {0 o) q& Q
6 K R& ]2 y' m( v# Z /* enable both interrupts */
2 P' H& o: {1 \4 O Hwi_enableInterrupt(ad->irq_event);
/ O. [7 Q' L: B7 T' r}9 ?' E9 c8 u; \+ @
1 R( l4 R$ B2 Q/ {: t1 B' K
5 _3 o L& \3 M1 ?: ]static void ad7606_gpio_pinmux_setup(ad7606 *ad) {& Y) {& Y( U1 Z% z+ v; H
volatile unsigned int savePinMux = 0;
`8 Y9 ~: Z: Y% T5 S' m: s P //初始化5.11、5.9 、 5.5为GPIO口+ I9 [" ?; M9 ]
savePinMux = HWREG(SOC_SYSCFG_0_REGS + SYSCFG0_PINMUX(11)) & (~(SYSCFG_PINMUX11_PINMUX11_27_24 | SYSCFG_PINMUX11_PINMUX11_19_16));
6 e, @% B0 }4 E" F# `! m; N, K5 C" N0 \
HWREG(SOC_SYSCFG_0_REGS + SYSCFG0_PINMUX(11)) = (PINMUX11_BUSY_V1_ENABLE | PINMUX11_BUSY_V2_ENABLE | savePinMux);1 j+ i P0 n2 n$ X. [
1 z" B& K0 a( Y1 i( `
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));' E. z; S5 g# g) ?( l
* O N5 L- J3 t9 r/ Z; c' z9 A HWREG(SOC_SYSCFG_0_REGS + SYSCFG0_PINMUX(12)) = (PINMUX12_RESET_ENABLE | PINMUX12_CONVST_ENABLE | PINMUX12_RD_ENABLE | PINMUX12_BUSY_C_ENABLE | savePinMux);
( w! | C) b+ l& S$ l$ O7 M! k
# @4 k8 I4 g5 v1 M7 L}, e X" [1 e- W0 d: p( j. [
; o) n3 n9 T( B; S" c$ S5 ~+ h, Z
0 ], I5 E2 [5 p. U1 o. }static void ad7606_gpio_setup(ad7606 *ad) {
+ P( q6 u& p" c+ D. t5 F /*Set the AD7606_PAR_BUSY to the input mode*/9 C0 r% W1 `" n# h! H8 z! H
//初始化5.11、5.9 、 5.5为中断口/ O/ {$ x2 q! v) h$ }
GPIODirModeSet(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_V1, GPIO_DIR_INPUT);+ ~" X7 v1 t( F6 L2 h- Q9 H
GPIODirModeSet(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_V2, GPIO_DIR_INPUT);; w5 W4 i7 _) H6 Y" N9 T
GPIODirModeSet(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_C, GPIO_DIR_INPUT);! p) S; Z1 ]' p8 c% A4 j. m
//GPIODirModeSet(SOC_GPIO_0_REGS, AD7606_PAR_BUSY, GPIO_DIR_INPUT);
' W; x1 a6 D$ m /*Set the AD7606_PAR_BUSY to the Falling Edge Interrupt*/9 f( r' D M% x+ H
GPIOIntTypeSet(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_V1, GPIO_INT_TYPE_FALLEDGE);, V) E5 R! v" v, s M. E' u& U; G3 p
GPIOIntTypeSet(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_V2, GPIO_INT_TYPE_FALLEDGE);* `3 g3 `; M& q6 P+ F
GPIOIntTypeSet(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_C, GPIO_INT_TYPE_FALLEDGE);0 `* Q g2 p& r4 i7 c0 c6 ~! p% F
//GPIOIntTypeSet(SOC_GPIO_0_REGS, AD7606_PAR_BUSY, GPIO_INT_TYPE_FALLEDGE);
/ r+ T b; w- b9 e* q /*The interrupt setting allows AD7606_PAR_BUSY_GPIO_BANK*/
( Q* t3 V: H8 E- Q2 x# ]: g' ? GPIOBankIntEnable(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_GPIO_BANK);
9 L& U1 d) G- W2 I0 P# P' o. w$ N
9 w9 j/ P$ b, S4 l, Z; ~ GPIODirModeSet(SOC_GPIO_0_REGS, AD7606_PAR_RESET, GPIO_DIR_OUTPUT);0 j& `; s7 ?) \- K
GPIOPinWrite(SOC_GPIO_0_REGS, AD7606_PAR_RESET, GPIO_PIN_HIGH);
* M- r" ]/ v. [2 L: c Task_sleep(1000);- i8 y) {) g8 u; j
GPIOPinWrite(SOC_GPIO_0_REGS, AD7606_PAR_RESET, GPIO_PIN_LOW);
d3 g. J- R( S! N) I' C Task_sleep(1000);& U6 `/ m5 b. E T7 ?. M. y1 X* `
?3 ~ p4 ^, X$ V: F1 [ /*Set the AD7606_PAR_CONVST to output mode*/
" z, a. o1 N- N" W4 Z GPIODirModeSet(SOC_GPIO_0_REGS, AD7606_PAR_CONVST, GPIO_DIR_OUTPUT);
% X; p& Q( |/ K6 X' B GPIOPinWrite(SOC_GPIO_0_REGS, AD7606_PAR_CONVST, GPIO_PIN_LOW);
2 p, P- f4 m, z F; J$ [4 ?; D# P( B
GPIODirModeSet(SOC_GPIO_0_REGS, AD7606_PAR_RD, GPIO_DIR_OUTPUT);: r) e( v9 [ G/ s
GPIOPinWrite(SOC_GPIO_0_REGS, AD7606_PAR_RD, GPIO_PIN_HIGH);
/ X) W+ l8 r9 J* K# x' j, h' [: l# u
$ k% L$ ^7 o w& N2 N}
% c6 T$ @/ @8 ]" S1 m6 k+ r+ g4 n, c& g, ^
/ _2 u5 }% a9 A7 {static void ad7606_busy_hwi(UArg ad_addr) {
: G/ O% `( W7 o U6 Z L$ X, h# G+ W% Z. a% K! q
9 a X. e4 z& E% h8 }( N /* Disable the interrupts for pins of bank AD7606_PAR_BUSY in GPIO.*/! p: j* c6 Y6 M8 z1 ?+ v) f
GPIOBankIntDisable(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_GPIO_BANK); //用仿真器debug,发现程序能进入这里。
: |5 ^$ C0 B: W
& _. l* K& J2 F2 Q- h, \ if(GPIOPinIntStatus(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_V1) == GPIO_INT_PEND)( O. p0 X5 S9 V2 {& F- X: y
{
& \$ d$ A& X# O, [$ u5 Q GPIOPinIntClear(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_V1); //问题是:用仿真器debug,发现程序不能进入这里。) e; M7 i2 T" h# M" ^/ P% L8 t1 B+ a
cs_addr = SOC_EMIFA_CS5_ADDR ;
# @# v- x6 n4 d& \ D6 K% b internal = 0 ;0 w# ?9 r$ Y& b g% U
int_flag[0] = 1 ;
% P' }; E+ O" v" Y }
" C. b. P. u* m4 z# B9 T if(GPIOPinIntStatus(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_V2) == GPIO_INT_PEND)( ~! g8 V+ M$ U6 l9 }$ o
{
9 Q, Z u7 [. l' _4 e% Q GPIOPinIntClear(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_V2); //问题是:用仿真器debug,发现程序不能进入这里。$ c) C3 K& c0 E5 R/ ?
cs_addr = SOC_EMIFA_CS4_ADDR ;
3 l+ V* n* Q9 d! W4 x( v* D8 j internal = 6 ;2 ?& j4 R9 u+ b* l% t% ~" H
int_flag[1] = 1 ;# w7 b$ J, t; }* Z$ T W
}
6 `' o+ Y9 b% ] if(GPIOPinIntStatus(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_C) == GPIO_INT_PEND)
2 v4 x+ N( \% H {1 \4 j" K5 z, f8 e* P4 I' {( s& J
GPIOPinIntClear(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_C); //问题是:用仿真器debug,发现程序不能进入这里。5 b: d( A7 h2 D7 N& [
cs_addr = SOC_EMIFA_CS2_ADDR ;
( V* A$ g0 X: S6 }1 H+ Z* m internal = 12 ;3 R1 n* f V$ T, F( `
int_flag[2] = 1 ;8 k' l3 C( Q: f, \
}& `% v( I& u" e) i3 J
2 t6 X( y+ h6 R& I9 A& i GPIOPinWrite(SOC_GPIO_0_REGS, AD7606_PAR_CONVST, GPIO_PIN_LOW);$ c- f% e$ h# ^7 h0 O, ~! Q
/ d9 n G. q: t2 H2 k0 k/ C GPIOBankIntEnable(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_GPIO_BANK);
! b( ^0 P; g% C- }2 U' g+ D% z}
" W* N. t6 x8 c! \# Z2 o5 x
. c/ E* ]: s! I, n5 ]9 b) F2 K! q* x
( ]- b1 s7 n3 i/ C6 z
' M; W1 H) t) x* g/ H' I |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
|