|
您好。使用GPIO中断时,中断能进入ISR,但是不能区分具体的GPIO端口。程序如下:5 H# U3 @& ]+ ^7 o2 n4 a
#define AD7606_PAR_BUSY_GPIO_BANK 50 ?. G' t3 G# Z G) X3 V
#define AD7606_PAR_BUSY_GPIO_BANK_INT SYS_INT_GPIO_B5INT
& ]. |6 f, ^+ {" r1 {; F
) [( s& V$ X2 [#define AD7606_PAR_BUSY_V1 GPIO_TO_PIN(5, 11) //BANK5的中断口5.11
6 K& x, t I2 ?8 K' w" X2 ^# U#define AD7606_PAR_BUSY_V2 GPIO_TO_PIN(5, 9) //BANK5的中断口5.9- ]- l2 B* n5 d0 S% k: I3 i
#define AD7606_PAR_BUSY_C GPIO_TO_PIN(5, 5) //BANK5的中断口5.5
3 I1 T" h& u \/ b2 Z+ Y#define AD7606_PAR_BUSY GPIO_TO_PIN(5, 4)
" U! X$ T; O3 k# ^" X) ^, Y1 h. \8 r% B* l( [
#define AD7606_PAR_CONVST GPIO_TO_PIN(5, 1)
* {* w$ t0 f v: {8 d1 e#define AD7606_PAR_RD GPIO_TO_PIN(5, 2)
' T1 y, v% ^0 b" ]* B& _6 C#define AD7606_PAR_RESET GPIO_TO_PIN(5, 0); g. m8 |* G+ q# H y
2 q- \1 ?5 E% ^2 x# p+ H) s
, r6 P7 u6 p/ A& [' q0 ~& t# C! n2 ~
static void ad7606_irq_setup(ad7606 *ad) {( n. t/ F( u- z
Hwi_Params hwiParams;" z* E- {) R- M
Hwi_Handle myHwi;
2 N! k5 D, q" S+ o6 D1 r" h Error_Block eb;
# @3 ? O5 F+ B$ M- x4 s% S9 k1 z4 r I! ^) Z5 L
Error_init(&eb);
- `( S2 j0 j! E5 g' I: ~' }4 D0 b Hwi_Params_init(&hwiParams);
8 w H V5 P! s hwiParams.arg = (unsigned int)ad;2 q9 ^9 g/ k9 i6 l% ~
hwiParams.enableInt = FALSE;+ \; h n0 }0 z( n
hwiParams.eventId = SYS_INT_GPIO_B5INT;7 ]4 N) o, a+ j' E
hwiParams.priority = 4;
/ t2 Q+ z, R& R+ l( K myHwi = Hwi_create(8, ad7606_busy_hwi, &hwiParams, &eb); //注册BANK5中断处理函数
$ Y' a' c" I* h# f& E2 E/ i if (myHwi == NULL)
0 r' k( \7 H5 y6 \- p$ k LOG_FATAL("failed to create hwi");
" [) T" W+ k5 b
* S7 p$ A8 M$ |8 n /* enable both interrupts */* O, }2 `+ s& E# p
Hwi_enableInterrupt(ad->irq_event);; U+ c; i7 y U: H w) X* K9 B
}- e d3 J+ r4 ?, }+ V/ ^1 O
8 [: w$ O5 u: s6 P& N7 J( n1 C4 c U, o1 @
static void ad7606_gpio_pinmux_setup(ad7606 *ad) {7 q7 B# `4 i# q; j* V$ I }
volatile unsigned int savePinMux = 0;
1 |; Q+ m# Q4 L6 `. D" Q/ X, T: k$ t //初始化5.11、5.9 、 5.5为GPIO口
# b8 u w% S) g) L$ ` savePinMux = HWREG(SOC_SYSCFG_0_REGS + SYSCFG0_PINMUX(11)) & (~(SYSCFG_PINMUX11_PINMUX11_27_24 | SYSCFG_PINMUX11_PINMUX11_19_16));
/ S5 Y0 ?. o- x+ l+ \2 k* Z1 q; @9 {# r: C- K% z
HWREG(SOC_SYSCFG_0_REGS + SYSCFG0_PINMUX(11)) = (PINMUX11_BUSY_V1_ENABLE | PINMUX11_BUSY_V2_ENABLE | savePinMux);/ ?; `4 |; z5 m: {$ e# `; A
8 C1 ~1 Q9 j6 Z( M# H- K6 Q
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));
' [! T1 \9 A4 D5 ^/ W7 s: D, w& t" a7 s; r
HWREG(SOC_SYSCFG_0_REGS + SYSCFG0_PINMUX(12)) = (PINMUX12_RESET_ENABLE | PINMUX12_CONVST_ENABLE | PINMUX12_RD_ENABLE | PINMUX12_BUSY_C_ENABLE | savePinMux);
" ^6 k B1 s5 ]! p: A7 g' j" |* h- B4 ~9 z2 r& ?
}# ]* x' K: X8 u
! d# c) D) L! d: k9 a; t0 x9 x+ Y
7 ~) U6 Y" |' M1 _' c; j
static void ad7606_gpio_setup(ad7606 *ad) {, H- h3 M5 R: ~3 t
/*Set the AD7606_PAR_BUSY to the input mode*/4 o& A& s* R0 k5 {& z
//初始化5.11、5.9 、 5.5为中断口" t9 G) {2 q* T0 S$ T; P1 k5 w* k0 t. N1 S
GPIODirModeSet(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_V1, GPIO_DIR_INPUT);
& }% ~2 d( p) I( v! v/ D GPIODirModeSet(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_V2, GPIO_DIR_INPUT);
3 C Q& z0 w. s0 Z& n GPIODirModeSet(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_C, GPIO_DIR_INPUT);9 }/ z7 C8 L0 V9 i
//GPIODirModeSet(SOC_GPIO_0_REGS, AD7606_PAR_BUSY, GPIO_DIR_INPUT);9 i( N0 X; i. {5 V& m- ?
/*Set the AD7606_PAR_BUSY to the Falling Edge Interrupt*/
; b# l6 f4 o! `/ f( m* t* z GPIOIntTypeSet(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_V1, GPIO_INT_TYPE_FALLEDGE);9 j* a) v& M5 M8 `$ Z1 n+ h
GPIOIntTypeSet(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_V2, GPIO_INT_TYPE_FALLEDGE);
H H$ {% K7 d4 E5 V7 d! S GPIOIntTypeSet(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_C, GPIO_INT_TYPE_FALLEDGE); d$ x, l! S9 A- W) H& H! O
//GPIOIntTypeSet(SOC_GPIO_0_REGS, AD7606_PAR_BUSY, GPIO_INT_TYPE_FALLEDGE);
% M: O" K3 V3 v2 T /*The interrupt setting allows AD7606_PAR_BUSY_GPIO_BANK*/" W5 l! c$ Y8 k# |
GPIOBankIntEnable(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_GPIO_BANK);0 k- r: M& @* I$ d& b* j" j; d
3 L: X: y' \. l8 L9 O p GPIODirModeSet(SOC_GPIO_0_REGS, AD7606_PAR_RESET, GPIO_DIR_OUTPUT);
. J! P& N) o1 d- e, |0 n# z, S GPIOPinWrite(SOC_GPIO_0_REGS, AD7606_PAR_RESET, GPIO_PIN_HIGH);6 d6 X5 ]2 s" g; t- _0 n
Task_sleep(1000);8 G/ T, A2 q2 R/ m: h7 i3 q
GPIOPinWrite(SOC_GPIO_0_REGS, AD7606_PAR_RESET, GPIO_PIN_LOW);( C/ u* d0 |4 i E* [6 B( r7 ~
Task_sleep(1000);
- p5 V5 I* n: Z% s" k% l" c2 A
' \; L: y* H8 @0 {* e/ q /*Set the AD7606_PAR_CONVST to output mode*/1 O5 _1 {4 T W- d+ K3 m F
GPIODirModeSet(SOC_GPIO_0_REGS, AD7606_PAR_CONVST, GPIO_DIR_OUTPUT);
1 }1 d0 n- ~7 u0 u0 h4 S5 G" q GPIOPinWrite(SOC_GPIO_0_REGS, AD7606_PAR_CONVST, GPIO_PIN_LOW);7 n, n- [5 r0 O) w1 \
+ \$ g- i9 e2 x0 z GPIODirModeSet(SOC_GPIO_0_REGS, AD7606_PAR_RD, GPIO_DIR_OUTPUT);
6 S- ]+ S, L* s( c- J( W GPIOPinWrite(SOC_GPIO_0_REGS, AD7606_PAR_RD, GPIO_PIN_HIGH);# q* Y% v& v; @8 j
9 N0 H: g4 T: j* v3 A0 F Q N# o}! w0 H$ w+ O, S) p; k9 ?
) c$ f/ N: F7 D7 T* U2 {5 l2 P4 g/ e' j7 K5 k
static void ad7606_busy_hwi(UArg ad_addr) {$ O5 B- `" |) W: E- ]
9 j6 z1 D8 c+ Q0 ^* \4 ]. ~- R* R0 t
/* Disable the interrupts for pins of bank AD7606_PAR_BUSY in GPIO.*/
& L+ ?: Z4 i8 Y3 c; @ GPIOBankIntDisable(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_GPIO_BANK); //用仿真器debug,发现程序能进入这里。6 U# ~/ Y1 w+ Q
, X; ?( e7 A4 X% U) O+ o' \ if(GPIOPinIntStatus(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_V1) == GPIO_INT_PEND)/ E) K5 x# I. @# [4 L5 P/ O
{, D, G2 \9 ~8 z
GPIOPinIntClear(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_V1); //问题是:用仿真器debug,发现程序不能进入这里。3 b5 H5 X2 o0 ]8 z1 A) a0 m! J
cs_addr = SOC_EMIFA_CS5_ADDR ;- K# \, K0 M7 d4 g2 \: L
internal = 0 ;
) S7 H1 G5 B* R, C- A int_flag[0] = 1 ;; H- q. D2 z3 y% N- d9 z! ?/ w
}% x+ s3 @; h! r- e: F( ^
if(GPIOPinIntStatus(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_V2) == GPIO_INT_PEND)
! B& F0 J9 K! ]4 z; I5 i/ w8 w {
' y! D0 j/ P( s# G% t9 b5 P* S0 o6 h GPIOPinIntClear(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_V2); //问题是:用仿真器debug,发现程序不能进入这里。& y. Y% t8 L& Y8 u
cs_addr = SOC_EMIFA_CS4_ADDR ;& ^6 ?9 D% P! U8 Q9 ]/ ?
internal = 6 ;
5 Z i M7 T4 S0 Q( i8 n int_flag[1] = 1 ;
) ]! E6 I1 b$ W0 g) { }. ~( u7 |! w G: F6 F
if(GPIOPinIntStatus(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_C) == GPIO_INT_PEND)! ]8 u. C- W/ U/ X# W9 ~- w
{, A9 ?& Y/ U- N& y, j! A1 r
GPIOPinIntClear(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_C); //问题是:用仿真器debug,发现程序不能进入这里。 v' a4 S9 F2 \3 Z, b2 A4 A
cs_addr = SOC_EMIFA_CS2_ADDR ;1 o8 [' Y; d9 w
internal = 12 ;
1 `, t# A. u& D0 S* B* @+ C; }: J; W int_flag[2] = 1 ;8 R4 m- g$ Q9 Y! S* m
}1 G. ^: W$ M) B1 ?# W
/ F0 u& V4 r1 j
GPIOPinWrite(SOC_GPIO_0_REGS, AD7606_PAR_CONVST, GPIO_PIN_LOW);+ y' q6 z' B- C* T' h
0 _3 I0 ?6 s/ t% N2 i; C- F GPIOBankIntEnable(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_GPIO_BANK);
; H" ^- z; T6 Q2 k' d& `$ V# j}* Z2 j3 m2 M6 y' ^- G
( Y( y7 C! Z$ \( O4 K$ i0 t
+ P$ n0 |) x/ V4 r$ t' Y( G0 D. o
1 y; p7 W% ]; c& ]3 ?
+ Z3 o, q3 c& i- m& X2 \! G |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
|