|
|
您好。使用GPIO中断时,中断能进入ISR,但是不能区分具体的GPIO端口。程序如下:: Q) A7 s# m+ k% i% X' n, s4 V0 S
#define AD7606_PAR_BUSY_GPIO_BANK 5
( E$ Y" S- z$ M1 ?7 e7 ~#define AD7606_PAR_BUSY_GPIO_BANK_INT SYS_INT_GPIO_B5INT5 I$ C* n. |% z/ S& ~
4 ?. i: Z B) G#define AD7606_PAR_BUSY_V1 GPIO_TO_PIN(5, 11) //BANK5的中断口5.11" Y7 e# m) T/ Z, O9 w7 L
#define AD7606_PAR_BUSY_V2 GPIO_TO_PIN(5, 9) //BANK5的中断口5.9* |' v/ w' \# ?/ D6 w
#define AD7606_PAR_BUSY_C GPIO_TO_PIN(5, 5) //BANK5的中断口5.5& I3 K1 v7 V, N) F( {' l) R9 s
#define AD7606_PAR_BUSY GPIO_TO_PIN(5, 4)
f! S6 Q( ^7 r& `* l3 }- d7 C
1 c, y# ~/ t- p9 x2 ]# }: y2 `3 r4 |' |#define AD7606_PAR_CONVST GPIO_TO_PIN(5, 1)
8 p8 z2 Y% I+ u/ R#define AD7606_PAR_RD GPIO_TO_PIN(5, 2)4 m7 x6 f$ q1 I
#define AD7606_PAR_RESET GPIO_TO_PIN(5, 0)- U8 f- W/ n5 w9 G
4 c. l1 b; h6 K3 p8 J9 W7 C
7 T1 R c* o5 o3 v9 U
! _, M; ^6 E$ V8 pstatic void ad7606_irq_setup(ad7606 *ad) {' J! }! S9 P$ R2 V% j" U
Hwi_Params hwiParams;
6 a. t% ]( G; V# R Hwi_Handle myHwi;. R) q5 t& l/ ] o7 p
Error_Block eb;
" P, D9 k _& t( l3 i# A
; O( j) K& U+ F Error_init(&eb);
T2 c) C* r) v5 r7 k Hwi_Params_init(&hwiParams);
1 x- D; n0 k% i/ f hwiParams.arg = (unsigned int)ad;
. Q9 B' P( |. f k5 s' c hwiParams.enableInt = FALSE;
" i3 @7 K/ v' Z& { hwiParams.eventId = SYS_INT_GPIO_B5INT;: r* l* I7 Z0 A6 l& O" m
hwiParams.priority = 4;) O( u! O/ W. @
myHwi = Hwi_create(8, ad7606_busy_hwi, &hwiParams, &eb); //注册BANK5中断处理函数
/ t7 Z+ n5 |2 X8 Q& ]' E if (myHwi == NULL) % I# [" m7 @$ r$ m) G
LOG_FATAL("failed to create hwi");0 q, l5 Z4 X+ p, N# S7 F% ^4 h
8 _! V, ~ s; v7 `* c7 F# v /* enable both interrupts */
; M+ S; `0 m& ^$ \* O Hwi_enableInterrupt(ad->irq_event);
5 i5 Q# ]# I/ J. p}! M R' E# W$ t% J2 w
6 A, ~2 R5 D5 n9 j# @& }6 X% X. ~% ]0 a% Z9 F T1 N1 W" T
static void ad7606_gpio_pinmux_setup(ad7606 *ad) {0 }8 s; C0 y' h8 D7 C3 ^0 a- I
volatile unsigned int savePinMux = 0;6 R% U1 K& T6 R5 j
//初始化5.11、5.9 、 5.5为GPIO口3 L/ J5 U0 }/ g' r: Z& x
savePinMux = HWREG(SOC_SYSCFG_0_REGS + SYSCFG0_PINMUX(11)) & (~(SYSCFG_PINMUX11_PINMUX11_27_24 | SYSCFG_PINMUX11_PINMUX11_19_16));) Y* J V' k! M
7 d) a7 O* T4 L8 W$ }# f5 z* ?
HWREG(SOC_SYSCFG_0_REGS + SYSCFG0_PINMUX(11)) = (PINMUX11_BUSY_V1_ENABLE | PINMUX11_BUSY_V2_ENABLE | savePinMux);
- c5 S. a# P. Z, T/ x8 f. v1 y# X7 u( G1 p1 `. l- w. ]; `5 S
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));% |- C$ B6 e; p; A3 }! Z' p* n
, j. J5 n9 W6 E0 s0 i( ] HWREG(SOC_SYSCFG_0_REGS + SYSCFG0_PINMUX(12)) = (PINMUX12_RESET_ENABLE | PINMUX12_CONVST_ENABLE | PINMUX12_RD_ENABLE | PINMUX12_BUSY_C_ENABLE | savePinMux);4 M$ O( P$ @ a7 I: E; g# n1 p: f6 I
7 G0 ?- N6 y. U$ _/ U- ~
}
* y! `- P' U) T3 w, i7 W7 w- ]. d5 J A a5 D; w
3 N4 E0 W! F6 c' Q" estatic void ad7606_gpio_setup(ad7606 *ad) {
- k4 ]6 o; T' K# i! Q /*Set the AD7606_PAR_BUSY to the input mode*/8 {7 f& z$ ^( J4 b: Y
//初始化5.11、5.9 、 5.5为中断口 h" \. i4 r* F- T) B
GPIODirModeSet(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_V1, GPIO_DIR_INPUT);; m+ S/ f) y, k" F" Y: ? f1 [
GPIODirModeSet(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_V2, GPIO_DIR_INPUT);
! c. X5 W! k1 ^ GPIODirModeSet(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_C, GPIO_DIR_INPUT);
7 {0 m) c- ?8 t" M8 [; m$ J( V5 } //GPIODirModeSet(SOC_GPIO_0_REGS, AD7606_PAR_BUSY, GPIO_DIR_INPUT);
) @/ i9 c2 I9 p1 B" D% x /*Set the AD7606_PAR_BUSY to the Falling Edge Interrupt*/6 J/ h( y' C$ y0 s/ ~1 k
GPIOIntTypeSet(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_V1, GPIO_INT_TYPE_FALLEDGE);
" { r' F v" L7 |3 h4 H( c GPIOIntTypeSet(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_V2, GPIO_INT_TYPE_FALLEDGE);/ ~; j, f9 `, K: j1 o. }
GPIOIntTypeSet(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_C, GPIO_INT_TYPE_FALLEDGE);
7 `2 ^' I# K/ E; m4 K/ [. C! ` //GPIOIntTypeSet(SOC_GPIO_0_REGS, AD7606_PAR_BUSY, GPIO_INT_TYPE_FALLEDGE);
; I* c* g3 @% g8 L /*The interrupt setting allows AD7606_PAR_BUSY_GPIO_BANK*/
2 n4 }2 y1 V) ?9 f6 q# k GPIOBankIntEnable(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_GPIO_BANK);
4 ^ _4 [) x% @) Y4 H. J. h6 u2 s! j
8 j* Y: [% d% c. A% g, R GPIODirModeSet(SOC_GPIO_0_REGS, AD7606_PAR_RESET, GPIO_DIR_OUTPUT);- C. X/ l; M$ L. ]$ z2 x8 ]
GPIOPinWrite(SOC_GPIO_0_REGS, AD7606_PAR_RESET, GPIO_PIN_HIGH);
& @' ~0 \. R i0 U Task_sleep(1000);
. {& v/ N2 y' C8 n GPIOPinWrite(SOC_GPIO_0_REGS, AD7606_PAR_RESET, GPIO_PIN_LOW);
. k5 Y! R8 W' G Task_sleep(1000);
. |. m- c7 i* [; S3 I8 T1 {0 D# c9 L: C
/*Set the AD7606_PAR_CONVST to output mode*/
1 \0 n3 e2 _( o3 d GPIODirModeSet(SOC_GPIO_0_REGS, AD7606_PAR_CONVST, GPIO_DIR_OUTPUT);
6 m( k; f8 e1 \+ e9 U( t GPIOPinWrite(SOC_GPIO_0_REGS, AD7606_PAR_CONVST, GPIO_PIN_LOW);
0 @, @$ ~3 j: S* N+ q3 J4 ^+ a' }* a" M
GPIODirModeSet(SOC_GPIO_0_REGS, AD7606_PAR_RD, GPIO_DIR_OUTPUT);! V# T) }7 D& O( I6 ~) h
GPIOPinWrite(SOC_GPIO_0_REGS, AD7606_PAR_RD, GPIO_PIN_HIGH);
( W6 n) U# t5 ?2 T; m/ R
0 b: d. R; d7 L, r) | i}
, j4 @2 u# `1 n2 ]2 ^& f& v0 G4 p
4 \) \6 K+ Q" \. B; s, Qstatic void ad7606_busy_hwi(UArg ad_addr) {$ q# p2 q9 R4 t$ ~7 T+ j
/ ~# X, P: l% D7 q7 b
, y! B) }9 k2 ` /* Disable the interrupts for pins of bank AD7606_PAR_BUSY in GPIO.*/
6 ?' h% N: Q8 _, q% B GPIOBankIntDisable(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_GPIO_BANK); //用仿真器debug,发现程序能进入这里。: ^8 w. `2 K* \! ^' w
: G" i Y6 f! W
if(GPIOPinIntStatus(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_V1) == GPIO_INT_PEND)/ v9 W% p* y" C' s6 F% `
{% K9 Z n0 P" w* {
GPIOPinIntClear(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_V1); //问题是:用仿真器debug,发现程序不能进入这里。
) X' F5 Q1 f/ Y: \ cs_addr = SOC_EMIFA_CS5_ADDR ;* h4 f1 Y# h, {% { L8 k. `
internal = 0 ;
! V6 |2 R- S0 ?1 ~3 {8 D int_flag[0] = 1 ;
; ^7 E" |9 G: }# I% A G }
5 C* C# t' q' ?! V) } if(GPIOPinIntStatus(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_V2) == GPIO_INT_PEND)
" B0 ]9 n# _ ?5 n; c {
5 a8 O" J9 G' q% E0 ?9 _ GPIOPinIntClear(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_V2); //问题是:用仿真器debug,发现程序不能进入这里。
, Q. `6 Z% b- M4 i cs_addr = SOC_EMIFA_CS4_ADDR ;+ Y6 T/ f% u6 I& U
internal = 6 ;
n) ~* I+ y K& y* g& o" e+ @5 A int_flag[1] = 1 ;- r# E n5 |6 \$ R& ^! i8 ^% {
}
$ }, M* I+ G [' d if(GPIOPinIntStatus(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_C) == GPIO_INT_PEND)
+ {" Z5 K" K9 ^9 Z: _! c {7 {) c1 W- u* |3 y
GPIOPinIntClear(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_C); //问题是:用仿真器debug,发现程序不能进入这里。
( x8 R/ _$ e: d cs_addr = SOC_EMIFA_CS2_ADDR ;( Z5 L, s8 r9 h" ?
internal = 12 ;2 x* o: w/ U& n2 I8 L
int_flag[2] = 1 ;
) a3 Q7 n" n' z$ T3 T2 z }: `$ y. T1 T1 X" b2 P# s6 F9 @
: @/ m( H* P$ S" U$ s9 E" [
GPIOPinWrite(SOC_GPIO_0_REGS, AD7606_PAR_CONVST, GPIO_PIN_LOW);
% [% ?, G8 g5 X$ C1 w+ i) a% X, X8 E' B" }
. N( `$ O* J; P% z6 z- l% j, l GPIOBankIntEnable(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_GPIO_BANK);7 m$ |! i0 D# B$ V
}( O+ \2 y* u$ u& z! i
" d8 g. F: j+ ?/ @# W* T
|
|