|
|
您好。使用GPIO中断时,中断能进入ISR,但是不能区分具体的GPIO端口。程序如下:
& Y- \& f% J# n5 B# v9 E3 r# J5 u#define AD7606_PAR_BUSY_GPIO_BANK 5
" }: e* z4 U7 Q+ c#define AD7606_PAR_BUSY_GPIO_BANK_INT SYS_INT_GPIO_B5INT
* h+ I k, m1 i. a V. F2 a' r
+ g5 Q( L; C- U7 y* E- ?#define AD7606_PAR_BUSY_V1 GPIO_TO_PIN(5, 11) //BANK5的中断口5.11& J0 \/ L2 V2 [. w+ s
#define AD7606_PAR_BUSY_V2 GPIO_TO_PIN(5, 9) //BANK5的中断口5.9$ V* q6 _( n8 Q
#define AD7606_PAR_BUSY_C GPIO_TO_PIN(5, 5) //BANK5的中断口5.5
N/ d0 X0 V f7 i0 X1 [/ @#define AD7606_PAR_BUSY GPIO_TO_PIN(5, 4)# g. @: d! L: U" k
' I- B0 B, { K% S: }#define AD7606_PAR_CONVST GPIO_TO_PIN(5, 1)2 X4 K, l4 c" x+ n8 A
#define AD7606_PAR_RD GPIO_TO_PIN(5, 2)
# }: ~& r0 J# _. q3 a3 i- [; H0 D6 @#define AD7606_PAR_RESET GPIO_TO_PIN(5, 0)
& D1 ~ K+ y$ v, \6 k+ k6 a# V1 e
7 }; ` e, m$ q4 x$ p
" L+ ^5 V& c* v4 `/ C6 Q
7 x9 |/ m; \, U% e7 b# nstatic void ad7606_irq_setup(ad7606 *ad) {
- e$ W; m' D' e& S" N Hwi_Params hwiParams;+ k! [( w1 I- G- R& O
Hwi_Handle myHwi;: |" Q5 a1 u- Z. S
Error_Block eb;
$ H% D# }2 F3 o+ j; F) j9 J7 k; F" a, I2 i% P- \. z+ a
Error_init(&eb);
8 @6 q+ a& _2 c8 B/ e3 p @: Z Hwi_Params_init(&hwiParams);
! y8 l) K( ]0 D* t) J hwiParams.arg = (unsigned int)ad;. T% d, ?/ S' b) `0 |! H
hwiParams.enableInt = FALSE;8 C7 z) L- p/ x6 c7 m( j
hwiParams.eventId = SYS_INT_GPIO_B5INT;
0 l' Q6 _5 |5 q. a( x k6 P; N hwiParams.priority = 4;
( C& D9 t- Y9 ]. A3 ]5 p myHwi = Hwi_create(8, ad7606_busy_hwi, &hwiParams, &eb); //注册BANK5中断处理函数6 [5 ?% K# I5 K; [6 K2 G
if (myHwi == NULL) 3 k6 D* @4 C5 d
LOG_FATAL("failed to create hwi");! A* p4 M% ~' P3 G
' C$ w4 G" A. q: v1 z# L1 K /* enable both interrupts */8 M& @3 r' X `! ?/ m, {8 M
Hwi_enableInterrupt(ad->irq_event);! u. r7 Z# r5 ~( l' {
}1 s, k5 l8 `: w3 M
& n# a! b9 M% m' Y" g
5 D+ n3 Z! f/ O- Y
static void ad7606_gpio_pinmux_setup(ad7606 *ad) {
# T8 ?; v3 H4 i- J* W volatile unsigned int savePinMux = 0;
" ^% M5 G/ A8 h# s6 U7 l4 `& ~ //初始化5.11、5.9 、 5.5为GPIO口
1 _7 _* _& [7 a savePinMux = HWREG(SOC_SYSCFG_0_REGS + SYSCFG0_PINMUX(11)) & (~(SYSCFG_PINMUX11_PINMUX11_27_24 | SYSCFG_PINMUX11_PINMUX11_19_16));1 S6 J( n( h! O& `
1 L" L( w" o( d+ `( ~) ~
HWREG(SOC_SYSCFG_0_REGS + SYSCFG0_PINMUX(11)) = (PINMUX11_BUSY_V1_ENABLE | PINMUX11_BUSY_V2_ENABLE | savePinMux);
7 v7 h5 e* q; T, m% Y
7 j3 i! f' Y* k' d9 g+ a 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));) O) M: L, E, n: d4 z, d$ f
; B* W1 i4 Q2 h- ~: F HWREG(SOC_SYSCFG_0_REGS + SYSCFG0_PINMUX(12)) = (PINMUX12_RESET_ENABLE | PINMUX12_CONVST_ENABLE | PINMUX12_RD_ENABLE | PINMUX12_BUSY_C_ENABLE | savePinMux);
; m3 U8 j3 J5 X$ B, K. Y7 V. }" ]1 w
}4 y( h2 S& l1 H6 S( L$ C! z
3 v5 U. o0 ~; A' p$ J+ E
9 A. @% s( k0 D: Lstatic void ad7606_gpio_setup(ad7606 *ad) {
9 O: A: V @& t6 e' }3 k% k /*Set the AD7606_PAR_BUSY to the input mode*/, o8 E# j( I6 B- U/ q* X
//初始化5.11、5.9 、 5.5为中断口
7 V* a0 ~0 |$ a7 i/ h GPIODirModeSet(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_V1, GPIO_DIR_INPUT);
2 U# c5 c0 L6 G& h1 d" v3 s7 _ GPIODirModeSet(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_V2, GPIO_DIR_INPUT);
: t' N( @$ C* {7 z7 L2 k GPIODirModeSet(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_C, GPIO_DIR_INPUT);
Z o9 L- b0 D, h- B //GPIODirModeSet(SOC_GPIO_0_REGS, AD7606_PAR_BUSY, GPIO_DIR_INPUT);
& |; _8 e5 z* ]8 v' A /*Set the AD7606_PAR_BUSY to the Falling Edge Interrupt*/, B! g( y) d; S5 v3 X4 t! J7 p
GPIOIntTypeSet(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_V1, GPIO_INT_TYPE_FALLEDGE);
9 g. Q/ ~) l6 v GPIOIntTypeSet(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_V2, GPIO_INT_TYPE_FALLEDGE);
# j; a8 `7 O# c) | o6 F GPIOIntTypeSet(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_C, GPIO_INT_TYPE_FALLEDGE);
% s5 e: _4 @* f //GPIOIntTypeSet(SOC_GPIO_0_REGS, AD7606_PAR_BUSY, GPIO_INT_TYPE_FALLEDGE);! y& ^, M! P, N& ?" t5 T2 p# X/ l, r
/*The interrupt setting allows AD7606_PAR_BUSY_GPIO_BANK*/3 X r% [1 z) g+ t2 E1 M7 y! ^4 ?
GPIOBankIntEnable(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_GPIO_BANK);
! s9 L3 E" D$ G; O( v) h1 D2 |9 g- }4 q5 F+ \' ?
GPIODirModeSet(SOC_GPIO_0_REGS, AD7606_PAR_RESET, GPIO_DIR_OUTPUT);, L# M- {1 @, j0 Z- V4 T! U3 Y6 U
GPIOPinWrite(SOC_GPIO_0_REGS, AD7606_PAR_RESET, GPIO_PIN_HIGH);
* U. }: q$ g3 Z5 X: m _0 _$ a Task_sleep(1000);
% p" \9 }: D1 l GPIOPinWrite(SOC_GPIO_0_REGS, AD7606_PAR_RESET, GPIO_PIN_LOW);- N. A6 b2 h) Z% v4 y
Task_sleep(1000);
8 R* _; u( @: Q0 b5 h4 M- D" c% i) n5 W3 Y+ J: U
/*Set the AD7606_PAR_CONVST to output mode*/9 c% [% B& Y2 A1 R% Q
GPIODirModeSet(SOC_GPIO_0_REGS, AD7606_PAR_CONVST, GPIO_DIR_OUTPUT);
$ X& D( H" V" `* t7 h GPIOPinWrite(SOC_GPIO_0_REGS, AD7606_PAR_CONVST, GPIO_PIN_LOW);! l m. ^8 M( o: `8 m7 T5 m- w
% Z( A( Z/ U; g0 K+ s' S4 d
GPIODirModeSet(SOC_GPIO_0_REGS, AD7606_PAR_RD, GPIO_DIR_OUTPUT);0 `3 [5 h$ k. a- k
GPIOPinWrite(SOC_GPIO_0_REGS, AD7606_PAR_RD, GPIO_PIN_HIGH);
0 m3 x, `$ Z% H! K, I! J4 I
5 n+ J2 X1 c1 J# ^/ K6 E* K- c}2 Z6 i2 c+ c+ z! q c
6 R% {' U' E/ N# _7 w+ w k
6 Q- t& p: D& \2 l+ R6 n
static void ad7606_busy_hwi(UArg ad_addr) {
& g" R6 e2 ?) _+ |! ?6 q& \- m, W
+ ]" _9 W. y0 w8 S/ |8 y" e* K" n! P( Y% w: B" `
/* Disable the interrupts for pins of bank AD7606_PAR_BUSY in GPIO.*/
: K P0 o5 g. s' w, c: j GPIOBankIntDisable(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_GPIO_BANK); //用仿真器debug,发现程序能进入这里。
. o5 G* T, V! H; z: ~3 x3 S7 B: T0 u$ U6 [ J
if(GPIOPinIntStatus(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_V1) == GPIO_INT_PEND)
7 {' s) f. K6 {( n4 h) X {3 O4 U% D5 J4 ~6 O! y
GPIOPinIntClear(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_V1); //问题是:用仿真器debug,发现程序不能进入这里。4 S7 Z& F3 |4 L2 o" A1 o2 I
cs_addr = SOC_EMIFA_CS5_ADDR ;
2 q) C* v1 [) ^8 u" T- P internal = 0 ;; ^- [) p6 Z- g5 Q* q1 L) J4 U+ _
int_flag[0] = 1 ;
& c0 w$ z0 m' q" y! Y4 d; D }. v5 K& Y. o- I+ Q b
if(GPIOPinIntStatus(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_V2) == GPIO_INT_PEND)
+ [0 `# m0 a& o7 ~ {
/ A. }* t) r* [& K# `; J) z GPIOPinIntClear(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_V2); //问题是:用仿真器debug,发现程序不能进入这里。
}3 l/ x$ z- i% N cs_addr = SOC_EMIFA_CS4_ADDR ;
$ W5 f- K1 j( H9 a8 `& s% ? internal = 6 ;
7 F% ~. W/ x" x: H! `, V. ~ int_flag[1] = 1 ;
2 V' W) |0 y" O& H- x1 r }
% H& |, C5 ~$ |4 w1 Y7 r; Z if(GPIOPinIntStatus(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_C) == GPIO_INT_PEND)- |9 w: a V- T6 x# x. a2 P$ r. g5 \
{
9 E/ s& E& Y, D) u; ~ W r GPIOPinIntClear(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_C); //问题是:用仿真器debug,发现程序不能进入这里。
$ c4 D1 ]3 |+ O cs_addr = SOC_EMIFA_CS2_ADDR ;
6 `8 B2 P: E/ q7 i) b) P. L internal = 12 ;
" _2 o7 u0 ]! L* L+ L& ^ int_flag[2] = 1 ;
J' P; D; i: l: H }: Z4 B7 g) L, _
q& B, v. J8 i5 ` A. {8 g GPIOPinWrite(SOC_GPIO_0_REGS, AD7606_PAR_CONVST, GPIO_PIN_LOW);
& F- V. v7 b- {# c
5 M$ E! g9 ]& @ GPIOBankIntEnable(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_GPIO_BANK);
) g4 ]! S% M* v' M4 @& O: J}
; j4 C0 x0 K5 a; C L. W
+ S. y/ M' F. Q( N5 R |
|