|
您好。使用GPIO中断时,中断能进入ISR,但是不能区分具体的GPIO端口。程序如下:
/ D2 ~. A0 W0 m/ h% o9 F5 w#define AD7606_PAR_BUSY_GPIO_BANK 57 J/ r# N9 L; x# L
#define AD7606_PAR_BUSY_GPIO_BANK_INT SYS_INT_GPIO_B5INT( c- E0 U0 M9 G; ?
8 x* }6 d3 C$ W/ w#define AD7606_PAR_BUSY_V1 GPIO_TO_PIN(5, 11) //BANK5的中断口5.118 {! z/ \: x- k' H4 H* }
#define AD7606_PAR_BUSY_V2 GPIO_TO_PIN(5, 9) //BANK5的中断口5.9
/ M o: Q& y$ ]/ Q$ m9 |% @#define AD7606_PAR_BUSY_C GPIO_TO_PIN(5, 5) //BANK5的中断口5.5
6 {5 g+ j7 d4 k" t% N6 [$ {#define AD7606_PAR_BUSY GPIO_TO_PIN(5, 4)
5 E6 J0 Z7 d: a# Y! L$ u3 _$ n3 H* `6 I: N
#define AD7606_PAR_CONVST GPIO_TO_PIN(5, 1) P2 d$ m! ~- ?2 m7 J: M1 b
#define AD7606_PAR_RD GPIO_TO_PIN(5, 2)
$ U: B8 _7 N. j2 N+ P8 y#define AD7606_PAR_RESET GPIO_TO_PIN(5, 0)
( f2 B& T7 ~7 w; H+ v, P6 D! o' W. n* B& z
. ], w# P* E* o2 K, y
1 A/ ?! V& k' Q: Ystatic void ad7606_irq_setup(ad7606 *ad) {
- B/ ]& i0 f0 [) V. a, J Hwi_Params hwiParams;: k( r& j% F* m$ P. y) W# d) C6 H
Hwi_Handle myHwi;6 I- P" v" _% U4 E6 S* o- `; ?
Error_Block eb;4 ?, L8 f" t- n2 _; t* Y
6 _1 q [# u/ B, X* T1 }
Error_init(&eb);( A- u3 a0 G1 \% J
Hwi_Params_init(&hwiParams);
. X1 E! q" o2 t3 O7 @: t% @( f! d hwiParams.arg = (unsigned int)ad;
* ^- T4 b( d5 ~. F$ D* Y hwiParams.enableInt = FALSE;9 p9 ]! q/ D) @$ o; E2 ~
hwiParams.eventId = SYS_INT_GPIO_B5INT;
1 s, {; G- C, ^8 k! z: ^" A hwiParams.priority = 4;" u! {% Z2 F" M, D
myHwi = Hwi_create(8, ad7606_busy_hwi, &hwiParams, &eb); //注册BANK5中断处理函数
2 L& I2 _$ d3 z1 B" |8 D8 U1 o if (myHwi == NULL) 7 o6 f, r" o: Z3 t
LOG_FATAL("failed to create hwi");
# r. q& m2 o, y: w/ `! n2 ~) f; u& B- h- R7 i/ U: w3 @
/* enable both interrupts */. G; _% K" i- K/ T/ f* _
Hwi_enableInterrupt(ad->irq_event);/ m7 [3 @: ]$ }+ ~. m/ ?
}' z( G; p z, c( U/ L. K4 A! w
. n! f2 n2 l# |0 g
4 r: `% l$ U4 G1 y" q8 nstatic void ad7606_gpio_pinmux_setup(ad7606 *ad) {0 O( P, s) n& @
volatile unsigned int savePinMux = 0;
; B6 g4 W9 ^- b3 x //初始化5.11、5.9 、 5.5为GPIO口( |! m. x0 |# w" Y8 I, j8 G
savePinMux = HWREG(SOC_SYSCFG_0_REGS + SYSCFG0_PINMUX(11)) & (~(SYSCFG_PINMUX11_PINMUX11_27_24 | SYSCFG_PINMUX11_PINMUX11_19_16));
$ i# ~- y* e, E9 U# a5 n4 K- h5 G" N
HWREG(SOC_SYSCFG_0_REGS + SYSCFG0_PINMUX(11)) = (PINMUX11_BUSY_V1_ENABLE | PINMUX11_BUSY_V2_ENABLE | savePinMux);* P6 E# ^2 Z" x& g
% k4 ?0 H5 b8 _* p4 E
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 D; p- q" ?+ y! _' W8 O X. \- g
3 x: B/ M( d$ A* C9 V% V
HWREG(SOC_SYSCFG_0_REGS + SYSCFG0_PINMUX(12)) = (PINMUX12_RESET_ENABLE | PINMUX12_CONVST_ENABLE | PINMUX12_RD_ENABLE | PINMUX12_BUSY_C_ENABLE | savePinMux);5 [' r0 @6 k* j* [% D w! n4 q
/ D/ o+ D9 \' \: R M}
* A) s- A2 p5 i; A6 B
0 y5 ~, P& W5 y; F; E
# }$ ]. Q8 t' f: dstatic void ad7606_gpio_setup(ad7606 *ad) {0 r' e; ?7 I$ f
/*Set the AD7606_PAR_BUSY to the input mode*/& V, c8 i5 E4 j* E. ^9 l2 O
//初始化5.11、5.9 、 5.5为中断口
% D. u a( q+ U' W7 |: y GPIODirModeSet(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_V1, GPIO_DIR_INPUT);8 L' T# g0 W/ T! O
GPIODirModeSet(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_V2, GPIO_DIR_INPUT);
2 W' a# `: W% F4 u6 M+ w GPIODirModeSet(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_C, GPIO_DIR_INPUT);
T W9 f$ P* k! P) q: A0 J //GPIODirModeSet(SOC_GPIO_0_REGS, AD7606_PAR_BUSY, GPIO_DIR_INPUT);7 c" g; q9 T6 Y% G
/*Set the AD7606_PAR_BUSY to the Falling Edge Interrupt*/. r* z F/ S2 C
GPIOIntTypeSet(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_V1, GPIO_INT_TYPE_FALLEDGE);# Q3 F* [% u3 ]* M7 q; |
GPIOIntTypeSet(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_V2, GPIO_INT_TYPE_FALLEDGE);
/ P+ n7 t T; Z! P% ?) o4 B) { GPIOIntTypeSet(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_C, GPIO_INT_TYPE_FALLEDGE);$ J8 N6 {9 _2 n) x% X0 _4 N
//GPIOIntTypeSet(SOC_GPIO_0_REGS, AD7606_PAR_BUSY, GPIO_INT_TYPE_FALLEDGE);, H+ G% C5 H# T
/*The interrupt setting allows AD7606_PAR_BUSY_GPIO_BANK*/
7 C, d* a: H7 [1 t F( m3 ] GPIOBankIntEnable(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_GPIO_BANK);
4 E: m- h8 p/ f; b6 W2 T; q6 @, s1 f9 _4 X$ M: ?
GPIODirModeSet(SOC_GPIO_0_REGS, AD7606_PAR_RESET, GPIO_DIR_OUTPUT);0 t, z5 n8 y1 @+ A7 Y# l" W* i' }8 L
GPIOPinWrite(SOC_GPIO_0_REGS, AD7606_PAR_RESET, GPIO_PIN_HIGH);7 W$ }1 H; m/ B, x/ d2 t
Task_sleep(1000);
; b4 h7 b, N( Y2 w, m GPIOPinWrite(SOC_GPIO_0_REGS, AD7606_PAR_RESET, GPIO_PIN_LOW);/ q( v- I9 u6 Q: Z6 F2 T2 k
Task_sleep(1000);
3 {' `; e0 V8 j. C; A$ G7 Y0 A) P* r* Q3 x5 P) @
/*Set the AD7606_PAR_CONVST to output mode*/
/ b3 a& T2 M' N GPIODirModeSet(SOC_GPIO_0_REGS, AD7606_PAR_CONVST, GPIO_DIR_OUTPUT);+ e7 \3 H3 E8 e
GPIOPinWrite(SOC_GPIO_0_REGS, AD7606_PAR_CONVST, GPIO_PIN_LOW);( O' b. P/ O! Y! S: e
* [- I3 v3 f; i" u$ M
GPIODirModeSet(SOC_GPIO_0_REGS, AD7606_PAR_RD, GPIO_DIR_OUTPUT);- n. z! {+ y1 B7 L7 b" x- }3 I
GPIOPinWrite(SOC_GPIO_0_REGS, AD7606_PAR_RD, GPIO_PIN_HIGH);
/ a. ~2 A) \5 T) R5 E, h2 Z8 x4 Q7 P% z, b" k3 [; l1 K( \
}
, e: i4 y5 h+ ?% j
* k4 w8 Y; H1 C$ o, }; I0 G7 z* O+ Q" V$ e
static void ad7606_busy_hwi(UArg ad_addr) {0 M9 V, @0 l$ e* c' h0 X
- ?% O! h7 T/ J: a: t1 {
! Z1 N( P1 a7 q$ i0 A/ S* i; y /* Disable the interrupts for pins of bank AD7606_PAR_BUSY in GPIO.*/6 e4 \- G, H7 u
GPIOBankIntDisable(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_GPIO_BANK); //用仿真器debug,发现程序能进入这里。( M, P9 }* f* t0 T' S2 k1 [1 D
9 g7 t$ ]( ~: j7 B0 X
if(GPIOPinIntStatus(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_V1) == GPIO_INT_PEND)
3 I$ p; @$ E9 q {
. j; q5 K" z; `; r4 j9 [ GPIOPinIntClear(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_V1); //问题是:用仿真器debug,发现程序不能进入这里。. ]8 N" m" F1 b3 C
cs_addr = SOC_EMIFA_CS5_ADDR ;
+ Z8 N) }9 E% f7 K; W internal = 0 ;0 p5 r& b7 T8 ]0 U9 }; H
int_flag[0] = 1 ;
5 K$ T1 w2 Y# q" M0 G1 v8 n }/ f, e# D6 x& |% j* d
if(GPIOPinIntStatus(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_V2) == GPIO_INT_PEND)
3 p) \6 i4 J" y& D {6 \ ]- T4 Z! T/ f; B& R4 X/ {8 d
GPIOPinIntClear(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_V2); //问题是:用仿真器debug,发现程序不能进入这里。! z/ H- c7 D' S m" M
cs_addr = SOC_EMIFA_CS4_ADDR ;
- N; l5 s; d5 x( s internal = 6 ;6 I4 q% ~: V. ]# [& x! O7 m. b
int_flag[1] = 1 ;% n7 x' h ~& Z4 j# y( m8 @
}
& k% ]' L) {' `6 f$ t/ ?( D' [- N" i if(GPIOPinIntStatus(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_C) == GPIO_INT_PEND)6 l6 j! j8 a/ \. Q' G+ |9 m* q' `
{
) s2 t6 u5 ]) y7 K! x: `# U% S GPIOPinIntClear(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_C); //问题是:用仿真器debug,发现程序不能进入这里。
4 @# ]2 i9 X: e2 r cs_addr = SOC_EMIFA_CS2_ADDR ;% l# S: u$ Q8 Y4 X' ~$ }
internal = 12 ;
- Y% M: c4 C4 j# ~3 q2 T2 h8 k$ d! } _ int_flag[2] = 1 ;" z+ c1 d- H' [
}
, J5 j; a% {% C; R
* ^ ]6 w6 G5 C) X0 u* R GPIOPinWrite(SOC_GPIO_0_REGS, AD7606_PAR_CONVST, GPIO_PIN_LOW);
; E4 a* @$ p1 r ( u9 ^* p* V& c' n$ H+ k
GPIOBankIntEnable(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_GPIO_BANK);
. y% f) K5 v# t* X- t* r% H}: g; p1 Z' n _% F E: i+ Q
a9 f! N& G+ I& q$ x
3 E2 p7 p9 r, y& _
5 C5 T9 x) o; f6 s$ W: ?" }$ Q4 ~$ J5 v' C0 T
|
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
|