|
|
您好。使用GPIO中断时,中断能进入ISR,但是不能区分具体的GPIO端口。程序如下:
0 V. x9 n# ?3 E8 H5 w' Z) f; Y#define AD7606_PAR_BUSY_GPIO_BANK 5
4 E" s- B u+ \" Y/ w0 n#define AD7606_PAR_BUSY_GPIO_BANK_INT SYS_INT_GPIO_B5INT
1 s; Y, \: d: z6 B" a$ i) C! l6 B2 ?
2 j, w- t- h4 I* y! v1 f' }#define AD7606_PAR_BUSY_V1 GPIO_TO_PIN(5, 11) //BANK5的中断口5.114 M! ?+ }& X, H6 d6 D* \9 i
#define AD7606_PAR_BUSY_V2 GPIO_TO_PIN(5, 9) //BANK5的中断口5.96 a. S. x0 W5 P
#define AD7606_PAR_BUSY_C GPIO_TO_PIN(5, 5) //BANK5的中断口5.5; q5 T Q) q+ C: W3 ~6 W
#define AD7606_PAR_BUSY GPIO_TO_PIN(5, 4)
; }6 Y2 h' x/ c. e( a- C
' R7 z( K+ x" Z#define AD7606_PAR_CONVST GPIO_TO_PIN(5, 1)4 p Q0 F3 P H6 L$ ?* I B
#define AD7606_PAR_RD GPIO_TO_PIN(5, 2)
7 e9 Z) q) g7 f* {" y#define AD7606_PAR_RESET GPIO_TO_PIN(5, 0)
* w1 b! w- }- e: _# u7 w! j1 _8 W! j1 P
/ ] y1 b& q) k, i' K4 L6 y( {
3 ^4 Z9 W1 z- e8 E1 L( @; y
static void ad7606_irq_setup(ad7606 *ad) {
# T' \, x& W& m/ c Hwi_Params hwiParams;- ^' i6 _, e: y* z$ G
Hwi_Handle myHwi;' u0 G2 Y( Z$ j( G+ I
Error_Block eb;
+ T% }, f) p* x# @7 z
( }' R: a0 c; t4 @5 r Error_init(&eb);3 W+ {0 { w( I4 }; a) x
Hwi_Params_init(&hwiParams);$ _, _/ [3 |9 D8 {7 }$ ]4 L
hwiParams.arg = (unsigned int)ad;' W2 V. I$ g. f/ f4 P" G
hwiParams.enableInt = FALSE; I& o k% j f, c
hwiParams.eventId = SYS_INT_GPIO_B5INT;
# b9 |. r" c, }5 O hwiParams.priority = 4;. Q f2 @2 L0 I
myHwi = Hwi_create(8, ad7606_busy_hwi, &hwiParams, &eb); //注册BANK5中断处理函数" r# A& x* I. ]0 N g- W' b$ w0 A
if (myHwi == NULL) ( i3 q; j; R) K: E5 W- E5 ]' v
LOG_FATAL("failed to create hwi");4 m' D( E4 K5 _5 P" N
" a7 {2 i6 B3 b1 r" M+ n: } /* enable both interrupts */& T+ \6 o( h5 O8 _( R) I. \# y: v
Hwi_enableInterrupt(ad->irq_event);
. O7 J }* ?- o) _8 _+ ]+ Z}
" Q# ~- F( y. G2 W8 ^8 _+ ?0 V* A" N7 Y1 i) `+ ^1 r
6 {, J/ G, l' L" Ostatic void ad7606_gpio_pinmux_setup(ad7606 *ad) {
- K) B% u V4 M volatile unsigned int savePinMux = 0;
* l& P1 N2 S2 `: N; e //初始化5.11、5.9 、 5.5为GPIO口
7 G# E+ K8 [8 ?0 v savePinMux = HWREG(SOC_SYSCFG_0_REGS + SYSCFG0_PINMUX(11)) & (~(SYSCFG_PINMUX11_PINMUX11_27_24 | SYSCFG_PINMUX11_PINMUX11_19_16));
) o, |, B4 e4 H. @9 h' K
$ O( j6 b0 o0 Y& ~2 x% n' E! o( z HWREG(SOC_SYSCFG_0_REGS + SYSCFG0_PINMUX(11)) = (PINMUX11_BUSY_V1_ENABLE | PINMUX11_BUSY_V2_ENABLE | savePinMux);8 b% F% e9 w) ^& ?' }, B( {
" p! q) j+ X6 L* ~8 c8 t
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" u+ ^* _. p C9 s9 m9 g
& T8 m4 _- k4 l! r HWREG(SOC_SYSCFG_0_REGS + SYSCFG0_PINMUX(12)) = (PINMUX12_RESET_ENABLE | PINMUX12_CONVST_ENABLE | PINMUX12_RD_ENABLE | PINMUX12_BUSY_C_ENABLE | savePinMux);9 \/ i- r7 ~1 a0 V0 n
* Y7 t) F. t; \4 z# C* q9 A5 o5 C}8 g" d% a1 P! h
3 G, q3 n: g$ B1 A( Q: N& ]
) R0 ?. d# v# ~* j& [static void ad7606_gpio_setup(ad7606 *ad) {. J( m' e o0 E6 q9 D l
/*Set the AD7606_PAR_BUSY to the input mode*/
3 j) n3 K! ^5 T m3 _ //初始化5.11、5.9 、 5.5为中断口
* Q) F+ m" H% _6 y GPIODirModeSet(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_V1, GPIO_DIR_INPUT);
; ]1 `; n3 J- r# j. Y$ k GPIODirModeSet(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_V2, GPIO_DIR_INPUT);# ]7 C l7 P" ~7 J* ^4 T
GPIODirModeSet(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_C, GPIO_DIR_INPUT);3 \, Q7 `1 @+ }2 K k1 I
//GPIODirModeSet(SOC_GPIO_0_REGS, AD7606_PAR_BUSY, GPIO_DIR_INPUT);
* `% \5 ~- r1 n, E5 ^ /*Set the AD7606_PAR_BUSY to the Falling Edge Interrupt*/* U) C9 s- E* Z# A x
GPIOIntTypeSet(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_V1, GPIO_INT_TYPE_FALLEDGE);
. G9 _9 B" z# \; O GPIOIntTypeSet(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_V2, GPIO_INT_TYPE_FALLEDGE);
( V' m4 g7 r4 F' m GPIOIntTypeSet(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_C, GPIO_INT_TYPE_FALLEDGE);
' J. v0 e, _. W% X //GPIOIntTypeSet(SOC_GPIO_0_REGS, AD7606_PAR_BUSY, GPIO_INT_TYPE_FALLEDGE);
3 ^( M- _3 E; h /*The interrupt setting allows AD7606_PAR_BUSY_GPIO_BANK*/: \$ ]4 a m$ }1 N' E5 i, L! ^
GPIOBankIntEnable(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_GPIO_BANK);" u( h2 G0 Y8 p V- G2 {8 |+ ]
* u" v1 ?$ S1 o U6 G" C GPIODirModeSet(SOC_GPIO_0_REGS, AD7606_PAR_RESET, GPIO_DIR_OUTPUT);
6 |. X5 ]- X$ b, i' F GPIOPinWrite(SOC_GPIO_0_REGS, AD7606_PAR_RESET, GPIO_PIN_HIGH);
/ U, P; u! p8 ~1 A( q8 v) K5 U* \ Task_sleep(1000);
- _0 \" b. M5 L' w6 h GPIOPinWrite(SOC_GPIO_0_REGS, AD7606_PAR_RESET, GPIO_PIN_LOW);% K; G, U4 m3 E" ]4 @
Task_sleep(1000);! w- r' f0 E# E# c! x+ n
* v, N9 W* x! h /*Set the AD7606_PAR_CONVST to output mode*/! `1 v" f9 t( a: u, |
GPIODirModeSet(SOC_GPIO_0_REGS, AD7606_PAR_CONVST, GPIO_DIR_OUTPUT);
0 C2 ?8 X& F. V5 c9 U, g H4 J) H GPIOPinWrite(SOC_GPIO_0_REGS, AD7606_PAR_CONVST, GPIO_PIN_LOW);! r% z* z p8 H+ r: I: M" d2 m
5 }8 F! n+ r0 m: }0 v9 S GPIODirModeSet(SOC_GPIO_0_REGS, AD7606_PAR_RD, GPIO_DIR_OUTPUT);( V; a0 Y: V* w# ]* F! H% v
GPIOPinWrite(SOC_GPIO_0_REGS, AD7606_PAR_RD, GPIO_PIN_HIGH);
, o% ~! U7 m- ?- ?7 S
2 f& }1 K: k* U/ M4 L6 ~0 o% F}$ x/ u8 n( R0 s9 O
9 q" a8 ~% i7 W9 U" q
+ @+ K3 I, n. a; G+ l. C0 m+ l4 t
static void ad7606_busy_hwi(UArg ad_addr) { J J4 t0 W! I) t$ g
& {$ p; D Q' y8 G; y
# A4 ^, C( r6 v/ ~7 O$ h2 H1 ]: b /* Disable the interrupts for pins of bank AD7606_PAR_BUSY in GPIO.*/. D# F! M& M. t
GPIOBankIntDisable(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_GPIO_BANK); //用仿真器debug,发现程序能进入这里。1 @" k: d# U' x# I
" s) \4 Y- |/ a; J if(GPIOPinIntStatus(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_V1) == GPIO_INT_PEND)$ I* ]4 y) B$ P( v$ v0 b
{
- Z1 {( j% E ^- y. b# M GPIOPinIntClear(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_V1); //问题是:用仿真器debug,发现程序不能进入这里。7 C2 v3 L0 W8 d m& z! b, n3 l9 q
cs_addr = SOC_EMIFA_CS5_ADDR ;' o1 s- F/ ~: e$ P( ~
internal = 0 ;) r& i0 P7 a) P4 D) j; m1 X
int_flag[0] = 1 ;( N* ~5 @7 h: F4 U
}
' x9 E! o% ~$ X# ]1 w J% ?) s if(GPIOPinIntStatus(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_V2) == GPIO_INT_PEND)
" I* \4 [, ]7 H9 i2 ]/ a {# h5 K3 `8 {% @* |( k
GPIOPinIntClear(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_V2); //问题是:用仿真器debug,发现程序不能进入这里。9 P5 w0 C6 a: b
cs_addr = SOC_EMIFA_CS4_ADDR ;
2 q8 P' h, r+ D" E" m: L internal = 6 ;
4 u, A5 |- k7 O& \9 i1 A int_flag[1] = 1 ;4 {' t- K9 ^* f1 {# z* }
}
* V8 U1 K A) u- [, O if(GPIOPinIntStatus(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_C) == GPIO_INT_PEND)
) ^+ v% W( y2 D Z- f7 o {
5 I9 |: V2 J9 R6 L& { GPIOPinIntClear(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_C); //问题是:用仿真器debug,发现程序不能进入这里。
; _) D8 ~ }, q4 R# Z$ e cs_addr = SOC_EMIFA_CS2_ADDR ;
. N5 u% U& E! k0 B6 U internal = 12 ;, |1 A9 W5 G ^' Q$ r1 R5 E: c: T
int_flag[2] = 1 ;. r3 y8 b& y6 ?' X6 o2 m* ]+ Q
}
& ^1 _- F- H' z
6 H9 q9 x' x8 h A* L& L# H4 d GPIOPinWrite(SOC_GPIO_0_REGS, AD7606_PAR_CONVST, GPIO_PIN_LOW);1 W. M3 k& r( b/ B3 F1 u) O' @
; k& _3 @: m, N. c! s1 K7 u( t GPIOBankIntEnable(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_GPIO_BANK);
. `- {' U8 b" K; J2 _0 w- p}
$ c! ?6 C" F4 P* h
8 k! l7 t3 D, l/ n& C, G0 `0 o- ~+ H/ l
$ F$ b F9 Y6 s4 ]" z9 i
7 X$ G) n& b+ p; I: y |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
|