|
您好。使用GPIO中断时,中断能进入ISR,但是不能区分具体的GPIO端口。程序如下:6 `6 I1 A: r! T0 P
#define AD7606_PAR_BUSY_GPIO_BANK 5
; n% m8 i* q8 @6 E3 m+ k#define AD7606_PAR_BUSY_GPIO_BANK_INT SYS_INT_GPIO_B5INT, Y' o, z8 e3 W; k. c9 F4 `
( Y$ {+ a9 V' P5 r: O c- ]
#define AD7606_PAR_BUSY_V1 GPIO_TO_PIN(5, 11) //BANK5的中断口5.11
/ g! p& @$ _$ _2 o! ^#define AD7606_PAR_BUSY_V2 GPIO_TO_PIN(5, 9) //BANK5的中断口5.9
0 U% j7 H( M; d* P! w#define AD7606_PAR_BUSY_C GPIO_TO_PIN(5, 5) //BANK5的中断口5.58 E* T% C3 d& ]) M5 o
#define AD7606_PAR_BUSY GPIO_TO_PIN(5, 4)
9 o: o3 R9 t, X) A* n9 u( o/ s; U( l E: M, ` s1 X
#define AD7606_PAR_CONVST GPIO_TO_PIN(5, 1)6 ^$ r; F. _8 l% y( Z
#define AD7606_PAR_RD GPIO_TO_PIN(5, 2)0 f+ U5 k/ a6 k0 f6 P
#define AD7606_PAR_RESET GPIO_TO_PIN(5, 0)+ ^3 {6 T$ n0 | |1 n/ A
; |' C ]- c7 F/ Z
1 i5 k/ J2 h0 @% J- |8 j2 ]1 w4 P2 v$ Q7 o1 e* o; y$ o
static void ad7606_irq_setup(ad7606 *ad) {( u' ^' Y8 q7 T& l v. n
Hwi_Params hwiParams;
- `! t4 b1 d! e0 n% p9 w: V7 t& k: } Hwi_Handle myHwi;
) B! E( F0 h8 w% R Error_Block eb;$ a7 G) q% ^9 _' u$ a) F
9 L- G0 ]; A8 r/ @2 z Error_init(&eb);
, D0 z) k' Q0 M1 G0 e5 G/ K- k Hwi_Params_init(&hwiParams);
1 ]1 P1 y; g( b) v: n# R+ a hwiParams.arg = (unsigned int)ad;
2 ^& m. A# C7 N: g* {. O8 _1 K3 u1 K hwiParams.enableInt = FALSE;
+ _1 d; Z9 q$ s1 g hwiParams.eventId = SYS_INT_GPIO_B5INT;5 I" B! H ?0 l3 s/ R& K- ~
hwiParams.priority = 4;2 x2 `+ y7 v" D, y! M3 c- Y
myHwi = Hwi_create(8, ad7606_busy_hwi, &hwiParams, &eb); //注册BANK5中断处理函数
: F$ ?' }! m7 Z if (myHwi == NULL) ) I; Z) M6 `3 t1 r
LOG_FATAL("failed to create hwi");7 I8 y3 [! w( i& O/ @
W" g1 m8 i1 v) A0 } /* enable both interrupts */
9 \7 z( m W0 L, C Hwi_enableInterrupt(ad->irq_event);
0 V2 F6 K% ?: F}
) ~4 [' _& c: @- a2 y) v7 P) i1 M
( `+ R) T! g5 M( C& u
static void ad7606_gpio_pinmux_setup(ad7606 *ad) {
! [# F# i k' P8 ?/ G- T volatile unsigned int savePinMux = 0;% A/ Z% S: {% m1 [9 @
//初始化5.11、5.9 、 5.5为GPIO口' o" G1 i9 b$ q2 b% u$ m. O% u
savePinMux = HWREG(SOC_SYSCFG_0_REGS + SYSCFG0_PINMUX(11)) & (~(SYSCFG_PINMUX11_PINMUX11_27_24 | SYSCFG_PINMUX11_PINMUX11_19_16));- u( _+ E4 R) o6 n/ p' b4 Y, D$ C d
( c* v4 r3 M# B! M# D1 W HWREG(SOC_SYSCFG_0_REGS + SYSCFG0_PINMUX(11)) = (PINMUX11_BUSY_V1_ENABLE | PINMUX11_BUSY_V2_ENABLE | savePinMux);) Q/ q# v6 Z# o. i# k9 E
9 p/ e; w8 q# Z 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));6 }8 |/ a' \: v. o9 ?! }/ t7 |2 @
2 O/ ?/ r" i. _8 D0 w
HWREG(SOC_SYSCFG_0_REGS + SYSCFG0_PINMUX(12)) = (PINMUX12_RESET_ENABLE | PINMUX12_CONVST_ENABLE | PINMUX12_RD_ENABLE | PINMUX12_BUSY_C_ENABLE | savePinMux);( G/ x- h4 }( Z& U
0 z7 t7 ~2 K; o |& b/ J) T
}/ @; D+ x1 C+ A, ~9 L" l: D
' c8 ~3 {0 W4 l& L9 l
& s7 K: v" O7 \
static void ad7606_gpio_setup(ad7606 *ad) {
0 T4 _8 t- m6 ]# r) D5 i% `2 U /*Set the AD7606_PAR_BUSY to the input mode*/
, p8 h( u$ Q% F8 s! w) H. C& L //初始化5.11、5.9 、 5.5为中断口4 H5 Q" }, D5 d l
GPIODirModeSet(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_V1, GPIO_DIR_INPUT);
. n/ }# G( \# u( P5 `8 I/ h GPIODirModeSet(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_V2, GPIO_DIR_INPUT);2 K( p$ g( u8 G y g/ h
GPIODirModeSet(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_C, GPIO_DIR_INPUT);
% M; N7 x" Q4 R2 G7 V( V: D7 b5 H8 Q //GPIODirModeSet(SOC_GPIO_0_REGS, AD7606_PAR_BUSY, GPIO_DIR_INPUT);
+ t6 S# s1 U) E /*Set the AD7606_PAR_BUSY to the Falling Edge Interrupt*/6 R4 P+ {0 E9 x
GPIOIntTypeSet(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_V1, GPIO_INT_TYPE_FALLEDGE);
1 S( t- e z& o& ^" h& B' R GPIOIntTypeSet(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_V2, GPIO_INT_TYPE_FALLEDGE);. w6 R& D0 j' g* |8 E _; u6 D
GPIOIntTypeSet(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_C, GPIO_INT_TYPE_FALLEDGE);
X3 c; z1 E& {& y9 `7 _) }& F //GPIOIntTypeSet(SOC_GPIO_0_REGS, AD7606_PAR_BUSY, GPIO_INT_TYPE_FALLEDGE);. o4 R P. J4 J1 B
/*The interrupt setting allows AD7606_PAR_BUSY_GPIO_BANK*/
o) U' Z8 o5 ` GPIOBankIntEnable(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_GPIO_BANK);$ `) N- k' D0 K. O( {1 I) d
1 `- P& R& Z# d4 H; F+ I
GPIODirModeSet(SOC_GPIO_0_REGS, AD7606_PAR_RESET, GPIO_DIR_OUTPUT);
+ C9 q) b3 U' ~& R2 P GPIOPinWrite(SOC_GPIO_0_REGS, AD7606_PAR_RESET, GPIO_PIN_HIGH);; Y. x6 E, V" k
Task_sleep(1000);
' B. d9 }# R9 {# D GPIOPinWrite(SOC_GPIO_0_REGS, AD7606_PAR_RESET, GPIO_PIN_LOW);
& |3 Z( W* P0 D* S6 @! `- C Task_sleep(1000);
0 @! W. f4 l* Y
; a" J7 r+ V$ z' U) ~% g. ^% m7 f /*Set the AD7606_PAR_CONVST to output mode*/
- T8 ^( _, v+ y" ?: Z/ v GPIODirModeSet(SOC_GPIO_0_REGS, AD7606_PAR_CONVST, GPIO_DIR_OUTPUT);
) r4 l, F0 @& G( M1 t' J GPIOPinWrite(SOC_GPIO_0_REGS, AD7606_PAR_CONVST, GPIO_PIN_LOW);! B- J2 i/ Y0 u; l. k/ s
1 m! o" |) R+ u" ]
GPIODirModeSet(SOC_GPIO_0_REGS, AD7606_PAR_RD, GPIO_DIR_OUTPUT);2 R7 `, a' C. x
GPIOPinWrite(SOC_GPIO_0_REGS, AD7606_PAR_RD, GPIO_PIN_HIGH);; m; n! X/ [6 Q: I6 O. a9 X
' b! ^5 E1 U* e8 ~7 f, Y, W}! U+ r8 H8 j& l4 l
/ Z& h0 t' m% o! T' y8 t6 i8 e/ ]2 W0 Q9 h7 ~9 }4 a
static void ad7606_busy_hwi(UArg ad_addr) {
7 r! T. p8 U( J& t6 G
* H7 n: J- g/ f
k; Z8 G! E$ ]8 U2 N. r( Q0 ]. _ /* Disable the interrupts for pins of bank AD7606_PAR_BUSY in GPIO.*/
# W0 g4 g- J2 {1 e5 K* N4 K# z l+ d GPIOBankIntDisable(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_GPIO_BANK); //用仿真器debug,发现程序能进入这里。
{! ~' }3 J* V* a$ W( U% n6 N+ {% D5 n7 \* f
if(GPIOPinIntStatus(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_V1) == GPIO_INT_PEND)
/ `# u, s* D8 X$ J {8 K2 f* |. s7 f1 ]/ ]1 D5 e5 a
GPIOPinIntClear(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_V1); //问题是:用仿真器debug,发现程序不能进入这里。/ C# l( V5 m. \9 o. A( v" Y0 O
cs_addr = SOC_EMIFA_CS5_ADDR ;
% X' }1 g. ]/ y, o internal = 0 ;
$ T2 G. G0 n5 }' j! m2 i0 n( R int_flag[0] = 1 ;
5 S: I# A \ n! _' M. \ }
( n! E& a$ o9 s if(GPIOPinIntStatus(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_V2) == GPIO_INT_PEND)2 U5 a* m0 C5 L) E2 w( E6 O! ~
{
& a( C6 k, f/ x+ m GPIOPinIntClear(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_V2); //问题是:用仿真器debug,发现程序不能进入这里。) b' ]( F' j( j( Q. [6 m# \7 Q
cs_addr = SOC_EMIFA_CS4_ADDR ;
" V0 j9 g7 B. B+ R7 a8 m internal = 6 ;( O; F6 R" e' n$ }# V
int_flag[1] = 1 ;
- m6 I- \+ I) t% U9 { }
* i7 Q# ^" q1 e7 a$ H! N9 y7 V if(GPIOPinIntStatus(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_C) == GPIO_INT_PEND)
4 N3 @, s+ r5 K# {* l; V& w! t {
1 B# i. z1 |# }. `5 `. p GPIOPinIntClear(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_C); //问题是:用仿真器debug,发现程序不能进入这里。
O V. b# f8 m& W9 f: D cs_addr = SOC_EMIFA_CS2_ADDR ;
3 I: d7 U4 d( x& Z( {" C, j internal = 12 ;
; `+ b* w7 Y* ?" n) ]$ S int_flag[2] = 1 ;
/ k+ E8 h; P1 W }
0 r5 A+ H+ T8 F 9 [% {% Y8 p3 T9 Q8 [
GPIOPinWrite(SOC_GPIO_0_REGS, AD7606_PAR_CONVST, GPIO_PIN_LOW);; p7 M5 W5 |3 U: u f" Z! @
/ Q! X2 r" T9 Y/ e3 E GPIOBankIntEnable(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_GPIO_BANK);- g% j9 o8 H* p. x1 v
}+ L; [" C- B; b" `' O5 ~
$ I; f& h) j3 C D
5 V1 @# h6 \, {9 O& C
" {4 L3 Z9 Z/ x" q0 O1 u
# L) w1 S# [4 P/ v |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
|