|
您好。使用GPIO中断时,中断能进入ISR,但是不能区分具体的GPIO端口。程序如下:( D4 ?1 P# t3 t' ^ h
#define AD7606_PAR_BUSY_GPIO_BANK 5
7 j! }* \( A/ i* l#define AD7606_PAR_BUSY_GPIO_BANK_INT SYS_INT_GPIO_B5INT! i- [9 V) b4 U, u
) p8 q5 Y) N( v" j# a2 N h, W
#define AD7606_PAR_BUSY_V1 GPIO_TO_PIN(5, 11) //BANK5的中断口5.117 B& `+ Y% k: g$ e# g3 L, g
#define AD7606_PAR_BUSY_V2 GPIO_TO_PIN(5, 9) //BANK5的中断口5.9
. E- Q+ V% Q/ F& n4 H#define AD7606_PAR_BUSY_C GPIO_TO_PIN(5, 5) //BANK5的中断口5.53 N6 W' }0 v) j. l N) F
#define AD7606_PAR_BUSY GPIO_TO_PIN(5, 4)1 V+ c1 i( p* o" c1 X
# a* B; B9 h. U3 q' ~7 g
#define AD7606_PAR_CONVST GPIO_TO_PIN(5, 1)
; ~1 ^0 C1 I+ Y$ x5 N7 f#define AD7606_PAR_RD GPIO_TO_PIN(5, 2)
7 l9 M0 o( Q2 `% }0 Y#define AD7606_PAR_RESET GPIO_TO_PIN(5, 0)
* U. |4 ~6 y( F5 g6 m
4 G" A m* S0 J; k U+ W- Y5 d. m' D9 O) f
0 x1 h% T* @3 T) Z- ustatic void ad7606_irq_setup(ad7606 *ad) {- D% V' u; } l& i- F
Hwi_Params hwiParams;% ?/ f. y+ E+ S# w' w: ^
Hwi_Handle myHwi;
& l# J$ ~- k0 }* I; u* d Error_Block eb;+ X. i# y/ P1 ^, \& ]
9 J% x( P# @ r# X8 J: A4 T/ O @/ J
Error_init(&eb);
8 ~$ W$ \7 O$ c& J, W Hwi_Params_init(&hwiParams);) `4 Q" d, F0 O# ?9 O# X2 \
hwiParams.arg = (unsigned int)ad;( t7 [4 G9 d2 n
hwiParams.enableInt = FALSE;6 f# v% m* y# A6 C
hwiParams.eventId = SYS_INT_GPIO_B5INT;# n3 R3 b: t) _( c& |
hwiParams.priority = 4;: u ^& u% v; d
myHwi = Hwi_create(8, ad7606_busy_hwi, &hwiParams, &eb); //注册BANK5中断处理函数
6 i k; I/ m+ x3 l if (myHwi == NULL) & C" F8 `" q; v1 w9 y' ~
LOG_FATAL("failed to create hwi"); A9 P3 G. s/ m6 M
; F6 @; k8 Z) l2 l8 u% ]+ Q% P- G$ V
/* enable both interrupts */
" y, n- _" f } Hwi_enableInterrupt(ad->irq_event);
$ R+ e, {# }, o) O8 ?* n/ W# u}7 }4 |2 b! { e, y$ N6 ]# j- w
# }4 K: i. x4 W X9 u$ s$ N& u
- G! X% \% H1 m( B& W; H+ Bstatic void ad7606_gpio_pinmux_setup(ad7606 *ad) {
. X/ G% ]/ x/ U$ Q" o W4 D6 c1 n5 R volatile unsigned int savePinMux = 0;
+ H# z, K, y9 W2 ~ //初始化5.11、5.9 、 5.5为GPIO口
& e5 E8 J0 O, ?1 ]) Q- {2 I savePinMux = HWREG(SOC_SYSCFG_0_REGS + SYSCFG0_PINMUX(11)) & (~(SYSCFG_PINMUX11_PINMUX11_27_24 | SYSCFG_PINMUX11_PINMUX11_19_16));
; l4 O* M- r3 r1 m, I: c! r3 o$ E% F% j& f1 u" C; d6 Z5 k7 L
HWREG(SOC_SYSCFG_0_REGS + SYSCFG0_PINMUX(11)) = (PINMUX11_BUSY_V1_ENABLE | PINMUX11_BUSY_V2_ENABLE | savePinMux);+ H7 F" n- m: S
, P+ ~- _0 q$ V9 ?' g
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));9 x! r. `* V$ }6 m! ?
: [5 w& m4 b% g: m. B
HWREG(SOC_SYSCFG_0_REGS + SYSCFG0_PINMUX(12)) = (PINMUX12_RESET_ENABLE | PINMUX12_CONVST_ENABLE | PINMUX12_RD_ENABLE | PINMUX12_BUSY_C_ENABLE | savePinMux);+ L( b8 e! `* D& K/ W
1 M, d5 v0 ]) X1 d( _, d}0 P, V+ F7 `8 Y% y' `, w
8 `5 l5 J8 ?8 C7 Y* o9 U
5 x) c! C0 P! } A( V* s2 A+ g+ estatic void ad7606_gpio_setup(ad7606 *ad) {
/ e% G# N8 r+ e" o, V0 _ /*Set the AD7606_PAR_BUSY to the input mode*/7 l# y7 Z1 H8 M& g( r
//初始化5.11、5.9 、 5.5为中断口
/ N3 y+ R& P @2 q GPIODirModeSet(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_V1, GPIO_DIR_INPUT);
# ^( \# v6 I4 x, ` GPIODirModeSet(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_V2, GPIO_DIR_INPUT);
; {8 M3 a+ c, g. L: O( k GPIODirModeSet(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_C, GPIO_DIR_INPUT);
9 M5 V+ m6 |, b! e //GPIODirModeSet(SOC_GPIO_0_REGS, AD7606_PAR_BUSY, GPIO_DIR_INPUT);
& \; |& M; \* m6 I7 D/ n8 D4 C /*Set the AD7606_PAR_BUSY to the Falling Edge Interrupt*/. L7 `( {& R" k, |1 j; ~' E
GPIOIntTypeSet(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_V1, GPIO_INT_TYPE_FALLEDGE);3 }5 z U1 H: }* L; G
GPIOIntTypeSet(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_V2, GPIO_INT_TYPE_FALLEDGE);
+ A9 ^ }" @* k. l* g5 [, D$ C GPIOIntTypeSet(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_C, GPIO_INT_TYPE_FALLEDGE);
$ j2 T, y# j! s( ^ \ //GPIOIntTypeSet(SOC_GPIO_0_REGS, AD7606_PAR_BUSY, GPIO_INT_TYPE_FALLEDGE);. w! r- Z0 r! u+ n/ z, D, O. F, i- w
/*The interrupt setting allows AD7606_PAR_BUSY_GPIO_BANK*/; G" x! E8 M- L9 R/ A
GPIOBankIntEnable(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_GPIO_BANK);: U- H: I+ b3 z* n5 n5 f) r2 ~5 T
: [1 n0 c1 L" c GPIODirModeSet(SOC_GPIO_0_REGS, AD7606_PAR_RESET, GPIO_DIR_OUTPUT);
S- U% t) c: W3 J2 p GPIOPinWrite(SOC_GPIO_0_REGS, AD7606_PAR_RESET, GPIO_PIN_HIGH);9 H6 \( u, F! D* M
Task_sleep(1000);
. x- } p# Y6 c% V# C; ~& m g GPIOPinWrite(SOC_GPIO_0_REGS, AD7606_PAR_RESET, GPIO_PIN_LOW);) N2 A; z8 W+ z
Task_sleep(1000);
. k7 A ~, g6 Y6 ?
* U! A' D. ]% Y* o b/ X% R" U /*Set the AD7606_PAR_CONVST to output mode*/( ?+ N* t. `2 }; F6 E, _/ L( }5 d5 D
GPIODirModeSet(SOC_GPIO_0_REGS, AD7606_PAR_CONVST, GPIO_DIR_OUTPUT);
* @) x. {8 e% J% k3 w! E GPIOPinWrite(SOC_GPIO_0_REGS, AD7606_PAR_CONVST, GPIO_PIN_LOW);
- P6 M1 t) s" F7 |' {1 U* S0 a7 p9 V0 l5 [1 X2 }: ?
GPIODirModeSet(SOC_GPIO_0_REGS, AD7606_PAR_RD, GPIO_DIR_OUTPUT);
, X5 `7 a& O1 i" R; p3 A7 a8 w GPIOPinWrite(SOC_GPIO_0_REGS, AD7606_PAR_RD, GPIO_PIN_HIGH);
# U. l+ @9 n4 x# V% W" k2 u* h. }2 B( D* Q- X, z' X+ C
}# }% n, s z, t8 k
" [9 H: M! ?+ q2 M% @8 r+ D( t0 R2 I* H; W) v9 g* J1 z) j
static void ad7606_busy_hwi(UArg ad_addr) {
7 F5 Y! X0 I' G$ E" h B4 Q; J
( f4 \5 q( P. H/ r' r! a9 f( P; r- i( [. u
/* Disable the interrupts for pins of bank AD7606_PAR_BUSY in GPIO.*/
4 ?# S4 K8 H' w( t$ z0 j8 [1 d8 D GPIOBankIntDisable(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_GPIO_BANK); //用仿真器debug,发现程序能进入这里。
3 X. V5 F9 w4 T) n6 E+ u k. x" T0 [; t' J% ?
if(GPIOPinIntStatus(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_V1) == GPIO_INT_PEND)
; A0 v) p% S/ Z1 p {4 I4 c: D: r+ B. I8 z
GPIOPinIntClear(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_V1); //问题是:用仿真器debug,发现程序不能进入这里。
3 v; d; R! {( U: P, s cs_addr = SOC_EMIFA_CS5_ADDR ;
" l- ~( O- F, H# `% k W, H0 r internal = 0 ;% Y6 w& S v5 S
int_flag[0] = 1 ;) H5 u/ b( g$ F- L% R, `$ q" B
}6 B$ S# z- W8 u5 x1 }& U
if(GPIOPinIntStatus(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_V2) == GPIO_INT_PEND); k4 C5 L8 S6 W" T2 e6 a, m
{- T9 P1 Z9 k- W# g
GPIOPinIntClear(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_V2); //问题是:用仿真器debug,发现程序不能进入这里。
6 z7 P. y1 v# H- { cs_addr = SOC_EMIFA_CS4_ADDR ;: @$ U- Y$ ]. w( p* ]- u
internal = 6 ;
4 G+ J, P9 D; t$ `5 m: j& } int_flag[1] = 1 ;
5 s7 \' J( I& [: a* ^ G. a! K }- ~0 G/ W' T$ q5 l/ @
if(GPIOPinIntStatus(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_C) == GPIO_INT_PEND)
' }/ p! q, s: }1 M q, |2 T( s8 } {) _/ s& x- h" _. _& v
GPIOPinIntClear(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_C); //问题是:用仿真器debug,发现程序不能进入这里。& ]* Q5 S E( `6 O
cs_addr = SOC_EMIFA_CS2_ADDR ; `6 m! y: F4 i/ X5 b. b
internal = 12 ;
7 D$ H. S% h9 @: i: Q9 l6 ?& \ I2 j int_flag[2] = 1 ;; Z. C0 O# ~- w" a
}
6 J. U/ f7 |/ e- N + [5 m" W1 r( X, B& N7 R" c* ^/ H
GPIOPinWrite(SOC_GPIO_0_REGS, AD7606_PAR_CONVST, GPIO_PIN_LOW);
! R: R3 q5 ^5 E: D% @2 } 4 P$ F t$ o$ f& [; L# D2 k, }- A- Y
GPIOBankIntEnable(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_GPIO_BANK);- T- b3 q1 {2 W+ ~1 s6 R2 ]
}0 H& C- f) W! c3 F" X z0 ]
1 ^, F* {! _$ Z* D H |
|