|
您好。使用GPIO中断时,中断能进入ISR,但是不能区分具体的GPIO端口。程序如下:
; ~1 S0 l( I) I# Y: P; g6 z#define AD7606_PAR_BUSY_GPIO_BANK 5
% C0 N4 o) C& T3 }, b8 U, i#define AD7606_PAR_BUSY_GPIO_BANK_INT SYS_INT_GPIO_B5INT! O2 {$ W, T- ?. G- W
: ^$ J A9 A7 D8 s9 k2 [% W' d#define AD7606_PAR_BUSY_V1 GPIO_TO_PIN(5, 11) //BANK5的中断口5.11" E1 W, U/ y3 R& @/ F* i
#define AD7606_PAR_BUSY_V2 GPIO_TO_PIN(5, 9) //BANK5的中断口5.9
3 {3 m8 a5 V- @#define AD7606_PAR_BUSY_C GPIO_TO_PIN(5, 5) //BANK5的中断口5.56 E9 W/ R" r6 n- m( B' ]$ X$ Q
#define AD7606_PAR_BUSY GPIO_TO_PIN(5, 4)
: J' s6 k% ?, q$ n- L( c7 R; K- N6 ]; T7 Q$ N2 W) G7 [
#define AD7606_PAR_CONVST GPIO_TO_PIN(5, 1)) Z, a& o$ s ?$ @$ W1 Q7 E; I& L
#define AD7606_PAR_RD GPIO_TO_PIN(5, 2)1 [, A/ s5 n% ?; i3 t3 r) z
#define AD7606_PAR_RESET GPIO_TO_PIN(5, 0) T; H' U' I# P# P/ C; Z3 s
+ u! }7 H# }1 b( q3 u
1 _" o- _3 q& D5 w8 J$ i# b
! w3 W1 M3 T- X) J8 e" j; s1 u( f9 Jstatic void ad7606_irq_setup(ad7606 *ad) {1 n0 h$ A# P5 l d9 S' z0 a
Hwi_Params hwiParams;
" w& e" S+ {' Y% h3 q& p& E Hwi_Handle myHwi;. ]# o& A, i" k7 c# U
Error_Block eb;) c0 u2 b. F U) ?3 t& z( m6 B# v
+ a7 Y2 o& _' O! N Error_init(&eb);
& M+ K0 x6 F i. H Hwi_Params_init(&hwiParams);5 R; R9 \ @$ [7 g! Q
hwiParams.arg = (unsigned int)ad;) y/ m! E7 u$ i* Y. z- o# R' _
hwiParams.enableInt = FALSE;3 U+ Z; }' U4 H3 S- i3 h
hwiParams.eventId = SYS_INT_GPIO_B5INT;
% a) V" ?( _) O! y; w8 h! Q hwiParams.priority = 4;
. g+ ^9 Y. D7 I$ q% E j& s# { myHwi = Hwi_create(8, ad7606_busy_hwi, &hwiParams, &eb); //注册BANK5中断处理函数) [* x3 u8 i8 \
if (myHwi == NULL)
% b! z' I0 D/ D8 z+ z3 ]/ o; D3 _ LOG_FATAL("failed to create hwi");
: R. j2 o9 C& M! A) _9 g& c+ Z }7 T: @, E; O7 L" B: h
/* enable both interrupts */2 ]& z1 s3 ~ s
Hwi_enableInterrupt(ad->irq_event);
" Z3 B! I6 `2 j7 b}$ u W/ |5 W( J2 [2 u
/ s2 T8 \% v5 A5 j C r) \5 ]1 W% e( S2 I- S8 A
static void ad7606_gpio_pinmux_setup(ad7606 *ad) {
5 Q! h! X+ Z1 C. T2 m volatile unsigned int savePinMux = 0;
3 n6 N0 D7 O+ o& X# X& g) f- c //初始化5.11、5.9 、 5.5为GPIO口
9 e W( {% _% ^/ |* w3 ^5 z# K savePinMux = HWREG(SOC_SYSCFG_0_REGS + SYSCFG0_PINMUX(11)) & (~(SYSCFG_PINMUX11_PINMUX11_27_24 | SYSCFG_PINMUX11_PINMUX11_19_16));. a& |* W7 Y- s4 T( c+ T$ D0 L
8 H, j$ s0 g/ e/ M HWREG(SOC_SYSCFG_0_REGS + SYSCFG0_PINMUX(11)) = (PINMUX11_BUSY_V1_ENABLE | PINMUX11_BUSY_V2_ENABLE | savePinMux);+ e+ X/ r3 c2 _, X0 D
( }9 i& d& F" G/ p3 c4 V5 u 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));3 e @# R( q: z7 \! j( O
( N$ J" Z7 \ L6 I6 o: j# ]
HWREG(SOC_SYSCFG_0_REGS + SYSCFG0_PINMUX(12)) = (PINMUX12_RESET_ENABLE | PINMUX12_CONVST_ENABLE | PINMUX12_RD_ENABLE | PINMUX12_BUSY_C_ENABLE | savePinMux);
6 A: e5 h) P" r, }$ o6 k, G, p
; n Z; C2 j, t8 ?# z% R, A}/ s9 ]- I4 |4 V9 \
/ c9 K- j( S, K: G+ j3 B1 _% S7 I0 M4 h) X
static void ad7606_gpio_setup(ad7606 *ad) {
' F! W& C4 {( Z: S /*Set the AD7606_PAR_BUSY to the input mode*/
/ x" Y& U7 B- t# s8 O //初始化5.11、5.9 、 5.5为中断口. Q: E2 g" h3 q5 Q+ @( D
GPIODirModeSet(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_V1, GPIO_DIR_INPUT);
$ T! l5 D, c4 p3 I( `2 t, ~6 O GPIODirModeSet(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_V2, GPIO_DIR_INPUT);, j" C; ~( P( w" t; k
GPIODirModeSet(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_C, GPIO_DIR_INPUT);. [: ?' A3 u) h- j8 I- A$ y
//GPIODirModeSet(SOC_GPIO_0_REGS, AD7606_PAR_BUSY, GPIO_DIR_INPUT);
8 m- Z, L3 Q+ x" Y1 b2 X9 t /*Set the AD7606_PAR_BUSY to the Falling Edge Interrupt*/
( d, V& l, o) S' D& {: f5 Z' j! r GPIOIntTypeSet(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_V1, GPIO_INT_TYPE_FALLEDGE);
! W9 D* h) E( }1 r' u3 } GPIOIntTypeSet(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_V2, GPIO_INT_TYPE_FALLEDGE);
4 [( G% `% R6 j* f) { ~ GPIOIntTypeSet(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_C, GPIO_INT_TYPE_FALLEDGE);
+ ?2 G3 ]- Y& X& B, N* d* G //GPIOIntTypeSet(SOC_GPIO_0_REGS, AD7606_PAR_BUSY, GPIO_INT_TYPE_FALLEDGE);0 ~: Y! u4 V* K& g% A. s- C5 x9 V; @& A
/*The interrupt setting allows AD7606_PAR_BUSY_GPIO_BANK*/
& V0 C5 E, Q% | GPIOBankIntEnable(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_GPIO_BANK);
) A9 j4 ?$ y, T' G# v
: N2 Q, h7 x0 ^ @, X( G6 r+ n GPIODirModeSet(SOC_GPIO_0_REGS, AD7606_PAR_RESET, GPIO_DIR_OUTPUT);0 z1 K1 T7 x ~8 p$ P9 b k
GPIOPinWrite(SOC_GPIO_0_REGS, AD7606_PAR_RESET, GPIO_PIN_HIGH);: K7 K6 q. e" {$ I( E4 N1 y
Task_sleep(1000);
. V9 n. A$ b0 M9 ]% R( u9 R% G GPIOPinWrite(SOC_GPIO_0_REGS, AD7606_PAR_RESET, GPIO_PIN_LOW);
K+ j1 g' S0 L( \: @4 y Task_sleep(1000);
; E" F) r1 O; A; }) a% J4 ]. X0 I
/*Set the AD7606_PAR_CONVST to output mode*/
- k& t% k9 B* a- | GPIODirModeSet(SOC_GPIO_0_REGS, AD7606_PAR_CONVST, GPIO_DIR_OUTPUT);/ r, R# }* i/ i% c+ `- ]: T. q
GPIOPinWrite(SOC_GPIO_0_REGS, AD7606_PAR_CONVST, GPIO_PIN_LOW);& _0 g* W( i; c. Y( v% S0 j: h
# o( ^7 ]2 }6 b" N! ? M7 O GPIODirModeSet(SOC_GPIO_0_REGS, AD7606_PAR_RD, GPIO_DIR_OUTPUT); [+ G7 M) @/ w2 M
GPIOPinWrite(SOC_GPIO_0_REGS, AD7606_PAR_RD, GPIO_PIN_HIGH);
; c" E e/ I" g! W8 w |3 H% y% y9 w( X0 Z
}
% X4 X8 t8 m7 z! F9 o2 Y
3 g6 T4 c- z: l$ Q' P- r: D k9 V* o5 K4 O
static void ad7606_busy_hwi(UArg ad_addr) {
3 X4 @" P# k4 z1 n
) W% Q. o2 e7 n5 X& D
: x. k4 z6 O! U* O: N. V$ a- T' C /* Disable the interrupts for pins of bank AD7606_PAR_BUSY in GPIO.*/
# F4 G9 s0 U: A5 {0 J3 l GPIOBankIntDisable(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_GPIO_BANK); //用仿真器debug,发现程序能进入这里。
! r7 i! m6 X6 d9 a- F7 h- K% G ~" k' J9 }: P
if(GPIOPinIntStatus(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_V1) == GPIO_INT_PEND)
+ p1 |, U2 ~/ i, A6 Y {
: j, [, Q3 C# u- U+ J& \3 e GPIOPinIntClear(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_V1); //问题是:用仿真器debug,发现程序不能进入这里。; F, y8 e0 \: ~3 r" L( P
cs_addr = SOC_EMIFA_CS5_ADDR ;
1 V- q+ Y2 M; _$ j* |( M5 L( b internal = 0 ;0 L# _8 ~ V; H( C2 D2 w# n$ P
int_flag[0] = 1 ;* `" s9 p# f+ m" k! V/ g! A7 s
} z' U% H7 m& _6 c6 x1 w( V9 K& c
if(GPIOPinIntStatus(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_V2) == GPIO_INT_PEND)% `9 w1 h6 J6 ]; u
{% Z# J: I# M1 |8 ~& t5 t
GPIOPinIntClear(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_V2); //问题是:用仿真器debug,发现程序不能进入这里。
/ e: @' ?. R y" K) F, |/ J) E5 q6 z, ^! d cs_addr = SOC_EMIFA_CS4_ADDR ;! R8 Q; p+ n( {9 b/ U& |
internal = 6 ;
& G$ U, N: Y5 ^ int_flag[1] = 1 ;; x/ S. o, j& Z) A( ?, S3 \$ Y
}- ?, P0 X7 y9 L3 n; a. J
if(GPIOPinIntStatus(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_C) == GPIO_INT_PEND) m" o# k! `0 b' h. d
{
; B: h+ K/ E7 @. e1 y GPIOPinIntClear(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_C); //问题是:用仿真器debug,发现程序不能进入这里。
& J9 P7 w F6 X2 \3 h* h* ~ cs_addr = SOC_EMIFA_CS2_ADDR ;
9 M& U5 W! O+ g internal = 12 ;6 B4 _- A& u. m+ x8 ^
int_flag[2] = 1 ;
/ q6 }# S t# A. Y1 f }
8 G! e K& |" D- z
& s# {$ Q+ J% _ GPIOPinWrite(SOC_GPIO_0_REGS, AD7606_PAR_CONVST, GPIO_PIN_LOW);
6 `, S$ I7 q5 E3 ~2 ?8 m/ N4 u, s" r
2 ^. c) O* [2 B5 l/ r GPIOBankIntEnable(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_GPIO_BANK);0 i, R+ K3 B4 E6 ?
}
$ F: D* J; D3 M! p& d3 V! @
/ d. E; s u L
! S- `. q) ?4 J0 B8 J8 Y- |* r
2 v) E- N+ |% s e9 D5 p6 n5 |# ]
|
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
|