|
您好。使用GPIO中断时,中断能进入ISR,但是不能区分具体的GPIO端口。程序如下:/ L! ?! M- i5 Z i
#define AD7606_PAR_BUSY_GPIO_BANK 5
J& h( b" ~0 g+ b#define AD7606_PAR_BUSY_GPIO_BANK_INT SYS_INT_GPIO_B5INT1 Z2 n( r4 u. b) W3 e& l! H; V
6 ?* N, W( h3 L' O#define AD7606_PAR_BUSY_V1 GPIO_TO_PIN(5, 11) //BANK5的中断口5.11
. X& M- _" g( _; Q$ _, h#define AD7606_PAR_BUSY_V2 GPIO_TO_PIN(5, 9) //BANK5的中断口5.9
0 x/ H) v; `" t# A#define AD7606_PAR_BUSY_C GPIO_TO_PIN(5, 5) //BANK5的中断口5.5- |/ k6 t! p9 `- f0 `
#define AD7606_PAR_BUSY GPIO_TO_PIN(5, 4)
5 e, C) e8 \; s9 R j' e7 s. P& U, I5 r2 S
#define AD7606_PAR_CONVST GPIO_TO_PIN(5, 1)
& q% W! t0 \1 p" V2 o" G$ j6 \#define AD7606_PAR_RD GPIO_TO_PIN(5, 2)& G s+ H# s T0 v8 b
#define AD7606_PAR_RESET GPIO_TO_PIN(5, 0)
: T) \5 D% z- Y" m9 s' R0 y8 V, J7 g( E2 P. X4 I% Y/ P$ h
& S$ H3 \5 g, V: U3 S
4 a$ [1 \2 R0 _
static void ad7606_irq_setup(ad7606 *ad) {
7 C @; `7 A# ~ ~% }! q& O Hwi_Params hwiParams;( {9 L9 e& B7 t! l5 w7 R
Hwi_Handle myHwi;
5 N% K% V! f) x n$ ` Error_Block eb;
7 t4 G# A% b$ z
7 c* C( x% R$ K Error_init(&eb);5 }# X2 f0 W$ ?2 P
Hwi_Params_init(&hwiParams);' J# P4 B1 g& `6 j0 J3 A1 r
hwiParams.arg = (unsigned int)ad;
1 D" ?) L! O; O hwiParams.enableInt = FALSE;
7 A" E$ P1 I, m- e& | hwiParams.eventId = SYS_INT_GPIO_B5INT;8 ]9 I0 i5 n# C: w
hwiParams.priority = 4;' I K2 W- E+ X O) O
myHwi = Hwi_create(8, ad7606_busy_hwi, &hwiParams, &eb); //注册BANK5中断处理函数 N g1 h! p4 j3 m
if (myHwi == NULL)
. U0 Q; l7 |# ]9 n6 N LOG_FATAL("failed to create hwi");
, u) |3 G# v& {- ?) ^) P( q5 w: h) b- C6 T5 C
/* enable both interrupts */# k* X' U0 p0 j ^- p
Hwi_enableInterrupt(ad->irq_event);
3 ]/ w! r4 I( O0 v}$ r# f1 M; O2 r @1 E& p
( ^# j, Z3 s" X) u( ?' J
: W& C4 z Q+ P* E9 z$ `9 L4 T
static void ad7606_gpio_pinmux_setup(ad7606 *ad) {
0 G8 j% r* ^- \6 C( ^, J volatile unsigned int savePinMux = 0;
7 b' F9 ~& Y6 Q8 g1 a s. i //初始化5.11、5.9 、 5.5为GPIO口. {% a# u) K% T
savePinMux = HWREG(SOC_SYSCFG_0_REGS + SYSCFG0_PINMUX(11)) & (~(SYSCFG_PINMUX11_PINMUX11_27_24 | SYSCFG_PINMUX11_PINMUX11_19_16));
6 Z* g* l/ z' H x/ W7 u+ @# \
" ~+ ^( Q, k5 Z. Z9 ~7 a HWREG(SOC_SYSCFG_0_REGS + SYSCFG0_PINMUX(11)) = (PINMUX11_BUSY_V1_ENABLE | PINMUX11_BUSY_V2_ENABLE | savePinMux);
" D* R! ]6 [7 b6 g) R7 X z
( [4 r% i" {; @& x6 \ 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));2 n8 F0 j$ P( x: m$ ], f# J) V$ U
! R: H/ w$ S6 @0 [ HWREG(SOC_SYSCFG_0_REGS + SYSCFG0_PINMUX(12)) = (PINMUX12_RESET_ENABLE | PINMUX12_CONVST_ENABLE | PINMUX12_RD_ENABLE | PINMUX12_BUSY_C_ENABLE | savePinMux);
8 b2 e$ G, s, Q0 i
( e. E7 h4 V9 l}
* T% u; _7 R; }. }3 S9 G/ u' Q& |: F, B+ I
! f- ?, n3 m7 x$ G$ Astatic void ad7606_gpio_setup(ad7606 *ad) {
2 O$ X6 K5 B. [4 n! ? /*Set the AD7606_PAR_BUSY to the input mode*/" F4 B; X6 m W; \& C5 N S. B; t9 t
//初始化5.11、5.9 、 5.5为中断口
7 ]8 j" i8 {2 C9 Q) U9 {$ V# e GPIODirModeSet(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_V1, GPIO_DIR_INPUT);
* ?8 ?. V" _% z( O& B6 y* N GPIODirModeSet(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_V2, GPIO_DIR_INPUT);
+ F+ W( |: p5 o0 G$ s2 o4 K Q6 y* R$ M3 C GPIODirModeSet(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_C, GPIO_DIR_INPUT);6 y* _) ~1 t1 m3 H4 h0 a
//GPIODirModeSet(SOC_GPIO_0_REGS, AD7606_PAR_BUSY, GPIO_DIR_INPUT);
1 O' O; F' B# M1 j3 [ /*Set the AD7606_PAR_BUSY to the Falling Edge Interrupt*/
* t: |$ ~3 X! t0 A2 p# Z GPIOIntTypeSet(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_V1, GPIO_INT_TYPE_FALLEDGE);
" B' W4 ?; M* @* I GPIOIntTypeSet(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_V2, GPIO_INT_TYPE_FALLEDGE);
& J- d( ?6 g$ O- K4 X( e GPIOIntTypeSet(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_C, GPIO_INT_TYPE_FALLEDGE);( [9 T, [( L) r2 p* i2 c/ _- a
//GPIOIntTypeSet(SOC_GPIO_0_REGS, AD7606_PAR_BUSY, GPIO_INT_TYPE_FALLEDGE);
/ o- A4 l+ f; A' b7 h* j, }- q /*The interrupt setting allows AD7606_PAR_BUSY_GPIO_BANK*/3 M7 V6 n; ^$ D9 F
GPIOBankIntEnable(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_GPIO_BANK);
/ K6 R2 p/ t" I! x$ T6 U. I F& v
GPIODirModeSet(SOC_GPIO_0_REGS, AD7606_PAR_RESET, GPIO_DIR_OUTPUT);
& P! z X3 L1 J GPIOPinWrite(SOC_GPIO_0_REGS, AD7606_PAR_RESET, GPIO_PIN_HIGH);
; |4 O! D/ l3 r& d+ l# x; |$ ^ Task_sleep(1000);" Y+ b8 G* n* X) q
GPIOPinWrite(SOC_GPIO_0_REGS, AD7606_PAR_RESET, GPIO_PIN_LOW);+ ^& }' r* I! v% G- Q
Task_sleep(1000);' U/ m( t) Z6 Q- u2 }8 W+ ?* P% ]
& o0 d E2 z3 }" l* C
/*Set the AD7606_PAR_CONVST to output mode*/+ M8 Z. q7 P/ n; a" A" Y& g8 N. n
GPIODirModeSet(SOC_GPIO_0_REGS, AD7606_PAR_CONVST, GPIO_DIR_OUTPUT); u2 L% m7 e: ~8 Q' G8 k
GPIOPinWrite(SOC_GPIO_0_REGS, AD7606_PAR_CONVST, GPIO_PIN_LOW);
+ x, l' T% G2 |9 E" a, `6 \" ?9 C8 Y3 z+ i: D" n
GPIODirModeSet(SOC_GPIO_0_REGS, AD7606_PAR_RD, GPIO_DIR_OUTPUT);% ]( g0 g8 {1 Y7 T9 r! }, W" ^
GPIOPinWrite(SOC_GPIO_0_REGS, AD7606_PAR_RD, GPIO_PIN_HIGH);; g- g& P* b) E: {! }+ ?
! g5 m+ Q5 w' I+ B' C
}
3 G! A" Y/ B4 l y. T
& W K% u8 D2 w" P6 c3 i/ d, s) P/ U6 Q. b
static void ad7606_busy_hwi(UArg ad_addr) {
% V! V g# t) I" T* c4 o8 S3 ^. f- z
3 \0 V& Q7 B8 t1 P5 y l
/* Disable the interrupts for pins of bank AD7606_PAR_BUSY in GPIO.*/. I0 ` w$ ~; I5 H
GPIOBankIntDisable(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_GPIO_BANK); //用仿真器debug,发现程序能进入这里。
8 V* e) z) P3 {/ E7 w
9 S! `# t, `# D if(GPIOPinIntStatus(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_V1) == GPIO_INT_PEND)
: w0 ~5 k: G; q5 G, s {
7 d* M7 k l! s/ D5 R5 p# d GPIOPinIntClear(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_V1); //问题是:用仿真器debug,发现程序不能进入这里。3 F* F) M; |# b c5 w
cs_addr = SOC_EMIFA_CS5_ADDR ;
8 W0 B! y5 \; l' Y6 e! m& [$ z1 R# Q( N internal = 0 ;: q2 w+ I: b( m4 Q$ c3 b6 u
int_flag[0] = 1 ; G1 t6 K A: g- E. H
}
, A9 d) H9 ` u* `5 d% A9 H if(GPIOPinIntStatus(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_V2) == GPIO_INT_PEND)( c- n# m9 y) c: c# g4 W' x
{
$ [/ a6 P+ j* O" f$ T6 } GPIOPinIntClear(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_V2); //问题是:用仿真器debug,发现程序不能进入这里。
! ? R, P: v5 B+ \ cs_addr = SOC_EMIFA_CS4_ADDR ;" z5 g4 u! Z1 ^! a* E4 N% Q
internal = 6 ;9 V5 W% P" u9 j% M5 S& V$ d
int_flag[1] = 1 ;
s5 e" i5 I5 \5 M }
) H! V% o9 N; n if(GPIOPinIntStatus(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_C) == GPIO_INT_PEND)9 s4 y9 Z+ R8 I1 H% N& x
{/ V, g9 S' b( D9 M/ ~: O1 \
GPIOPinIntClear(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_C); //问题是:用仿真器debug,发现程序不能进入这里。/ `$ J: ^1 J7 o2 i/ |- @
cs_addr = SOC_EMIFA_CS2_ADDR ;
' x7 j9 i. |7 F- H8 m) n$ C7 S internal = 12 ;
% C- V8 G9 _! `; D; q3 j int_flag[2] = 1 ;
5 r6 |0 }) e# w, t }' g# f4 T8 n4 z
2 {3 U6 _) D- s. | GPIOPinWrite(SOC_GPIO_0_REGS, AD7606_PAR_CONVST, GPIO_PIN_LOW);
4 s) U% }, ~! p: h w& e ! g0 r {% b; ~9 l" Q, O- e
GPIOBankIntEnable(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_GPIO_BANK);
1 i3 {# I' A; W- N4 x: F' W; b2 D: \4 X}) D& c2 W; y# h' O
5 @0 Z, {1 V4 \5 C; _7 G
* [$ J1 }5 V: D! x, q" B, B3 R4 {5 ~# c: Y6 x2 ^
$ @. P; q* s6 L$ L0 W* W; N7 j: l6 t
|
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
|