|
您好。使用GPIO中断时,中断能进入ISR,但是不能区分具体的GPIO端口。程序如下:( R( [- Y) M# o3 d4 a" q
#define AD7606_PAR_BUSY_GPIO_BANK 5
( v( d5 X9 K5 w- {#define AD7606_PAR_BUSY_GPIO_BANK_INT SYS_INT_GPIO_B5INT# i1 A A- A( B2 e) F( G
) o7 W; U0 K) |6 A" ?$ u% h#define AD7606_PAR_BUSY_V1 GPIO_TO_PIN(5, 11) //BANK5的中断口5.11
) U, p& q' D* {8 J' U- n, H- t3 ?4 h#define AD7606_PAR_BUSY_V2 GPIO_TO_PIN(5, 9) //BANK5的中断口5.9
0 L+ [3 _& p v5 _2 {0 U0 g7 E#define AD7606_PAR_BUSY_C GPIO_TO_PIN(5, 5) //BANK5的中断口5.5
" N+ R' b( x0 ?4 h1 [#define AD7606_PAR_BUSY GPIO_TO_PIN(5, 4)
u$ S& x1 Y. a/ S7 u) U2 X1 h' s2 }: c7 b! Y. F: ?
#define AD7606_PAR_CONVST GPIO_TO_PIN(5, 1)
6 O1 C/ f6 E! f+ A9 G3 x#define AD7606_PAR_RD GPIO_TO_PIN(5, 2)7 q) v, x- |/ Z! a/ I
#define AD7606_PAR_RESET GPIO_TO_PIN(5, 0)
/ m" o( e+ R; ?
9 y3 e! B- U4 f. W/ u/ ?1 _/ z# N! F; j- ^5 s4 R
/ G# H: M/ x( O: K; ]static void ad7606_irq_setup(ad7606 *ad) {
+ D/ p5 G9 {; {, A7 B- ?" t6 r- I Hwi_Params hwiParams;5 z3 Q. _0 F/ L0 q
Hwi_Handle myHwi;: d1 o+ S- c3 J. H( }1 F
Error_Block eb;
9 @- S# _" Y! f: k3 T' ~' O8 k/ f% K9 F
Error_init(&eb);" d+ P" u9 M( ^3 p2 x, ?& u% z
Hwi_Params_init(&hwiParams);
: G- U$ R0 p0 W- h9 k( P5 d! n. E hwiParams.arg = (unsigned int)ad;
9 R) S! h$ E3 A) A" I8 { hwiParams.enableInt = FALSE;/ V1 B u2 @- q3 L/ T" h
hwiParams.eventId = SYS_INT_GPIO_B5INT;) ~ w( R0 ^2 T S7 O
hwiParams.priority = 4;
* P' e7 s2 h: J( n8 N myHwi = Hwi_create(8, ad7606_busy_hwi, &hwiParams, &eb); //注册BANK5中断处理函数% ?5 v% U, ^& S; [. Y' ]' D" a
if (myHwi == NULL) ) O5 n# L1 _( z, N- B
LOG_FATAL("failed to create hwi");
( D2 C& v+ O% }3 o/ v: j3 `+ y" }4 H, o% s6 p% J
/* enable both interrupts */
# m6 {" i+ Y H. u Hwi_enableInterrupt(ad->irq_event);
! i( y* S. |; S1 C' z+ a4 q}
( z4 j/ U5 R; ] r, y
0 K6 p* |/ Y; K8 j8 v2 \. ?/ j8 S# r
static void ad7606_gpio_pinmux_setup(ad7606 *ad) { W7 T3 o& ?) ]/ G* _' g- a- @* l% k8 a. H
volatile unsigned int savePinMux = 0;- z; q, ]( W8 p
//初始化5.11、5.9 、 5.5为GPIO口# d% i$ g8 n/ G, `9 e: H c% u0 i
savePinMux = HWREG(SOC_SYSCFG_0_REGS + SYSCFG0_PINMUX(11)) & (~(SYSCFG_PINMUX11_PINMUX11_27_24 | SYSCFG_PINMUX11_PINMUX11_19_16));5 e5 T! ?4 @8 k
* ?+ _5 f6 Q& \ HWREG(SOC_SYSCFG_0_REGS + SYSCFG0_PINMUX(11)) = (PINMUX11_BUSY_V1_ENABLE | PINMUX11_BUSY_V2_ENABLE | savePinMux);
4 \4 x4 D( x/ t3 P
8 n# S2 b# e3 ?# m* J' \+ \ z5 S6 y 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));4 P+ }" t& A2 ~
" }' Y+ @& x6 l) x: _5 `$ V X3 d HWREG(SOC_SYSCFG_0_REGS + SYSCFG0_PINMUX(12)) = (PINMUX12_RESET_ENABLE | PINMUX12_CONVST_ENABLE | PINMUX12_RD_ENABLE | PINMUX12_BUSY_C_ENABLE | savePinMux);
* Z; {, }& Y: O3 R/ M" u% E ]; r0 c) [
}
! y, T2 l3 _7 {: \$ @. s z( d7 l
! X# [" q _% u; t/ ?+ Mstatic void ad7606_gpio_setup(ad7606 *ad) {
# R, [# C/ @. B9 M3 C7 Z /*Set the AD7606_PAR_BUSY to the input mode*/
9 J& B; }! o+ k" h9 h2 p //初始化5.11、5.9 、 5.5为中断口% A# i$ X/ W8 q/ I# I
GPIODirModeSet(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_V1, GPIO_DIR_INPUT);
Y$ w( ~7 m" E GPIODirModeSet(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_V2, GPIO_DIR_INPUT);" L4 Q; |' y Z. \! n g7 A: B
GPIODirModeSet(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_C, GPIO_DIR_INPUT);
* p$ t X8 |/ D' y3 W# W! t //GPIODirModeSet(SOC_GPIO_0_REGS, AD7606_PAR_BUSY, GPIO_DIR_INPUT);( i/ v9 V6 z& ]2 |8 Q6 K$ m
/*Set the AD7606_PAR_BUSY to the Falling Edge Interrupt*/2 ]1 t+ C/ e8 o/ N
GPIOIntTypeSet(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_V1, GPIO_INT_TYPE_FALLEDGE);
1 d! n; z- u, _2 C GPIOIntTypeSet(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_V2, GPIO_INT_TYPE_FALLEDGE);
6 d# }! C8 o' K8 |) T3 R$ } GPIOIntTypeSet(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_C, GPIO_INT_TYPE_FALLEDGE);0 E) x8 w$ t" X4 n0 S! U. T
//GPIOIntTypeSet(SOC_GPIO_0_REGS, AD7606_PAR_BUSY, GPIO_INT_TYPE_FALLEDGE);0 j5 ^% A% K& z9 `! L# f
/*The interrupt setting allows AD7606_PAR_BUSY_GPIO_BANK*/
" A+ x& G- j$ Y! Y# | W. C' L% K GPIOBankIntEnable(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_GPIO_BANK);/ R2 `/ Z, C5 U
, `4 [* J- l/ Q8 k1 C4 w" m7 ]
GPIODirModeSet(SOC_GPIO_0_REGS, AD7606_PAR_RESET, GPIO_DIR_OUTPUT);
8 f0 A/ M8 L ]& ]( H! ` GPIOPinWrite(SOC_GPIO_0_REGS, AD7606_PAR_RESET, GPIO_PIN_HIGH);* T& E- T( m# n
Task_sleep(1000);
( k7 s! B: L: B2 p* i W GPIOPinWrite(SOC_GPIO_0_REGS, AD7606_PAR_RESET, GPIO_PIN_LOW);5 E0 W* m$ }: H/ R. S! ?
Task_sleep(1000);. }. ?4 o; v" }+ N1 a
3 o& u& i3 g+ w2 Z7 L( F0 W: b
/*Set the AD7606_PAR_CONVST to output mode*/8 @! G; n9 r& u c+ |! J: x
GPIODirModeSet(SOC_GPIO_0_REGS, AD7606_PAR_CONVST, GPIO_DIR_OUTPUT);
7 J; ?, m# x, K, e0 D u GPIOPinWrite(SOC_GPIO_0_REGS, AD7606_PAR_CONVST, GPIO_PIN_LOW); H7 ~7 P3 Q$ H0 _" s
- ^- A5 P. d0 f% d7 |
GPIODirModeSet(SOC_GPIO_0_REGS, AD7606_PAR_RD, GPIO_DIR_OUTPUT); f& D: x$ I. y I
GPIOPinWrite(SOC_GPIO_0_REGS, AD7606_PAR_RD, GPIO_PIN_HIGH);
. |7 U) _ }+ r& C- L3 o* a2 D" ]1 q
}/ x8 q$ d: |- L8 s9 b Y
" b+ i+ ~1 o5 b1 O" d- e0 ?
% W% W* _$ n+ z: m& P- fstatic void ad7606_busy_hwi(UArg ad_addr) {
- t5 e5 r4 l, x. ]( T- [' F0 \# N3 t$ p
1 w: G: @! d/ U# a( t
/* Disable the interrupts for pins of bank AD7606_PAR_BUSY in GPIO.*/
% [/ ~( r( ^& f. T: C- j GPIOBankIntDisable(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_GPIO_BANK); //用仿真器debug,发现程序能进入这里。
9 V( j' [) X$ G, U" C( t# [
- g: G8 n5 Q. U+ d. n9 X! z if(GPIOPinIntStatus(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_V1) == GPIO_INT_PEND)7 e6 P% r$ I& W- y
{
4 R. K7 n W/ F) W& `% Q GPIOPinIntClear(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_V1); //问题是:用仿真器debug,发现程序不能进入这里。3 |: J* y+ [5 E9 p
cs_addr = SOC_EMIFA_CS5_ADDR ;
2 f3 R* u% D6 T/ Y6 F0 J internal = 0 ;
|) q& `; A9 G$ X5 U% p5 U int_flag[0] = 1 ;$ j! ~, {! S: i
}: b9 `. z& N' p5 d
if(GPIOPinIntStatus(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_V2) == GPIO_INT_PEND)# a- p' s8 r/ T! j+ Q
{
( l$ p0 Y( g7 f( w! y( p- R GPIOPinIntClear(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_V2); //问题是:用仿真器debug,发现程序不能进入这里。
% h1 Y2 A/ V% a, G cs_addr = SOC_EMIFA_CS4_ADDR ;4 ?& V$ A- c- [5 s) I8 t
internal = 6 ;3 L" e$ x% u9 i x
int_flag[1] = 1 ;
^# N0 A: Y) m }
* }; H4 T) R! t; P9 Z if(GPIOPinIntStatus(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_C) == GPIO_INT_PEND)' b/ }0 l6 l7 W+ R+ Q
{0 w) {6 o" E' g u+ O
GPIOPinIntClear(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_C); //问题是:用仿真器debug,发现程序不能进入这里。( Q0 h+ [2 \3 T ? g
cs_addr = SOC_EMIFA_CS2_ADDR ;
! ~1 U9 n# M, O( Y* n+ h internal = 12 ;4 U$ n" a y4 b8 v
int_flag[2] = 1 ;
1 h& G8 @# l2 h) {+ R6 f J% y }2 M n' M! o6 Y6 z! q8 v
) }5 X% P& G6 K; A GPIOPinWrite(SOC_GPIO_0_REGS, AD7606_PAR_CONVST, GPIO_PIN_LOW);
& i# i v% O2 A8 s: x, w N, Q. x& O" c, {6 F$ d. l2 d
GPIOBankIntEnable(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_GPIO_BANK);
) l$ r: F4 L3 p7 q7 U' M, U7 N}
4 |6 t4 f4 r" p+ |2 w; k/ K1 b" R* [ _# e( R; B& C
|
|