|
您好。使用GPIO中断时,中断能进入ISR,但是不能区分具体的GPIO端口。程序如下:
' {1 Z/ o9 ^; e" M+ D#define AD7606_PAR_BUSY_GPIO_BANK 58 R" Z- A3 c/ J. e1 g. p6 E
#define AD7606_PAR_BUSY_GPIO_BANK_INT SYS_INT_GPIO_B5INT4 _9 O6 o# R) w8 C5 q- C$ q. C
; X9 V, g- | `+ s( t# T#define AD7606_PAR_BUSY_V1 GPIO_TO_PIN(5, 11) //BANK5的中断口5.11
5 N6 ^% R/ E+ Q0 C2 W#define AD7606_PAR_BUSY_V2 GPIO_TO_PIN(5, 9) //BANK5的中断口5.9
; y% a7 i5 E% a! n$ K# i! z7 i#define AD7606_PAR_BUSY_C GPIO_TO_PIN(5, 5) //BANK5的中断口5.5, U% a" J& f! C% x t
#define AD7606_PAR_BUSY GPIO_TO_PIN(5, 4)0 \ T) h1 g, L+ A
" e+ m' q9 i) Y& P( _+ r0 u0 e/ p
#define AD7606_PAR_CONVST GPIO_TO_PIN(5, 1)
4 v7 P# }, {0 J! o#define AD7606_PAR_RD GPIO_TO_PIN(5, 2)5 S0 O, g- G3 |" I
#define AD7606_PAR_RESET GPIO_TO_PIN(5, 0)6 ~/ j: _9 {0 [
6 ^+ O0 E+ ]2 x. D( m" _! [, N+ s+ D, _! H4 l7 f$ I
* \/ e( q6 C* ]6 a0 j- T0 ~4 Estatic void ad7606_irq_setup(ad7606 *ad) {
; o A2 E: z$ n( P- r4 B" Q6 E Hwi_Params hwiParams;
6 h, o8 W# W, F3 V$ _ Hwi_Handle myHwi;# v& T+ m/ o! H9 Y6 S# d9 B- t
Error_Block eb;+ h3 ^; n. P# D
! x- z0 z& ~& M+ y Error_init(&eb);
$ @! f x2 g0 o' @. ~ Hwi_Params_init(&hwiParams);
5 w1 K3 i+ ^9 @6 w1 c hwiParams.arg = (unsigned int)ad;
* y, ]1 w0 W$ {( f) u) [7 U; A# d hwiParams.enableInt = FALSE;
% }) U5 L9 r; b( b9 ]$ K( d, I hwiParams.eventId = SYS_INT_GPIO_B5INT;
4 Z) F% B C! K; x. `4 M hwiParams.priority = 4;
& O. ^+ U& ~5 m' V, B! X myHwi = Hwi_create(8, ad7606_busy_hwi, &hwiParams, &eb); //注册BANK5中断处理函数! o8 J9 t2 A7 q
if (myHwi == NULL) + I" m4 A% G, ~ ]6 U9 t& L2 W4 X
LOG_FATAL("failed to create hwi");& q7 l) K" G6 C: j9 K/ g
5 l5 {! k( U& g3 b! K# B /* enable both interrupts */; ?" m1 g2 I4 c, D: r4 Y$ R% N: {
Hwi_enableInterrupt(ad->irq_event);
$ Z& m# K1 e* W. {) v- j}
% x. J/ a% W0 J+ g/ f
* w: k& r' Q9 i d- {0 ^0 h
6 S& _. w5 Q1 S- P. ustatic void ad7606_gpio_pinmux_setup(ad7606 *ad) {& o5 [6 j) ~* `7 a3 M# U$ N# I& B
volatile unsigned int savePinMux = 0;
7 H6 e8 I4 b# S% ~" O- P/ q //初始化5.11、5.9 、 5.5为GPIO口
# ]6 d% j& O* T/ A6 ^ savePinMux = HWREG(SOC_SYSCFG_0_REGS + SYSCFG0_PINMUX(11)) & (~(SYSCFG_PINMUX11_PINMUX11_27_24 | SYSCFG_PINMUX11_PINMUX11_19_16));
3 c% a4 ^3 i m4 N h
6 o# S6 D4 {' X- @ HWREG(SOC_SYSCFG_0_REGS + SYSCFG0_PINMUX(11)) = (PINMUX11_BUSY_V1_ENABLE | PINMUX11_BUSY_V2_ENABLE | savePinMux);# V+ e& ?# C5 W2 C# H) E+ H
& W" X0 {! ~5 c, ~0 k 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));% e5 O% y' y3 i. I5 p2 v
- a2 q1 h; x. R: l, ?; H, s. U
HWREG(SOC_SYSCFG_0_REGS + SYSCFG0_PINMUX(12)) = (PINMUX12_RESET_ENABLE | PINMUX12_CONVST_ENABLE | PINMUX12_RD_ENABLE | PINMUX12_BUSY_C_ENABLE | savePinMux);
- s7 b. B6 x& f3 l. a9 ]. a! q
$ b" _/ S# C2 P G}: U: h2 g. t+ F" d6 F0 P, R; I- c
( ~- [" F2 h5 z2 _ `7 }
/ H" Y5 z' ? y+ o0 x# P6 R1 O
static void ad7606_gpio_setup(ad7606 *ad) {
2 k$ y: @1 s4 P5 c /*Set the AD7606_PAR_BUSY to the input mode*/
e5 a7 t& a. o4 L$ K. A5 Z8 I# j //初始化5.11、5.9 、 5.5为中断口
( h# p0 ]& I$ R. t8 | GPIODirModeSet(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_V1, GPIO_DIR_INPUT); _$ j! s: {0 g0 `: Q: j# C0 l
GPIODirModeSet(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_V2, GPIO_DIR_INPUT);4 ^1 a4 Z3 N5 ?$ q3 x
GPIODirModeSet(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_C, GPIO_DIR_INPUT);$ R# F2 d' a' Z$ i% R
//GPIODirModeSet(SOC_GPIO_0_REGS, AD7606_PAR_BUSY, GPIO_DIR_INPUT);
1 ?. g% N9 ~( W9 R) V* }3 N /*Set the AD7606_PAR_BUSY to the Falling Edge Interrupt*/
]9 r" v; ^0 J3 U9 i GPIOIntTypeSet(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_V1, GPIO_INT_TYPE_FALLEDGE);
) M) _/ W$ [+ D$ a4 D2 t) K GPIOIntTypeSet(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_V2, GPIO_INT_TYPE_FALLEDGE);
, N* z9 z: q3 z. S# ~' z GPIOIntTypeSet(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_C, GPIO_INT_TYPE_FALLEDGE);
% o4 c0 v* F& s) f0 A+ ]9 T& Z //GPIOIntTypeSet(SOC_GPIO_0_REGS, AD7606_PAR_BUSY, GPIO_INT_TYPE_FALLEDGE);
+ J9 c: b+ q7 z2 ` /*The interrupt setting allows AD7606_PAR_BUSY_GPIO_BANK*/
- J! i! j: s6 ^. r1 {: {4 a* i! o GPIOBankIntEnable(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_GPIO_BANK);+ f e& c5 e( ], G
" M4 m$ V: \( X2 G' I# ] GPIODirModeSet(SOC_GPIO_0_REGS, AD7606_PAR_RESET, GPIO_DIR_OUTPUT);
2 @1 f) ^' z% r8 C+ \7 L6 ?1 ` GPIOPinWrite(SOC_GPIO_0_REGS, AD7606_PAR_RESET, GPIO_PIN_HIGH);
_! m" N ?2 x Task_sleep(1000);
/ q8 c2 u6 O9 _+ D( ~ GPIOPinWrite(SOC_GPIO_0_REGS, AD7606_PAR_RESET, GPIO_PIN_LOW);
+ i+ P/ r& ^1 c( Q Task_sleep(1000); \' p0 E+ p' z3 n$ d8 k
3 G8 a' \+ l: H- Y3 v0 h
/*Set the AD7606_PAR_CONVST to output mode*/; q5 b q8 }" N8 I1 b8 M
GPIODirModeSet(SOC_GPIO_0_REGS, AD7606_PAR_CONVST, GPIO_DIR_OUTPUT);
, _7 l5 }2 w \& D8 G GPIOPinWrite(SOC_GPIO_0_REGS, AD7606_PAR_CONVST, GPIO_PIN_LOW);) M/ {7 G$ n. }, T# D5 s
& D4 q4 p$ l1 l! J8 C N- n8 v GPIODirModeSet(SOC_GPIO_0_REGS, AD7606_PAR_RD, GPIO_DIR_OUTPUT);7 _9 @9 L) t- w$ |) r& h
GPIOPinWrite(SOC_GPIO_0_REGS, AD7606_PAR_RD, GPIO_PIN_HIGH);
) i" ]1 {5 c; ?# m6 [8 u" Z8 o! ?% m( z
}- l/ v7 N" F9 k7 I% w' z8 i0 n
9 v3 L" L- `! \8 k5 @
7 G- n: C& M( l$ Y9 K& Rstatic void ad7606_busy_hwi(UArg ad_addr) {$ m* B8 |; b- Y! C
# v2 e& N) R$ i2 e' y$ v! Y
3 P8 D" N% s+ ? /* Disable the interrupts for pins of bank AD7606_PAR_BUSY in GPIO.*/3 M' [( c9 q' Z& @+ d
GPIOBankIntDisable(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_GPIO_BANK); //用仿真器debug,发现程序能进入这里。" _0 V; T; b. C" A9 r5 s1 M" e
, V! u+ m) c5 k9 m6 v" A2 d if(GPIOPinIntStatus(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_V1) == GPIO_INT_PEND)" N, R( R& X4 `# L: R- }) `# l9 ^
{
$ p. k" e9 M! h+ m, C GPIOPinIntClear(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_V1); //问题是:用仿真器debug,发现程序不能进入这里。1 R% s6 Q- n- O3 i3 m$ T$ r. j- l
cs_addr = SOC_EMIFA_CS5_ADDR ;
# B( x( j! K# I0 c$ G+ L3 z internal = 0 ;% t) {2 o& L2 l: B$ o/ ~- A
int_flag[0] = 1 ;
5 l9 W2 c) `8 Q Z+ `7 C }
& p, R2 E" |( H0 ~0 c% s if(GPIOPinIntStatus(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_V2) == GPIO_INT_PEND)
9 |' d9 P6 B/ ] {. r$ X o, u$ t' M; A! I
GPIOPinIntClear(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_V2); //问题是:用仿真器debug,发现程序不能进入这里。
( p+ v4 h2 w$ y* a2 M0 m7 H cs_addr = SOC_EMIFA_CS4_ADDR ;# A: w) n+ P8 X9 L
internal = 6 ;
4 k( B; k2 A; k v" k int_flag[1] = 1 ;& i( B( k/ _: J* D2 d& \2 s
}* C- w! Q1 {& S) s
if(GPIOPinIntStatus(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_C) == GPIO_INT_PEND)2 T( A5 { p4 E& _& e! d# @
{
8 g, ~( `# [, L. |0 w GPIOPinIntClear(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_C); //问题是:用仿真器debug,发现程序不能进入这里。
, O9 W; V' {4 i- C. n cs_addr = SOC_EMIFA_CS2_ADDR ;
) b: ]# F3 B/ ]$ ]2 e internal = 12 ;2 \1 d1 c: V4 e3 U! k) |
int_flag[2] = 1 ;
0 S7 w& p$ ]4 F' k }
9 Z9 R. F2 F1 p) C! V6 r+ P & L* Q! e1 ? y" k6 ^6 ^
GPIOPinWrite(SOC_GPIO_0_REGS, AD7606_PAR_CONVST, GPIO_PIN_LOW);' ^) q! B# T: k3 T4 W
3 o2 g* d; m7 ^; V1 k
GPIOBankIntEnable(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_GPIO_BANK);
+ Q6 C: y, G- c$ v: o}
' D7 i1 ^( ]3 r) D0 q4 H6 L+ r+ U [* p) H* K
|
|