|
您好。使用GPIO中断时,中断能进入ISR,但是不能区分具体的GPIO端口。程序如下:
5 J0 d/ A, f0 p9 W6 l* ?#define AD7606_PAR_BUSY_GPIO_BANK 5) q6 H2 m2 b/ y8 r$ c7 N6 T
#define AD7606_PAR_BUSY_GPIO_BANK_INT SYS_INT_GPIO_B5INT
& K- n" s& X3 A* S+ u/ i. ^. h1 e0 s( l6 }' U# H k
#define AD7606_PAR_BUSY_V1 GPIO_TO_PIN(5, 11) //BANK5的中断口5.11
7 t3 m% J7 d: ~& y( [! l7 |8 R#define AD7606_PAR_BUSY_V2 GPIO_TO_PIN(5, 9) //BANK5的中断口5.9
5 ]6 C/ ]! x1 W( J#define AD7606_PAR_BUSY_C GPIO_TO_PIN(5, 5) //BANK5的中断口5.55 p W1 q' I: L. t0 Z/ F' u! \
#define AD7606_PAR_BUSY GPIO_TO_PIN(5, 4)& \7 \* R1 X* @) b, e: D- C; r
9 {' |- f Q, i h* P$ g2 p) Z
#define AD7606_PAR_CONVST GPIO_TO_PIN(5, 1)
$ ?" @* }: v: u- @7 O9 g#define AD7606_PAR_RD GPIO_TO_PIN(5, 2)$ a5 K( v M8 A8 S. S, i! x2 R: o: b
#define AD7606_PAR_RESET GPIO_TO_PIN(5, 0)
6 V# I3 g1 W/ T; S* C& ?5 K6 [+ n6 Z
' H a4 p" s) g2 w6 A1 q2 }
6 [1 |+ Y0 v7 Y$ xstatic void ad7606_irq_setup(ad7606 *ad) {
- S5 D, h. q2 d4 q Hwi_Params hwiParams;+ `4 d# G9 o* B& O7 \
Hwi_Handle myHwi;
- U X0 d' @1 a" T& o. ?4 \9 \ Error_Block eb;. H2 K( \7 J/ ?9 i0 ]- w2 _* A
, s2 G' s# H# t$ ]7 C. z5 ^, U% i
Error_init(&eb);3 R5 m( ~) ^3 H4 b
Hwi_Params_init(&hwiParams);" @3 g+ \8 I" N8 ^ h0 }! E
hwiParams.arg = (unsigned int)ad; X& G7 d3 x" ~/ c4 r* o
hwiParams.enableInt = FALSE;
/ q/ P/ y% o+ @3 j) \/ h6 s hwiParams.eventId = SYS_INT_GPIO_B5INT;4 ?2 m% D8 Q" l9 I) U, ]9 P7 c
hwiParams.priority = 4;
( L- I& u' _1 T" |! ^5 Q% i myHwi = Hwi_create(8, ad7606_busy_hwi, &hwiParams, &eb); //注册BANK5中断处理函数% h' L3 W8 Y2 e2 g5 D
if (myHwi == NULL)
6 Y* `5 Q# @$ b, ^* }. @ LOG_FATAL("failed to create hwi");
! o5 V! Q" O+ ]5 t
9 `" G6 ?3 ]1 Z9 Q! T4 g5 V /* enable both interrupts */
1 b7 e2 J. d6 h( H* J" W; T2 g2 p Hwi_enableInterrupt(ad->irq_event);
9 e5 k. P& [. }) B! Q/ r/ \}: m9 ^3 N u2 ^. P2 C* ~- x
& W) U9 R- F8 ]3 y9 P4 P$ ~
, V) }5 s$ X2 U+ [. r* ~static void ad7606_gpio_pinmux_setup(ad7606 *ad) {
5 }+ D5 j8 K8 X4 j2 a5 t volatile unsigned int savePinMux = 0;# T. {# F; V# O+ @4 L
//初始化5.11、5.9 、 5.5为GPIO口
5 z6 ~ }& O; A" M% o savePinMux = HWREG(SOC_SYSCFG_0_REGS + SYSCFG0_PINMUX(11)) & (~(SYSCFG_PINMUX11_PINMUX11_27_24 | SYSCFG_PINMUX11_PINMUX11_19_16));
' e# C9 B! Z) o+ Y1 I( F
( E( X' L) Z& Q( u: s0 F% J) e HWREG(SOC_SYSCFG_0_REGS + SYSCFG0_PINMUX(11)) = (PINMUX11_BUSY_V1_ENABLE | PINMUX11_BUSY_V2_ENABLE | savePinMux);
1 @ E" Q( z2 F$ b
8 y9 y2 S1 y; _5 O% m( 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));
) O3 n1 e* z% [- C: Y; ^" }
- \8 h$ N( F8 f2 `2 ? HWREG(SOC_SYSCFG_0_REGS + SYSCFG0_PINMUX(12)) = (PINMUX12_RESET_ENABLE | PINMUX12_CONVST_ENABLE | PINMUX12_RD_ENABLE | PINMUX12_BUSY_C_ENABLE | savePinMux);% ]; p2 F4 W' `- L2 y/ j7 s
7 {+ b( ]5 y/ f% Q; Z% `6 R}
/ O! _4 ]0 H) w& F3 {& g$ A8 m9 S# n) C
; b' C0 J! B7 k$ }+ {- w1 M6 b- ^
static void ad7606_gpio_setup(ad7606 *ad) {6 N v$ d6 m6 q
/*Set the AD7606_PAR_BUSY to the input mode*/
% t' U" U3 J/ ~2 J# M) z //初始化5.11、5.9 、 5.5为中断口
! k, t2 u' B. x, `- w7 Q" m# E+ U6 I GPIODirModeSet(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_V1, GPIO_DIR_INPUT);
+ Q+ _; r5 p' D GPIODirModeSet(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_V2, GPIO_DIR_INPUT);
& x9 }$ s! ^) A0 Z, ]7 l GPIODirModeSet(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_C, GPIO_DIR_INPUT);3 s) O" W1 Y% c0 [
//GPIODirModeSet(SOC_GPIO_0_REGS, AD7606_PAR_BUSY, GPIO_DIR_INPUT);7 h+ {2 ~8 u& O" v9 n w
/*Set the AD7606_PAR_BUSY to the Falling Edge Interrupt*/
0 n7 O8 F7 [1 X; a. W. q GPIOIntTypeSet(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_V1, GPIO_INT_TYPE_FALLEDGE); U0 |. X0 R2 a. K7 c3 }) o
GPIOIntTypeSet(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_V2, GPIO_INT_TYPE_FALLEDGE);
5 z6 N( c3 W- h4 }! N2 @ GPIOIntTypeSet(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_C, GPIO_INT_TYPE_FALLEDGE);8 X6 M; C2 m9 h- N3 E& p
//GPIOIntTypeSet(SOC_GPIO_0_REGS, AD7606_PAR_BUSY, GPIO_INT_TYPE_FALLEDGE);
( D0 q* V/ ?. O3 a& _: E /*The interrupt setting allows AD7606_PAR_BUSY_GPIO_BANK*/
8 r" W. `# N! I6 C GPIOBankIntEnable(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_GPIO_BANK); S2 A" L y) N* b* }) H
' d* t w) h n GPIODirModeSet(SOC_GPIO_0_REGS, AD7606_PAR_RESET, GPIO_DIR_OUTPUT);; D" L2 y) [% W& o& |
GPIOPinWrite(SOC_GPIO_0_REGS, AD7606_PAR_RESET, GPIO_PIN_HIGH);7 O' i, X! R# Q. j: B, R
Task_sleep(1000);5 R- ? Q4 w4 P
GPIOPinWrite(SOC_GPIO_0_REGS, AD7606_PAR_RESET, GPIO_PIN_LOW);! v6 ]! y5 {7 d3 D
Task_sleep(1000);
8 \: G& ]4 \* n; c* B7 ~7 ~. p/ Q" b+ ^9 u8 y$ {! s D" D; I
/*Set the AD7606_PAR_CONVST to output mode*/1 f0 ~7 A; u. y4 D6 p3 }% k
GPIODirModeSet(SOC_GPIO_0_REGS, AD7606_PAR_CONVST, GPIO_DIR_OUTPUT);
4 i+ L& E" i( |2 Q! s/ s* B5 k GPIOPinWrite(SOC_GPIO_0_REGS, AD7606_PAR_CONVST, GPIO_PIN_LOW);
# P/ R: c* }+ V* M2 P* ], u. p2 F K; k7 {% R" C4 E
GPIODirModeSet(SOC_GPIO_0_REGS, AD7606_PAR_RD, GPIO_DIR_OUTPUT);
& C' n; g7 E8 _" j, |7 C GPIOPinWrite(SOC_GPIO_0_REGS, AD7606_PAR_RD, GPIO_PIN_HIGH);
5 \) x3 I9 T) Z x# }, M7 p0 |$ o( D; z0 I
}8 a: _0 ~5 D4 ]0 e& @
9 E/ z& ^ m5 {; d Q
! j8 M+ m# B( J( u5 M9 H
static void ad7606_busy_hwi(UArg ad_addr) {
& r& R$ \- c5 C% y" u. d- [: G
# m: h* g' m8 N# y5 B
2 o+ ^1 t, U/ @! K6 J /* Disable the interrupts for pins of bank AD7606_PAR_BUSY in GPIO.*/( z! t( ^( [! B( f6 n; `
GPIOBankIntDisable(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_GPIO_BANK); //用仿真器debug,发现程序能进入这里。3 _+ N- c5 F. x4 u4 v3 X9 i7 |- I$ d
8 [7 U1 u8 n: u0 b1 `7 x# d5 Y if(GPIOPinIntStatus(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_V1) == GPIO_INT_PEND)5 G4 e" m% B8 z1 T/ _, K: o2 g7 A
{
' u" V+ q: J+ p( I GPIOPinIntClear(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_V1); //问题是:用仿真器debug,发现程序不能进入这里。
5 R; K6 r& _( P- u+ D+ @! s) O cs_addr = SOC_EMIFA_CS5_ADDR ;5 |2 y( z; j g0 s; j
internal = 0 ;
; s$ V1 S* P9 A2 }2 a! ?; _3 ^ int_flag[0] = 1 ;
2 g2 n1 D2 F3 B) h8 u }. m" z- \; s% a/ J
if(GPIOPinIntStatus(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_V2) == GPIO_INT_PEND)
' Z" T- v: c' G7 @ {* b0 ^8 A5 a/ t1 _6 ~# f
GPIOPinIntClear(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_V2); //问题是:用仿真器debug,发现程序不能进入这里。9 m" o; S. g; _
cs_addr = SOC_EMIFA_CS4_ADDR ;
1 ~1 e% N7 k- c+ p! K- F internal = 6 ;8 D% e9 P# y8 L# g+ l8 b
int_flag[1] = 1 ;8 D- F1 O/ |, j: n7 c
}
, U! z5 R4 M5 C5 _9 n% ~ if(GPIOPinIntStatus(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_C) == GPIO_INT_PEND)
2 @+ ^. B! L* D8 B, H+ O {: i7 [: u' F- L% i2 s1 H/ D
GPIOPinIntClear(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_C); //问题是:用仿真器debug,发现程序不能进入这里。
8 ^" }: G4 d: x) |4 I cs_addr = SOC_EMIFA_CS2_ADDR ;
3 h C c1 b. v; i! b8 v* ~, o internal = 12 ;
7 V( r C0 n. A0 z- V( P int_flag[2] = 1 ;
, @6 ~* a5 ?3 B# {: N. Z. U }7 b% e$ A3 h4 Y. U w. h
3 u6 s* j# q8 Z1 ^4 r$ A+ c GPIOPinWrite(SOC_GPIO_0_REGS, AD7606_PAR_CONVST, GPIO_PIN_LOW);' V9 E9 n% ~; W% L2 c0 H
" W8 D: S; A7 O) m) M
GPIOBankIntEnable(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_GPIO_BANK);
2 p3 G" r1 Y' n$ B2 v& ]}
' _5 U! V6 T4 G, e
& K# @, f m* L! l7 U
7 |6 G/ ~1 G z9 d
' w( m# \) h6 B A$ m1 e, g! `: t Y; h; u% ?
|
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
|