|
您好。使用GPIO中断时,中断能进入ISR,但是不能区分具体的GPIO端口。程序如下:
5 g6 m7 X* }. e0 A. S#define AD7606_PAR_BUSY_GPIO_BANK 5) D5 O u3 \( m h; x
#define AD7606_PAR_BUSY_GPIO_BANK_INT SYS_INT_GPIO_B5INT9 }1 G/ b1 [. g' ]
1 k% ^, b7 D. y6 p0 q#define AD7606_PAR_BUSY_V1 GPIO_TO_PIN(5, 11) //BANK5的中断口5.11( m* K _. E6 P( A% g# \. d. n+ ~
#define AD7606_PAR_BUSY_V2 GPIO_TO_PIN(5, 9) //BANK5的中断口5.9! U# Z7 P/ N! w9 t
#define AD7606_PAR_BUSY_C GPIO_TO_PIN(5, 5) //BANK5的中断口5.5+ c% J, r& @) x( ~3 y3 W" d
#define AD7606_PAR_BUSY GPIO_TO_PIN(5, 4), K2 C4 R$ S. P5 Q, ?, Y
' l! {" h0 h4 k* S- d1 I
#define AD7606_PAR_CONVST GPIO_TO_PIN(5, 1)" M3 V5 H' V9 s; m; s* ~3 i
#define AD7606_PAR_RD GPIO_TO_PIN(5, 2)
4 G$ v$ F4 _4 g3 V#define AD7606_PAR_RESET GPIO_TO_PIN(5, 0)/ Y3 P2 w, @; I0 s. p. G1 R
. o+ S2 b3 ]. G! u5 y" u. v
/ }. s" x1 h3 @, C
+ i5 Z. a8 ]- g( J& i( A3 ?. Lstatic void ad7606_irq_setup(ad7606 *ad) {
) y' r: H6 k- n- D* N+ j Hwi_Params hwiParams;% m8 Z8 A |% w* x
Hwi_Handle myHwi;
/ {' z3 h0 {" X Error_Block eb;3 E: T& Z/ T ]
- ^ j2 n4 D% {0 L& m# d Error_init(&eb);
0 {1 |5 c. I9 U& | Hwi_Params_init(&hwiParams); i" s2 P {9 T: ^5 g! h- I' g/ d
hwiParams.arg = (unsigned int)ad;
1 P p& N, e T" d& A1 L hwiParams.enableInt = FALSE;
# {( R4 ^+ r) ]) e8 G hwiParams.eventId = SYS_INT_GPIO_B5INT;
3 x6 ?, d* R% U5 k- H F0 f hwiParams.priority = 4;
6 T2 g8 a! `& i& a$ r& I myHwi = Hwi_create(8, ad7606_busy_hwi, &hwiParams, &eb); //注册BANK5中断处理函数0 Y+ `8 }2 C+ q* ^
if (myHwi == NULL)
% a9 \' I( o, y5 y S+ W- j LOG_FATAL("failed to create hwi");
$ c3 ?0 h8 S2 {8 d0 [
1 ^( z6 @) \6 P- p9 D% `' X /* enable both interrupts */+ p$ D F. z$ ?0 O; m, L* Y1 ?5 p
Hwi_enableInterrupt(ad->irq_event); J0 M2 l1 U/ ?/ Q- h0 N+ b
}
4 a7 P( |3 I' Z. b
/ N( w# y8 m1 T, [9 i& x7 W$ g# H' h; p' a
static void ad7606_gpio_pinmux_setup(ad7606 *ad) {5 o' Z5 Y# f3 V$ L7 B% F# r+ f
volatile unsigned int savePinMux = 0;8 N2 E/ q% N6 N5 w' ^6 L; |
//初始化5.11、5.9 、 5.5为GPIO口& W9 P6 A% R: P. l
savePinMux = HWREG(SOC_SYSCFG_0_REGS + SYSCFG0_PINMUX(11)) & (~(SYSCFG_PINMUX11_PINMUX11_27_24 | SYSCFG_PINMUX11_PINMUX11_19_16));
: F. \0 T& O$ h& [7 L9 z1 ] d" O# @1 f2 x- Z" F7 g, f7 X
HWREG(SOC_SYSCFG_0_REGS + SYSCFG0_PINMUX(11)) = (PINMUX11_BUSY_V1_ENABLE | PINMUX11_BUSY_V2_ENABLE | savePinMux);$ `' _3 m; P0 w
2 _; F" Y. L- v' d3 V
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));. B4 W i) Q5 @4 t
! N+ e! y1 o# \
HWREG(SOC_SYSCFG_0_REGS + SYSCFG0_PINMUX(12)) = (PINMUX12_RESET_ENABLE | PINMUX12_CONVST_ENABLE | PINMUX12_RD_ENABLE | PINMUX12_BUSY_C_ENABLE | savePinMux);4 S; P5 E. I/ k- [# p1 q4 G! y' f
8 \; \/ [5 X U}: L( _( J& c, z' S; c7 ?: E k3 Q
8 x; f" K% w5 Q! P
! g/ Z8 P9 I) r# ]3 cstatic void ad7606_gpio_setup(ad7606 *ad) {, w5 N2 b6 e. `8 V8 g: A
/*Set the AD7606_PAR_BUSY to the input mode*/2 Q) W6 b4 h; D5 F
//初始化5.11、5.9 、 5.5为中断口
& ~5 j% _! k+ H0 ~+ a; U! \ GPIODirModeSet(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_V1, GPIO_DIR_INPUT);
; N! y. C% Z# Q/ i GPIODirModeSet(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_V2, GPIO_DIR_INPUT);
# T: A9 C8 Z, J) B2 p2 m GPIODirModeSet(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_C, GPIO_DIR_INPUT);/ V1 L6 t {% B* y+ X: B
//GPIODirModeSet(SOC_GPIO_0_REGS, AD7606_PAR_BUSY, GPIO_DIR_INPUT);9 h1 u( x# C; N2 G
/*Set the AD7606_PAR_BUSY to the Falling Edge Interrupt*/( a" }: F1 a+ y/ R9 Q7 D& g
GPIOIntTypeSet(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_V1, GPIO_INT_TYPE_FALLEDGE);# b9 x5 p0 i( W4 V+ Y! R
GPIOIntTypeSet(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_V2, GPIO_INT_TYPE_FALLEDGE);
( f1 d5 S3 l0 w S3 M* a0 H; |- s. D GPIOIntTypeSet(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_C, GPIO_INT_TYPE_FALLEDGE);
6 K. W: D# M) f' u# v5 L //GPIOIntTypeSet(SOC_GPIO_0_REGS, AD7606_PAR_BUSY, GPIO_INT_TYPE_FALLEDGE);5 Q' k1 b0 c6 D5 ^
/*The interrupt setting allows AD7606_PAR_BUSY_GPIO_BANK*/5 e j: x7 c) v/ J5 G4 ~
GPIOBankIntEnable(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_GPIO_BANK);
: u5 Q- Y" o2 I; ?. T1 @# r; e% {3 H9 e
GPIODirModeSet(SOC_GPIO_0_REGS, AD7606_PAR_RESET, GPIO_DIR_OUTPUT);4 C+ Y$ N; N* T8 @" Q
GPIOPinWrite(SOC_GPIO_0_REGS, AD7606_PAR_RESET, GPIO_PIN_HIGH);/ @# X$ w/ ~4 P, s
Task_sleep(1000);+ a( {& q+ t! {: z. J) S
GPIOPinWrite(SOC_GPIO_0_REGS, AD7606_PAR_RESET, GPIO_PIN_LOW);
5 |" V$ `( {$ p5 z* b, O Task_sleep(1000);
: ^- P* t4 X% ^( \8 i
- ^) A2 G6 X$ g3 h2 s( V /*Set the AD7606_PAR_CONVST to output mode*/
/ A6 P* [$ s6 G2 `+ E GPIODirModeSet(SOC_GPIO_0_REGS, AD7606_PAR_CONVST, GPIO_DIR_OUTPUT);- ]; W1 R2 c) H; I1 B
GPIOPinWrite(SOC_GPIO_0_REGS, AD7606_PAR_CONVST, GPIO_PIN_LOW);
5 b5 ?: C1 Y0 ^3 p5 _7 {
$ ?% U: z7 b$ A3 h GPIODirModeSet(SOC_GPIO_0_REGS, AD7606_PAR_RD, GPIO_DIR_OUTPUT);( q, ^. n1 r% y' S
GPIOPinWrite(SOC_GPIO_0_REGS, AD7606_PAR_RD, GPIO_PIN_HIGH);
8 ?+ @6 o w7 }& |) V8 U& f( |
; Z) Z+ ~$ U" c5 ~7 x, g* F}
& j8 T( D. r$ g2 O$ ] S2 A7 z( o# D* p& T
# s8 o6 x8 W+ `0 _3 n: g, F% |4 Wstatic void ad7606_busy_hwi(UArg ad_addr) {
0 V' b% Z, H1 c% f
5 C, {: ?. N; _/ \( o! W" H: m2 i+ k: z2 j/ G/ g n8 X9 H
/* Disable the interrupts for pins of bank AD7606_PAR_BUSY in GPIO.*/: x: L! W% P( ^4 z
GPIOBankIntDisable(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_GPIO_BANK); //用仿真器debug,发现程序能进入这里。
# K& ~/ A2 O6 I6 X6 h6 I: M4 Z+ j- c9 a9 m
if(GPIOPinIntStatus(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_V1) == GPIO_INT_PEND)! U; b9 l: o& ?5 |" v3 ?1 Y" B; t
{
$ `/ b" f0 _0 h, o/ f. m/ Z GPIOPinIntClear(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_V1); //问题是:用仿真器debug,发现程序不能进入这里。
U$ M* Q' X" Z( `6 d cs_addr = SOC_EMIFA_CS5_ADDR ;& q# x+ Q1 p7 h8 D, `
internal = 0 ;3 w5 Z+ Z) [. |% `/ D
int_flag[0] = 1 ;
2 V; w- I5 k! o. s8 T }* ?4 U) E/ [; u' L/ L3 N9 |
if(GPIOPinIntStatus(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_V2) == GPIO_INT_PEND) O3 t2 o0 {/ f. O8 V0 R4 v
{
9 D7 ^* v3 f) O0 y; s GPIOPinIntClear(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_V2); //问题是:用仿真器debug,发现程序不能进入这里。
7 l9 t, n1 O# R9 a- E8 g cs_addr = SOC_EMIFA_CS4_ADDR ;
6 }" U* `! h6 ^3 | x0 x7 s internal = 6 ;
2 x F$ K/ s" E$ @# n int_flag[1] = 1 ;
( A# U) q7 R% q7 f }
% }& o( F' ~# i# K5 r! R0 ~1 v& z if(GPIOPinIntStatus(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_C) == GPIO_INT_PEND)
- l4 L( Z2 ~$ [) l G4 j/ j {/ Z( T4 p9 Y3 f. |1 h! U$ B" J7 p
GPIOPinIntClear(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_C); //问题是:用仿真器debug,发现程序不能进入这里。; u/ y) O6 M8 A+ N W0 L+ R4 i5 w7 p; y
cs_addr = SOC_EMIFA_CS2_ADDR ;5 j. A& [% v2 {6 z
internal = 12 ;0 P4 c" q6 l2 ~6 G
int_flag[2] = 1 ;, R& T9 ~4 S1 {; } _3 w
} q5 L' b1 r/ M" g
7 I3 H/ e. D4 {& Y GPIOPinWrite(SOC_GPIO_0_REGS, AD7606_PAR_CONVST, GPIO_PIN_LOW); `" j2 z4 b0 b
1 a/ _- _7 c1 m: H' A# ^- ^- S GPIOBankIntEnable(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_GPIO_BANK);
% Y3 A4 s& f, O! y' z7 _1 H}
0 F! r6 n' @& C+ O, D- `" ]* [& p. [2 M) X
|
|