|
您好。使用GPIO中断时,中断能进入ISR,但是不能区分具体的GPIO端口。程序如下:& z9 i& @) [2 h1 |1 ]' x
#define AD7606_PAR_BUSY_GPIO_BANK 5
5 w0 V% l' H8 e( C3 @2 L: L# M#define AD7606_PAR_BUSY_GPIO_BANK_INT SYS_INT_GPIO_B5INT
3 K3 R* t* W( \; ?. d- L! f- k6 N* N8 L# t$ }- G- N' W
#define AD7606_PAR_BUSY_V1 GPIO_TO_PIN(5, 11) //BANK5的中断口5.11
/ u# {* D9 F- f/ j#define AD7606_PAR_BUSY_V2 GPIO_TO_PIN(5, 9) //BANK5的中断口5.9
) Y" O: H" M6 V; v7 z#define AD7606_PAR_BUSY_C GPIO_TO_PIN(5, 5) //BANK5的中断口5.5
x8 n* o, n1 N. {! Y#define AD7606_PAR_BUSY GPIO_TO_PIN(5, 4)
9 c U, L2 x0 m5 ]1 @
{5 p4 D3 I/ _; C( _0 ]5 P#define AD7606_PAR_CONVST GPIO_TO_PIN(5, 1): H8 H- h+ p0 \, L( y
#define AD7606_PAR_RD GPIO_TO_PIN(5, 2)5 ]; |2 n3 Z8 C$ a0 t- T
#define AD7606_PAR_RESET GPIO_TO_PIN(5, 0)
! y3 ~* T' D+ y. X# Q& }6 p8 |" V8 E/ b! M1 Q9 [
. ~. {3 |% C" j9 R- P! p5 J" }1 \1 r% ? Z$ h
static void ad7606_irq_setup(ad7606 *ad) {" J. F# s; r# E) _' G
Hwi_Params hwiParams;
8 ]" ^$ b- a+ Z- X& S( @. ^% N Hwi_Handle myHwi;# s! @: n! O5 w8 e* i" \
Error_Block eb;
& [7 @* A# p" N) y, O$ f' [
& q P3 Q$ \9 L' F+ p" p9 s Error_init(&eb);; g- y8 f/ h) E
Hwi_Params_init(&hwiParams);3 H# v- U6 Q# L! @# Z
hwiParams.arg = (unsigned int)ad;+ j) W5 \" K+ J' k' S
hwiParams.enableInt = FALSE;1 z7 T( Z/ a; H) L. |1 e) F- ]" m
hwiParams.eventId = SYS_INT_GPIO_B5INT;
l7 P' v# j$ k, d, D7 i hwiParams.priority = 4;, O, B" C" i- F9 i6 j
myHwi = Hwi_create(8, ad7606_busy_hwi, &hwiParams, &eb); //注册BANK5中断处理函数7 X7 c; v$ |9 @7 ~1 [* ~0 D( f
if (myHwi == NULL)
- H6 ~2 z( w+ g9 _3 C LOG_FATAL("failed to create hwi");
4 {9 k9 o+ [# l# F8 T
) v# s( D c1 M- n, U, } p* Y5 g /* enable both interrupts */2 W* k3 z9 S3 i: U. |7 x
Hwi_enableInterrupt(ad->irq_event);5 `+ o( X; h$ {( O* B$ n
}
; M a# A5 W7 t, F7 P4 K/ i: h' a4 o- g
8 ]- H5 G v0 G8 e! Z
static void ad7606_gpio_pinmux_setup(ad7606 *ad) {! j( Q I/ u' y$ y
volatile unsigned int savePinMux = 0;
- Q% }$ e- C t5 U, Y* U //初始化5.11、5.9 、 5.5为GPIO口, ?: B# W) m! |# g4 N: ]; F8 ?
savePinMux = HWREG(SOC_SYSCFG_0_REGS + SYSCFG0_PINMUX(11)) & (~(SYSCFG_PINMUX11_PINMUX11_27_24 | SYSCFG_PINMUX11_PINMUX11_19_16));
/ L0 Q3 k- L0 [8 m) B8 t9 p6 a" s6 Q- ^
HWREG(SOC_SYSCFG_0_REGS + SYSCFG0_PINMUX(11)) = (PINMUX11_BUSY_V1_ENABLE | PINMUX11_BUSY_V2_ENABLE | savePinMux);8 ]6 R, f+ o3 D" L, p3 t5 @$ s6 x; S% [2 ~
% j+ g6 D" Y+ r4 X 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 G# Y8 r; \% @8 G! r0 L; ]6 b/ v i9 z1 B
HWREG(SOC_SYSCFG_0_REGS + SYSCFG0_PINMUX(12)) = (PINMUX12_RESET_ENABLE | PINMUX12_CONVST_ENABLE | PINMUX12_RD_ENABLE | PINMUX12_BUSY_C_ENABLE | savePinMux);( p2 Q1 s. s, J4 Q
" S) |% Q! C* n; k2 X( p' G1 w
}
. G- Y( u5 D/ O. B5 y- p4 e) O5 p$ V3 N
3 J9 {+ a1 I/ s2 W$ a, n0 pstatic void ad7606_gpio_setup(ad7606 *ad) { j: S8 E0 y# C) t m
/*Set the AD7606_PAR_BUSY to the input mode*/
0 m8 K4 n8 p9 z0 C! ?. g4 b" ? //初始化5.11、5.9 、 5.5为中断口! x1 P0 J, E* ?4 O- b
GPIODirModeSet(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_V1, GPIO_DIR_INPUT);$ I. o7 W/ V( M6 D! c" P9 b& m
GPIODirModeSet(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_V2, GPIO_DIR_INPUT);
. E X% ?( \9 n" Y7 ^ GPIODirModeSet(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_C, GPIO_DIR_INPUT); l" q% @8 |$ M4 s& F
//GPIODirModeSet(SOC_GPIO_0_REGS, AD7606_PAR_BUSY, GPIO_DIR_INPUT);* g5 [8 [8 p e4 }
/*Set the AD7606_PAR_BUSY to the Falling Edge Interrupt*/
1 M9 ^: E4 ?8 r5 h: \, o GPIOIntTypeSet(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_V1, GPIO_INT_TYPE_FALLEDGE);3 x' J. t9 x! Q; c5 g5 J. V
GPIOIntTypeSet(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_V2, GPIO_INT_TYPE_FALLEDGE);
! o$ V/ J5 Z. I" }4 x GPIOIntTypeSet(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_C, GPIO_INT_TYPE_FALLEDGE);8 b1 X. i" E- {4 A2 m
//GPIOIntTypeSet(SOC_GPIO_0_REGS, AD7606_PAR_BUSY, GPIO_INT_TYPE_FALLEDGE);" q6 w. A4 C( {3 L3 k- X3 Q
/*The interrupt setting allows AD7606_PAR_BUSY_GPIO_BANK*/
% l$ ]& [' }2 `) i4 j v! p2 | GPIOBankIntEnable(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_GPIO_BANK);
1 N' Q# f& r r6 _4 o3 v) F2 m" ~1 o B* B5 k7 q7 T
GPIODirModeSet(SOC_GPIO_0_REGS, AD7606_PAR_RESET, GPIO_DIR_OUTPUT);4 y% d1 O. \0 r% @# c, V
GPIOPinWrite(SOC_GPIO_0_REGS, AD7606_PAR_RESET, GPIO_PIN_HIGH);) x; S ? j, I" p) A3 D
Task_sleep(1000);
& }4 L, p8 @0 q# j GPIOPinWrite(SOC_GPIO_0_REGS, AD7606_PAR_RESET, GPIO_PIN_LOW);& @" V+ H" H, m( {# t8 A u+ s
Task_sleep(1000);, F8 ^6 \" ]+ |* P1 M/ `! d7 Y
/ F e( y2 N7 p! S* I8 [ /*Set the AD7606_PAR_CONVST to output mode*/! V* w; Q: J( B* z/ |
GPIODirModeSet(SOC_GPIO_0_REGS, AD7606_PAR_CONVST, GPIO_DIR_OUTPUT);
) b7 o2 M8 l. ?% `- J GPIOPinWrite(SOC_GPIO_0_REGS, AD7606_PAR_CONVST, GPIO_PIN_LOW);
4 ]. Z, U& |/ n4 V$ y$ s1 W6 u& J: i9 G, M
GPIODirModeSet(SOC_GPIO_0_REGS, AD7606_PAR_RD, GPIO_DIR_OUTPUT);; g0 M; C& J8 y2 G
GPIOPinWrite(SOC_GPIO_0_REGS, AD7606_PAR_RD, GPIO_PIN_HIGH);
% X3 x+ ?1 G6 U0 i6 X3 t- e. W
- f% a9 ^& n4 ~. ~* F1 d7 A0 m2 G5 J+ V}
* ]9 M" H2 Y- E% o2 o: T/ J& s, v. }3 Z0 M
+ g. l2 K% q h9 v% O) Estatic void ad7606_busy_hwi(UArg ad_addr) {5 m+ j- ?7 X: T" l9 R9 J
0 T! @6 I" w7 s
0 M0 Y; ^# K# j& H: g. \) F /* Disable the interrupts for pins of bank AD7606_PAR_BUSY in GPIO.*/
" Y5 u' v; e. T! B; G GPIOBankIntDisable(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_GPIO_BANK); //用仿真器debug,发现程序能进入这里。+ O W- [1 v2 A6 o
8 b& q" U5 d0 n* o& L! }6 U
if(GPIOPinIntStatus(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_V1) == GPIO_INT_PEND). n. z- ?7 K+ N3 T, `
{
6 s* p L0 _# H4 \ GPIOPinIntClear(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_V1); //问题是:用仿真器debug,发现程序不能进入这里。
& k: q% v) R0 m* \9 v" ? cs_addr = SOC_EMIFA_CS5_ADDR ;
' }8 u4 x. i/ b& [' r$ m internal = 0 ; o5 Y, L; {1 r
int_flag[0] = 1 ;
8 @' A2 ?; G3 r9 C }
2 A3 V v+ Z* w) m$ m& D4 E1 u if(GPIOPinIntStatus(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_V2) == GPIO_INT_PEND); h- D: ?5 c- d$ K" R$ L
{. o$ g. k9 K) [1 @4 U' u* d! G
GPIOPinIntClear(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_V2); //问题是:用仿真器debug,发现程序不能进入这里。0 d( u3 {2 c& Q9 b
cs_addr = SOC_EMIFA_CS4_ADDR ;
& J6 K& g" f8 j5 d7 w( j5 n internal = 6 ;
% o! V/ D% L2 R a9 \ int_flag[1] = 1 ;% L* h& Q [/ R6 Z+ u1 A
}+ f# Z( v5 g- D
if(GPIOPinIntStatus(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_C) == GPIO_INT_PEND)! S% i/ C! \/ y' z: t! Z1 t% i
{
0 z* c9 ]6 ^$ E2 l- a GPIOPinIntClear(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_C); //问题是:用仿真器debug,发现程序不能进入这里。, \+ I8 u5 S# ]: m
cs_addr = SOC_EMIFA_CS2_ADDR ;; ]) x% k! I8 @" g& n
internal = 12 ;6 i: j/ P) Y/ q
int_flag[2] = 1 ;
- q% W1 k# E$ K/ n( j }; _0 E% \1 n$ Q, p
- G0 j8 ?9 {9 P) X4 w. g3 ` n GPIOPinWrite(SOC_GPIO_0_REGS, AD7606_PAR_CONVST, GPIO_PIN_LOW);. \4 ^5 s! y& z; [6 q- T
6 [7 H5 a4 ~+ C2 `
GPIOBankIntEnable(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_GPIO_BANK);
$ Z. f4 f! t Q' w) B1 W}
8 J5 \( B g N
8 R; H0 B5 T/ {( y: @- L9 |6 ^. H8 H" t: b/ n5 S: }
7 m+ G# Y5 O8 v* V a; J8 J% ^
0 t8 `: W& Q/ X5 f7 ^ @ |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
|