|
您好。使用GPIO中断时,中断能进入ISR,但是不能区分具体的GPIO端口。程序如下:' U4 X' B; C7 ~$ w3 q4 i
#define AD7606_PAR_BUSY_GPIO_BANK 5; u6 k, B$ e, }% K2 b k
#define AD7606_PAR_BUSY_GPIO_BANK_INT SYS_INT_GPIO_B5INT( W" N( B' V* }/ c/ P% l
) o6 R& [: S# p# s3 r" i/ I#define AD7606_PAR_BUSY_V1 GPIO_TO_PIN(5, 11) //BANK5的中断口5.11. c( e" p$ Z( \1 t9 ^. _
#define AD7606_PAR_BUSY_V2 GPIO_TO_PIN(5, 9) //BANK5的中断口5.95 N9 s0 n1 M( \
#define AD7606_PAR_BUSY_C GPIO_TO_PIN(5, 5) //BANK5的中断口5.5
3 X7 L- u. F& S H4 d1 o9 E, D#define AD7606_PAR_BUSY GPIO_TO_PIN(5, 4)
3 a. ~! }$ x1 Q
% v) e7 Y9 ]9 \7 D6 o% Z#define AD7606_PAR_CONVST GPIO_TO_PIN(5, 1)
/ q# f) y2 s, Y* N#define AD7606_PAR_RD GPIO_TO_PIN(5, 2)
' x1 Y8 M5 Z! y; E#define AD7606_PAR_RESET GPIO_TO_PIN(5, 0)( _5 g, V1 c2 |0 S3 o& _ L
7 A8 |; G& {4 L
; F. v! j |7 s% K) G
( N8 J" n* A4 ]+ a% p" Q; S
static void ad7606_irq_setup(ad7606 *ad) {
7 G+ T' Q* m" ?* R0 r. D' w, X Hwi_Params hwiParams;$ A* d9 y5 t' I6 Z
Hwi_Handle myHwi;! z/ H; |. l2 V
Error_Block eb;
: |, _/ o$ d6 ^, L* p: N( h8 ~ ~: M6 S5 h- H ~5 d4 U
Error_init(&eb);9 ]; `& a! b f$ L" \) m
Hwi_Params_init(&hwiParams);
: f; d3 \# y2 i hwiParams.arg = (unsigned int)ad;/ ?- K0 ? k. d4 @3 v: F
hwiParams.enableInt = FALSE;, [( d! W1 s" Q: f2 V" a
hwiParams.eventId = SYS_INT_GPIO_B5INT;! y7 Q- P, E- a) F, u6 Q
hwiParams.priority = 4;5 ?/ s( g' h* [8 A# x
myHwi = Hwi_create(8, ad7606_busy_hwi, &hwiParams, &eb); //注册BANK5中断处理函数! g$ L! O# Q: R5 a, p% m
if (myHwi == NULL)
! N) D/ ~) D2 T2 j LOG_FATAL("failed to create hwi");
. }& }7 g9 ^2 A+ u/ n) R- p- n7 D3 b) [6 U
/* enable both interrupts */
) o+ T0 p# Q$ j: i. ^2 q% @" u' P Hwi_enableInterrupt(ad->irq_event);5 v4 X" e0 Y- k4 D) i9 S; G& l# I
}
( v' G1 [/ X+ G% Q/ [5 Z) g; }% E6 Y1 s( [ i( g
) _7 Z! {& s! Y$ {5 ]1 istatic void ad7606_gpio_pinmux_setup(ad7606 *ad) {
/ d/ v8 H! y$ M3 C volatile unsigned int savePinMux = 0;
4 ^% T" S9 t) x k' b4 a3 j, v //初始化5.11、5.9 、 5.5为GPIO口
" O7 F) B. a9 u' w! f( Y savePinMux = HWREG(SOC_SYSCFG_0_REGS + SYSCFG0_PINMUX(11)) & (~(SYSCFG_PINMUX11_PINMUX11_27_24 | SYSCFG_PINMUX11_PINMUX11_19_16));/ R" y- |- y- p4 m: @
; ~- ^ o! F1 W- Z HWREG(SOC_SYSCFG_0_REGS + SYSCFG0_PINMUX(11)) = (PINMUX11_BUSY_V1_ENABLE | PINMUX11_BUSY_V2_ENABLE | savePinMux);
. |# |/ U% u+ a8 z( v- X$ Z
. K9 j& t# V8 y- T+ b% t& I 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));8 L# `2 ~. p# h7 N
, S6 D1 L1 ?1 y9 [: S HWREG(SOC_SYSCFG_0_REGS + SYSCFG0_PINMUX(12)) = (PINMUX12_RESET_ENABLE | PINMUX12_CONVST_ENABLE | PINMUX12_RD_ENABLE | PINMUX12_BUSY_C_ENABLE | savePinMux);
& L) D# A8 c* }$ y
. q& Z! R- W2 f; H}- F8 f8 ?9 L* G5 T
% M1 E' p, U0 z0 H, z' \
( E2 |6 c& ^* Y9 t" f4 v: [( c2 ?static void ad7606_gpio_setup(ad7606 *ad) {# N2 P2 \, p; |$ w
/*Set the AD7606_PAR_BUSY to the input mode*/2 M) [( w5 v' Q; W9 ?
//初始化5.11、5.9 、 5.5为中断口
) v4 N! `/ {' N/ o GPIODirModeSet(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_V1, GPIO_DIR_INPUT); r6 |3 [, v+ X
GPIODirModeSet(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_V2, GPIO_DIR_INPUT);; l3 e' R1 c9 E+ \% ~+ g& t
GPIODirModeSet(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_C, GPIO_DIR_INPUT);. J$ K2 g! B1 \" _2 C
//GPIODirModeSet(SOC_GPIO_0_REGS, AD7606_PAR_BUSY, GPIO_DIR_INPUT);
8 Q- Z& E0 D) V4 y /*Set the AD7606_PAR_BUSY to the Falling Edge Interrupt*/
~9 l7 u$ w9 a# l) b GPIOIntTypeSet(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_V1, GPIO_INT_TYPE_FALLEDGE);
. Q# ~7 O0 H4 c$ }8 q' s GPIOIntTypeSet(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_V2, GPIO_INT_TYPE_FALLEDGE);2 X9 Q' l3 K# ` {6 x. S% a/ V* x
GPIOIntTypeSet(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_C, GPIO_INT_TYPE_FALLEDGE);* ^; h' ?) Z+ V# _# E
//GPIOIntTypeSet(SOC_GPIO_0_REGS, AD7606_PAR_BUSY, GPIO_INT_TYPE_FALLEDGE);
8 k% p( |- L7 v: d1 c /*The interrupt setting allows AD7606_PAR_BUSY_GPIO_BANK*/2 H: p) h- C4 u+ K: C/ x9 U9 p
GPIOBankIntEnable(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_GPIO_BANK);8 `% W, A l# L4 z J( N9 U5 Y
- ]' v$ j" \9 f; [ GPIODirModeSet(SOC_GPIO_0_REGS, AD7606_PAR_RESET, GPIO_DIR_OUTPUT);1 y! z! {( v: L
GPIOPinWrite(SOC_GPIO_0_REGS, AD7606_PAR_RESET, GPIO_PIN_HIGH);; L# r* m2 L) p2 y! A' q. X
Task_sleep(1000);* H' g7 U+ h' i* z5 {+ g u. p
GPIOPinWrite(SOC_GPIO_0_REGS, AD7606_PAR_RESET, GPIO_PIN_LOW);
& c$ Z0 C# Y3 q4 x+ @ Task_sleep(1000);" o$ W+ I: R% I( |
: M. |+ _7 K6 G% l. v! O( ?0 J6 m8 I /*Set the AD7606_PAR_CONVST to output mode*/
; h* C! }& F3 o; M# c GPIODirModeSet(SOC_GPIO_0_REGS, AD7606_PAR_CONVST, GPIO_DIR_OUTPUT);
Q- L! s* _( F: ` GPIOPinWrite(SOC_GPIO_0_REGS, AD7606_PAR_CONVST, GPIO_PIN_LOW);4 h K/ ], i1 ^2 x& ?
& a m& b) w+ R Y: Z& }
GPIODirModeSet(SOC_GPIO_0_REGS, AD7606_PAR_RD, GPIO_DIR_OUTPUT);. C0 i1 i6 Z/ E2 e$ {
GPIOPinWrite(SOC_GPIO_0_REGS, AD7606_PAR_RD, GPIO_PIN_HIGH);
. L$ V: Q5 @% f2 A/ M! ]) R( Z0 O* H* v, | \$ ?
}
n B. P8 f" o( w5 X7 ]
, U7 @) s# O& I7 ^9 j3 W2 ?, ^- J% [: o" B5 X
static void ad7606_busy_hwi(UArg ad_addr) {
0 M! s( M; M8 w( O$ r+ Q6 }
W+ m: D, o" ~/ D4 ^8 g/ E! G( v: I4 o; W$ x
/* Disable the interrupts for pins of bank AD7606_PAR_BUSY in GPIO.*/* X( z0 U1 k; p, u
GPIOBankIntDisable(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_GPIO_BANK); //用仿真器debug,发现程序能进入这里。
: {' Z; B+ E, K* H6 O1 i* t7 q/ h8 A- L0 }; g/ Q
if(GPIOPinIntStatus(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_V1) == GPIO_INT_PEND)3 X7 v$ L9 | k0 X! O; g) ^; h
{ Y+ v( a2 [) [9 Z( v8 E4 J' A
GPIOPinIntClear(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_V1); //问题是:用仿真器debug,发现程序不能进入这里。5 n* s7 ~7 G5 |. O- N3 R
cs_addr = SOC_EMIFA_CS5_ADDR ;
; ?8 P j4 r2 \ internal = 0 ;
, i7 ^4 T1 ^; o int_flag[0] = 1 ;7 U; W( s( ~. l; D; E6 P' _, G. |& J
}
* r# z+ L( V) R if(GPIOPinIntStatus(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_V2) == GPIO_INT_PEND)
- S1 K3 ?9 Z% }( h+ V {$ ?8 ?) Y% I, I: m
GPIOPinIntClear(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_V2); //问题是:用仿真器debug,发现程序不能进入这里。
- @* |0 b% H0 c' i9 H' l6 v0 b cs_addr = SOC_EMIFA_CS4_ADDR ;5 C3 P. f% v& q3 A9 ^7 N: ` [
internal = 6 ;
" ]4 @" m9 n" ]& _ int_flag[1] = 1 ;/ E6 q- o6 B& \% a2 ?; i
}: ?: c4 q% N* L
if(GPIOPinIntStatus(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_C) == GPIO_INT_PEND)
9 r. d$ I! G9 |- X3 a9 X {
9 p3 }, [, s! _' |. u, o GPIOPinIntClear(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_C); //问题是:用仿真器debug,发现程序不能进入这里。
0 m; N1 l+ @! v; P E cs_addr = SOC_EMIFA_CS2_ADDR ;
6 P% z" }$ [1 S1 F) o8 D* F internal = 12 ;( b# o4 K" `, H! Y
int_flag[2] = 1 ;6 M) r- Y' s' }, p- U
}4 w4 j) X! q' z
" X$ H4 l2 A v9 `+ u
GPIOPinWrite(SOC_GPIO_0_REGS, AD7606_PAR_CONVST, GPIO_PIN_LOW);& l+ @1 V5 q+ E; ^. l
& B' |0 x2 ?- F0 Y9 C
GPIOBankIntEnable(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_GPIO_BANK);9 C6 \5 I% d" t3 D& ?% M
}6 _5 x: c, U# N& U' o( U
3 O, k. `" U: N0 t+ ^. j2 W
. \% B: s9 ^( j5 R9 L9 q
; z$ _1 O0 W9 W
4 }5 Q3 P" S( a, h8 f |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
|