|
您好。使用GPIO中断时,中断能进入ISR,但是不能区分具体的GPIO端口。程序如下:
, C* K; f% h$ r0 C& n" W- R" s#define AD7606_PAR_BUSY_GPIO_BANK 5
2 w( g+ h" m3 d7 [#define AD7606_PAR_BUSY_GPIO_BANK_INT SYS_INT_GPIO_B5INT
$ t$ d: o7 f( k* ^2 Z& g: G- o
#define AD7606_PAR_BUSY_V1 GPIO_TO_PIN(5, 11) //BANK5的中断口5.11 S, u1 E! w) _$ c f5 f
#define AD7606_PAR_BUSY_V2 GPIO_TO_PIN(5, 9) //BANK5的中断口5.96 O/ q& g% J- M" J! |0 t0 l
#define AD7606_PAR_BUSY_C GPIO_TO_PIN(5, 5) //BANK5的中断口5.5" `) B" `6 F& T9 F- A1 b3 [, t6 [! s8 T
#define AD7606_PAR_BUSY GPIO_TO_PIN(5, 4). g) E8 @" E4 C
( O& F L0 h# U" \, n8 X#define AD7606_PAR_CONVST GPIO_TO_PIN(5, 1)' x" C* u7 I* g4 p/ s6 z
#define AD7606_PAR_RD GPIO_TO_PIN(5, 2)5 V# U3 y0 C7 A( v0 n% q; f- Z
#define AD7606_PAR_RESET GPIO_TO_PIN(5, 0)
1 {3 o5 W8 U( T& _9 k5 I9 ] u, G$ L$ u
, u, _6 C! Q( F0 S4 Y5 }" q
1 h& o* x% {, S- z$ Kstatic void ad7606_irq_setup(ad7606 *ad) {5 u- \" W- N* o4 e) l* {$ x
Hwi_Params hwiParams;/ `. u- r7 p' P; ?5 C$ |
Hwi_Handle myHwi;
1 O3 p6 \7 w- D& Q. j. ]: X Error_Block eb;
6 T/ \" {6 h5 x$ L* _* r1 R8 T: R$ [/ j) s' R& k
Error_init(&eb);
9 n9 G3 U# H3 ^( H5 [) f5 ? Hwi_Params_init(&hwiParams);
2 r$ b! p& q7 ? L hwiParams.arg = (unsigned int)ad;6 j5 i3 h$ _# D9 T/ U0 X
hwiParams.enableInt = FALSE; }0 J4 E( E3 G3 P( a
hwiParams.eventId = SYS_INT_GPIO_B5INT;
* y' ~* C' o% {5 M! i! S- ^5 {' L hwiParams.priority = 4;, a" b1 Y1 ?6 }3 m. a
myHwi = Hwi_create(8, ad7606_busy_hwi, &hwiParams, &eb); //注册BANK5中断处理函数& Y; V* R% m0 C6 a
if (myHwi == NULL) ( x( `. N/ q- h% d. V" _% r5 U
LOG_FATAL("failed to create hwi");
/ |. Y4 j5 K$ F% U" C1 H9 i7 i( {0 R c# d
/* enable both interrupts */
0 d- O0 |2 x4 ~. a9 d% w- z0 b Hwi_enableInterrupt(ad->irq_event);
& n1 y, O0 g" ~/ i}
2 |* U, u9 v* p% X+ J N* N+ d, U# p
4 J" \7 K- N, ?' \static void ad7606_gpio_pinmux_setup(ad7606 *ad) {( k& a. e& w2 e" x% U w8 _" m1 Y
volatile unsigned int savePinMux = 0;, ^. Q& D6 r9 `1 K
//初始化5.11、5.9 、 5.5为GPIO口+ S9 o' V7 v& D$ u) E) r5 g
savePinMux = HWREG(SOC_SYSCFG_0_REGS + SYSCFG0_PINMUX(11)) & (~(SYSCFG_PINMUX11_PINMUX11_27_24 | SYSCFG_PINMUX11_PINMUX11_19_16));
( n8 Y: k) ]' g) v% A9 |7 }9 L& }" n+ I* ~
HWREG(SOC_SYSCFG_0_REGS + SYSCFG0_PINMUX(11)) = (PINMUX11_BUSY_V1_ENABLE | PINMUX11_BUSY_V2_ENABLE | savePinMux);+ M# [: k" b8 ?/ z, g- ^$ q+ m2 H) T
) s. U! X( l4 d1 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));$ u# `7 ?# w+ F) [0 d
. [5 }+ y/ f# F* }' c
HWREG(SOC_SYSCFG_0_REGS + SYSCFG0_PINMUX(12)) = (PINMUX12_RESET_ENABLE | PINMUX12_CONVST_ENABLE | PINMUX12_RD_ENABLE | PINMUX12_BUSY_C_ENABLE | savePinMux);/ j" J% Q) h$ ~: e
2 V1 W. w8 O! [}3 [& a2 ]; Y" a* h0 P
& a9 E) o% g/ s" L" G3 [- |) {8 ]# I
- l- B8 K# f& `& r) C/ Lstatic void ad7606_gpio_setup(ad7606 *ad) {& Z8 s3 |4 p$ L8 O- k- z0 v& i
/*Set the AD7606_PAR_BUSY to the input mode*/+ Z- \( m4 q# c* Z6 ]% ?
//初始化5.11、5.9 、 5.5为中断口2 i3 K8 d' W3 y4 } u) M
GPIODirModeSet(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_V1, GPIO_DIR_INPUT);
* C( G. ^2 M! A: b3 D GPIODirModeSet(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_V2, GPIO_DIR_INPUT);2 E. W$ D4 C3 L4 h7 W) a9 W- [
GPIODirModeSet(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_C, GPIO_DIR_INPUT);1 t7 A7 j+ U- }! S" k Y5 n5 Y
//GPIODirModeSet(SOC_GPIO_0_REGS, AD7606_PAR_BUSY, GPIO_DIR_INPUT);
: e9 t& z ]! L0 r6 T! ~1 K /*Set the AD7606_PAR_BUSY to the Falling Edge Interrupt*/
) r- m% U! d* s3 k4 F* H GPIOIntTypeSet(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_V1, GPIO_INT_TYPE_FALLEDGE);
& D$ b0 Q* F. F GPIOIntTypeSet(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_V2, GPIO_INT_TYPE_FALLEDGE);
: y& {# S. R A GPIOIntTypeSet(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_C, GPIO_INT_TYPE_FALLEDGE);
+ ^8 ?# c1 _$ t9 s //GPIOIntTypeSet(SOC_GPIO_0_REGS, AD7606_PAR_BUSY, GPIO_INT_TYPE_FALLEDGE);3 y5 q H( q, I: O% G
/*The interrupt setting allows AD7606_PAR_BUSY_GPIO_BANK*/
) R* P9 j1 Y3 u; \3 N7 b GPIOBankIntEnable(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_GPIO_BANK);) B0 D4 h+ ~" F; K! ^/ y
" P" x5 o/ y* E
GPIODirModeSet(SOC_GPIO_0_REGS, AD7606_PAR_RESET, GPIO_DIR_OUTPUT);' g- r, h1 M. e
GPIOPinWrite(SOC_GPIO_0_REGS, AD7606_PAR_RESET, GPIO_PIN_HIGH);
0 z( @$ j9 X. e0 | V Task_sleep(1000);1 v) b) u5 `( z/ W, j, ]
GPIOPinWrite(SOC_GPIO_0_REGS, AD7606_PAR_RESET, GPIO_PIN_LOW);
8 T( C. y/ Y4 S/ `- [ Task_sleep(1000);
) v1 }5 Y0 s2 _2 U4 D
4 ^: J% U. q! n /*Set the AD7606_PAR_CONVST to output mode*/
' d4 A" ^1 m2 s, R3 B GPIODirModeSet(SOC_GPIO_0_REGS, AD7606_PAR_CONVST, GPIO_DIR_OUTPUT);: u6 q2 }9 H$ v
GPIOPinWrite(SOC_GPIO_0_REGS, AD7606_PAR_CONVST, GPIO_PIN_LOW);) r5 `) ]7 @* n) l0 F
( _/ q$ [1 f: x& M, g! }
GPIODirModeSet(SOC_GPIO_0_REGS, AD7606_PAR_RD, GPIO_DIR_OUTPUT);. U; _6 b: C5 z9 a& {1 R
GPIOPinWrite(SOC_GPIO_0_REGS, AD7606_PAR_RD, GPIO_PIN_HIGH);8 _1 a8 u b& A! N6 U4 @) L
& V6 E! P" }/ m
}
8 p4 O) X$ y" f0 l A" F/ p( W8 L7 R/ N" K
# @. o! c6 X0 }
5 K0 O5 O U1 s$ |static void ad7606_busy_hwi(UArg ad_addr) {' J% c0 f+ ]" b" [
$ ^+ F* \4 ` ?# P% i5 I
5 c# y9 x1 f' ~+ Y9 Z& B /* Disable the interrupts for pins of bank AD7606_PAR_BUSY in GPIO.*/" m3 B7 \' s- j2 R7 U: _
GPIOBankIntDisable(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_GPIO_BANK); //用仿真器debug,发现程序能进入这里。3 C P* U5 I+ i& j
+ r) S' I+ _1 X4 G
if(GPIOPinIntStatus(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_V1) == GPIO_INT_PEND). N, J: z3 N9 N1 \$ A
{# d6 Z; [( h; q! O9 S, b- y
GPIOPinIntClear(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_V1); //问题是:用仿真器debug,发现程序不能进入这里。+ X" t4 F' l7 h6 r* k
cs_addr = SOC_EMIFA_CS5_ADDR ;- V/ s9 L/ G* I& _3 W e' K
internal = 0 ;% H5 I6 T" H# R; U5 h
int_flag[0] = 1 ;
! E# n$ O) K7 V) t/ Z }+ C4 o3 W5 O4 k" X% V$ l
if(GPIOPinIntStatus(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_V2) == GPIO_INT_PEND)
+ a2 l8 F9 X: O" M$ h {
2 w/ M0 G' ~1 V7 ~% A5 q GPIOPinIntClear(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_V2); //问题是:用仿真器debug,发现程序不能进入这里。7 ~% f' Z8 l2 m, D6 r# X% y
cs_addr = SOC_EMIFA_CS4_ADDR ;0 p! g8 {; h: ]
internal = 6 ;
* x5 U* x7 M" h' i8 o6 ^! m& r2 r7 X int_flag[1] = 1 ;
2 X! |. A; N& v: W, j! N, ?) o3 ]0 |9 | }
$ o l0 d4 p; h: Q7 N$ ? if(GPIOPinIntStatus(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_C) == GPIO_INT_PEND): }3 c9 c8 M2 e
{2 v) l9 l) f: o" S! T
GPIOPinIntClear(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_C); //问题是:用仿真器debug,发现程序不能进入这里。* W- {+ G6 y, ]: H- k+ Z& ?3 R" G
cs_addr = SOC_EMIFA_CS2_ADDR ;
5 P7 O5 }) S* f4 m* L, f internal = 12 ;$ Z1 |" b7 m: r" u$ }4 @; g
int_flag[2] = 1 ;
3 |2 W; H. y1 }0 H4 \1 v" o# v4 f3 j }
$ W; h' S; P6 g' H& L
2 c N9 o; d# m7 u$ ?1 n GPIOPinWrite(SOC_GPIO_0_REGS, AD7606_PAR_CONVST, GPIO_PIN_LOW);
' s1 g7 p$ v+ R
6 w' l" g! q3 D$ |) q% L GPIOBankIntEnable(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_GPIO_BANK);
: i5 w7 w# b1 b) ?}4 r3 z6 f! W) Z
( d( u# G% |$ ^/ L. y |
|