|
|
您好。使用GPIO中断时,中断能进入ISR,但是不能区分具体的GPIO端口。程序如下:
& u f5 L5 f1 m) C#define AD7606_PAR_BUSY_GPIO_BANK 5
! O3 ~( d% t, X. ?7 ?#define AD7606_PAR_BUSY_GPIO_BANK_INT SYS_INT_GPIO_B5INT" Q+ M+ i6 t9 p1 s1 _
9 Q6 X# l/ ^* f( \, e# L7 P#define AD7606_PAR_BUSY_V1 GPIO_TO_PIN(5, 11) //BANK5的中断口5.111 Y# k: e3 Z4 e: d/ L
#define AD7606_PAR_BUSY_V2 GPIO_TO_PIN(5, 9) //BANK5的中断口5.9
. q3 B |" ?: }#define AD7606_PAR_BUSY_C GPIO_TO_PIN(5, 5) //BANK5的中断口5.5- E4 i1 u" E$ Z7 b
#define AD7606_PAR_BUSY GPIO_TO_PIN(5, 4); k. S: n7 U, J7 I2 @& n7 O
/ O3 S7 F: O* M; K0 y
#define AD7606_PAR_CONVST GPIO_TO_PIN(5, 1)
, k/ O3 N* |# C( l#define AD7606_PAR_RD GPIO_TO_PIN(5, 2)
, S, ~/ n6 C" A# t. W u#define AD7606_PAR_RESET GPIO_TO_PIN(5, 0)
# S5 ?0 I9 d8 k! a0 U# N
( t u1 d8 r; @- r) s, W$ E8 z( E) q; F
7 K F4 f1 p% tstatic void ad7606_irq_setup(ad7606 *ad) {
# P8 K, w6 n( S1 G% C; Z& ? Hwi_Params hwiParams;$ T# R9 k- k X' x5 V6 Q) b. F
Hwi_Handle myHwi;- I/ o2 u8 s* u' f
Error_Block eb;
$ i/ R( @9 l5 v$ N+ }/ w" O* s4 j; i, t$ W' Y% B2 h
Error_init(&eb);
0 ?/ ~9 ^) ?/ b Hwi_Params_init(&hwiParams);" F% b& A7 N9 C6 c9 |
hwiParams.arg = (unsigned int)ad;5 S: f' ?) ^! F. E$ z- S2 O: V# l
hwiParams.enableInt = FALSE;
8 b+ E6 P$ p) N S4 J* b- y hwiParams.eventId = SYS_INT_GPIO_B5INT;( V L+ D& G$ K C. ~
hwiParams.priority = 4;
3 G7 f' U) {' U- m- G myHwi = Hwi_create(8, ad7606_busy_hwi, &hwiParams, &eb); //注册BANK5中断处理函数 w1 E3 _. l9 j8 a7 G
if (myHwi == NULL)
- H" z" K% I2 L LOG_FATAL("failed to create hwi");5 Y! a! P* @9 R* A& E5 D2 F! S
5 a! F V. Y/ M
/* enable both interrupts */6 k4 ? b1 }1 \1 \
Hwi_enableInterrupt(ad->irq_event);
, s3 l8 D @! ]8 ~+ n+ g}
, M( J* C& D, E: d/ ^: S
( \9 h5 Y- w9 _) o9 U" V8 f1 P0 Y+ \; Q( o
- u! p8 ]) m( Ustatic void ad7606_gpio_pinmux_setup(ad7606 *ad) {
9 ]7 ^ t& w6 ^# c3 o" ~: Z volatile unsigned int savePinMux = 0;
. A* ]- |/ F& E0 T" i# s //初始化5.11、5.9 、 5.5为GPIO口
$ @+ n7 N) I% ~2 b savePinMux = HWREG(SOC_SYSCFG_0_REGS + SYSCFG0_PINMUX(11)) & (~(SYSCFG_PINMUX11_PINMUX11_27_24 | SYSCFG_PINMUX11_PINMUX11_19_16));8 ? z& C- n9 N8 B1 A3 H
; }5 ~( f2 V- t9 x t- m5 c
HWREG(SOC_SYSCFG_0_REGS + SYSCFG0_PINMUX(11)) = (PINMUX11_BUSY_V1_ENABLE | PINMUX11_BUSY_V2_ENABLE | savePinMux);9 w0 L% x9 s0 t2 ~( q4 r
: @ }6 }/ k, [& e4 f 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));+ _& n/ o- A+ r; m9 Q/ l
: n) g' _4 A! J- D7 `- l( ~" t* j HWREG(SOC_SYSCFG_0_REGS + SYSCFG0_PINMUX(12)) = (PINMUX12_RESET_ENABLE | PINMUX12_CONVST_ENABLE | PINMUX12_RD_ENABLE | PINMUX12_BUSY_C_ENABLE | savePinMux);: S: D) ]1 q! Z
) s6 J6 o2 j& V}& a) f2 y4 o8 w+ G
7 o/ V* ^& d$ X, _5 B& M
5 g# t9 _: ?% O% t. N
static void ad7606_gpio_setup(ad7606 *ad) {
/ n* y& y# Q5 |9 {. r0 ^6 J /*Set the AD7606_PAR_BUSY to the input mode*/
$ y! y* A; h# A% Z% L //初始化5.11、5.9 、 5.5为中断口1 z$ B; C1 N/ x4 |$ L3 r7 `5 s! Z {
GPIODirModeSet(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_V1, GPIO_DIR_INPUT);
9 I k" z% l, M" X9 r" { GPIODirModeSet(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_V2, GPIO_DIR_INPUT);
7 A( s# ]; W5 p GPIODirModeSet(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_C, GPIO_DIR_INPUT);
& a; F2 O6 D! S4 V //GPIODirModeSet(SOC_GPIO_0_REGS, AD7606_PAR_BUSY, GPIO_DIR_INPUT);2 d1 }1 r+ f7 J" N
/*Set the AD7606_PAR_BUSY to the Falling Edge Interrupt*/
* X4 k, @8 i0 D- t1 ]' k: _ GPIOIntTypeSet(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_V1, GPIO_INT_TYPE_FALLEDGE);
. E8 }5 w7 E. g$ {+ [6 x GPIOIntTypeSet(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_V2, GPIO_INT_TYPE_FALLEDGE);
: t! w: a* Y* {% a GPIOIntTypeSet(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_C, GPIO_INT_TYPE_FALLEDGE);3 o5 N. b! ?+ y7 |
//GPIOIntTypeSet(SOC_GPIO_0_REGS, AD7606_PAR_BUSY, GPIO_INT_TYPE_FALLEDGE);
; A! v' e/ P; d/ M6 h, w$ { /*The interrupt setting allows AD7606_PAR_BUSY_GPIO_BANK*/
5 r' E" Q4 N0 V2 T* _. t( C* A" v GPIOBankIntEnable(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_GPIO_BANK);
8 P3 B0 @3 ^% A3 J; p3 f- e
# q, E* C. o( H) N2 N$ b; H GPIODirModeSet(SOC_GPIO_0_REGS, AD7606_PAR_RESET, GPIO_DIR_OUTPUT);, x$ {/ p3 G6 w, ?1 p. a
GPIOPinWrite(SOC_GPIO_0_REGS, AD7606_PAR_RESET, GPIO_PIN_HIGH);' O; \* w- Z d4 u- r
Task_sleep(1000);
% w+ U% x' f3 \ GPIOPinWrite(SOC_GPIO_0_REGS, AD7606_PAR_RESET, GPIO_PIN_LOW);3 Y; X3 C0 G0 p6 ]3 l; h$ c% t, y0 |
Task_sleep(1000);$ B: V, h: U. t. f) d2 Y' Q3 }
% Q I' X+ {( J /*Set the AD7606_PAR_CONVST to output mode*/" |( P4 C1 W' l0 G
GPIODirModeSet(SOC_GPIO_0_REGS, AD7606_PAR_CONVST, GPIO_DIR_OUTPUT);
0 F7 b6 l# o& d' B3 _, U5 D/ e GPIOPinWrite(SOC_GPIO_0_REGS, AD7606_PAR_CONVST, GPIO_PIN_LOW);. j5 w# A$ G+ W7 I7 K3 o, X
0 O3 R4 W6 V& S6 m2 k GPIODirModeSet(SOC_GPIO_0_REGS, AD7606_PAR_RD, GPIO_DIR_OUTPUT);
" D( T' { n" o1 o1 k, W GPIOPinWrite(SOC_GPIO_0_REGS, AD7606_PAR_RD, GPIO_PIN_HIGH);6 n# ]1 L" Y3 w: H
( J S. \7 b) U7 R
}# @1 S( J8 z. P
) m8 o, P5 [$ e
. E! n. U6 [- a; zstatic void ad7606_busy_hwi(UArg ad_addr) {
) ^, g/ }/ I' g' v. @6 ?: |
5 b; j( _/ d1 r9 P7 Z7 h! V$ O3 O' K* }
/* Disable the interrupts for pins of bank AD7606_PAR_BUSY in GPIO.*/
0 F3 n5 c! X# s& Q9 c" h GPIOBankIntDisable(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_GPIO_BANK); //用仿真器debug,发现程序能进入这里。$ j8 X7 ?2 Y& M0 A) h: ~2 i" G" B
9 x* u+ W4 M& I) ?$ z, Q; ^7 q if(GPIOPinIntStatus(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_V1) == GPIO_INT_PEND)
7 \3 ~% L3 c- j- ] {
& {( e! K \) R GPIOPinIntClear(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_V1); //问题是:用仿真器debug,发现程序不能进入这里。. v* i* B4 ?6 K2 l
cs_addr = SOC_EMIFA_CS5_ADDR ;
2 a7 W$ c' R. f# G- {! m, J internal = 0 ;4 e, r6 a ]# S* g3 e
int_flag[0] = 1 ;
3 A5 e0 W2 L) L4 \ } p$ `/ h; c2 V! x
if(GPIOPinIntStatus(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_V2) == GPIO_INT_PEND)" s; {* z6 p3 Y% E7 F7 X
{* k( \: w& j* G% K! h9 f$ k/ r
GPIOPinIntClear(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_V2); //问题是:用仿真器debug,发现程序不能进入这里。3 [. d, d- Y+ f# n! \
cs_addr = SOC_EMIFA_CS4_ADDR ;2 f7 F D% j9 T4 K+ ~$ P+ l& t- ~
internal = 6 ;
! ^2 n' L2 i" |" g5 g int_flag[1] = 1 ;
7 a9 l9 a: Q/ e3 O1 L }) F v5 G, ~' o
if(GPIOPinIntStatus(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_C) == GPIO_INT_PEND)
6 ~4 P" {+ [" R! z& l# h {
: K- p8 T! Y* |' F GPIOPinIntClear(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_C); //问题是:用仿真器debug,发现程序不能进入这里。
- w4 s3 J* V& ]0 H7 C cs_addr = SOC_EMIFA_CS2_ADDR ;
, f: Z. }( w% Y$ X" r internal = 12 ;
$ o) _% T5 t" l: { int_flag[2] = 1 ; `% ~/ F' E' Q: y2 z j
}# v& j4 }8 \8 V) p! q! o1 [
9 S+ I/ ], ~0 p1 J
GPIOPinWrite(SOC_GPIO_0_REGS, AD7606_PAR_CONVST, GPIO_PIN_LOW);
( s9 K9 S( ? i& d1 h0 [
; l7 i: H! j) T: A1 S5 M+ S7 `! T GPIOBankIntEnable(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_GPIO_BANK);- q- h+ M9 ]% r( K$ I0 T
}. F$ E3 _$ W! J, T
+ Z, S' |: _( z- M. l+ s
5 I% E* i& K6 i1 U+ k9 m9 i/ ]' N t. W% g" \, Q8 z
6 j# T/ [# J1 C [: M+ k
|
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
|