|
|
您好。使用GPIO中断时,中断能进入ISR,但是不能区分具体的GPIO端口。程序如下:
: O2 P0 ~" ~5 v' t2 n#define AD7606_PAR_BUSY_GPIO_BANK 5
- f9 Q) W% _. o' C! n+ S#define AD7606_PAR_BUSY_GPIO_BANK_INT SYS_INT_GPIO_B5INT% t3 Z. {4 @& Q" x4 i( m# p5 D! |
/ ]$ s5 t; D# p6 U. v/ c* l9 ]#define AD7606_PAR_BUSY_V1 GPIO_TO_PIN(5, 11) //BANK5的中断口5.11 `: f! k E; W, ]9 R
#define AD7606_PAR_BUSY_V2 GPIO_TO_PIN(5, 9) //BANK5的中断口5.9- C0 b5 w. v3 A) n4 p" s. j
#define AD7606_PAR_BUSY_C GPIO_TO_PIN(5, 5) //BANK5的中断口5.5
# N4 @6 s8 u; E! K6 c8 u+ X1 L0 C# [#define AD7606_PAR_BUSY GPIO_TO_PIN(5, 4)
- d- y: N9 M7 f
* W" m; U A0 V M+ {% s#define AD7606_PAR_CONVST GPIO_TO_PIN(5, 1)) J) Z3 u7 }: c& S) X8 g3 @9 n. y
#define AD7606_PAR_RD GPIO_TO_PIN(5, 2)5 X) X% d0 B4 U1 ?0 q( `
#define AD7606_PAR_RESET GPIO_TO_PIN(5, 0)
$ s. `) T7 u- D# y: U! C6 K8 i1 h& g- V' q1 U! T; i. G
4 Q; S% z( }3 O' X8 M4 ?; _4 M
2 L9 z9 A: W0 D* f3 E& V7 O
static void ad7606_irq_setup(ad7606 *ad) {
4 z" d6 O, P1 u+ \ Z- p( A Hwi_Params hwiParams;
" G- }) | r+ l" M, a Hwi_Handle myHwi;2 b9 K+ s0 H& O5 W
Error_Block eb;
* @' `, n: S6 q; C+ b1 T& V. L7 J) a
Error_init(&eb);; v' m# N v, Q+ Z& l
Hwi_Params_init(&hwiParams);
Q5 S& t# b" ?: i4 L. z hwiParams.arg = (unsigned int)ad;
2 h0 O7 E" M z hwiParams.enableInt = FALSE;2 L- }7 O. j' v' m! ^
hwiParams.eventId = SYS_INT_GPIO_B5INT;! |+ s5 M1 r' ]1 V! M4 J
hwiParams.priority = 4;+ a0 g8 G' y9 ~
myHwi = Hwi_create(8, ad7606_busy_hwi, &hwiParams, &eb); //注册BANK5中断处理函数4 y9 z1 l1 H6 I L) b. K
if (myHwi == NULL) : i# F% k7 w: l* _
LOG_FATAL("failed to create hwi");
3 m5 G; X# K9 p4 D$ S$ `9 `
9 [; {3 E( J% `: { /* enable both interrupts */+ N% f/ f0 e3 ^/ F% t: L
Hwi_enableInterrupt(ad->irq_event);
4 m9 O2 @4 y# n}
2 \7 z' i+ [' S* d( \& Z$ I$ |! W( D5 R) C8 }
, |3 o/ @. i: _3 h7 c3 y& P
static void ad7606_gpio_pinmux_setup(ad7606 *ad) {
; L6 D7 q6 ^4 [! Z! n volatile unsigned int savePinMux = 0;
p3 g; K5 }4 z. L& n; Y //初始化5.11、5.9 、 5.5为GPIO口5 U) [7 t" Y. A0 a
savePinMux = HWREG(SOC_SYSCFG_0_REGS + SYSCFG0_PINMUX(11)) & (~(SYSCFG_PINMUX11_PINMUX11_27_24 | SYSCFG_PINMUX11_PINMUX11_19_16));
0 b5 k7 I" i8 B# u' n& W2 ~
0 r5 M- B+ U1 [3 P HWREG(SOC_SYSCFG_0_REGS + SYSCFG0_PINMUX(11)) = (PINMUX11_BUSY_V1_ENABLE | PINMUX11_BUSY_V2_ENABLE | savePinMux);$ |. v" `' K* ?' b+ G! U1 e
" q- E) u8 A$ k0 P- u# x/ p7 J
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));; v/ b, ~ F* n: ?. c. w
1 c1 S( @0 [' V8 l t% p6 {! ~
HWREG(SOC_SYSCFG_0_REGS + SYSCFG0_PINMUX(12)) = (PINMUX12_RESET_ENABLE | PINMUX12_CONVST_ENABLE | PINMUX12_RD_ENABLE | PINMUX12_BUSY_C_ENABLE | savePinMux);
6 S! W, u/ @4 i! s: ^7 `& k& v
: P: T+ x+ M' s5 [! ?# o}2 v9 I& y0 d3 y
! X) z# L2 \+ }/ T$ |! O8 G5 {( i6 w2 @. v, M- o
static void ad7606_gpio_setup(ad7606 *ad) {- T, \# M: U% f6 \$ Z0 `1 ~
/*Set the AD7606_PAR_BUSY to the input mode*/' r* F; V( e: L& D# W
//初始化5.11、5.9 、 5.5为中断口
7 ]8 V6 g+ ^& b8 S: w* v+ d+ G/ p GPIODirModeSet(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_V1, GPIO_DIR_INPUT);. E* @# O5 w7 N, X9 i8 E
GPIODirModeSet(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_V2, GPIO_DIR_INPUT);
4 d, ~. Y0 |9 V/ z9 r; i GPIODirModeSet(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_C, GPIO_DIR_INPUT);
/ Y$ f3 m; \; [3 u; x+ x7 |% C //GPIODirModeSet(SOC_GPIO_0_REGS, AD7606_PAR_BUSY, GPIO_DIR_INPUT);
' L; R2 e( d0 l /*Set the AD7606_PAR_BUSY to the Falling Edge Interrupt*/' O( a* ~( G. s( n, _, @
GPIOIntTypeSet(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_V1, GPIO_INT_TYPE_FALLEDGE);
, C2 f4 C4 b+ D5 h GPIOIntTypeSet(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_V2, GPIO_INT_TYPE_FALLEDGE);
1 y' n$ g8 F0 J; Z% r* N+ n GPIOIntTypeSet(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_C, GPIO_INT_TYPE_FALLEDGE);
E9 { U4 P1 s M: Q8 u //GPIOIntTypeSet(SOC_GPIO_0_REGS, AD7606_PAR_BUSY, GPIO_INT_TYPE_FALLEDGE);; C8 c( H" f" ~5 C, }' v
/*The interrupt setting allows AD7606_PAR_BUSY_GPIO_BANK*/
( i9 E0 {8 @( X8 |' m* J GPIOBankIntEnable(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_GPIO_BANK);* {4 q: I3 T) d2 }$ z" w4 g9 M8 c# L
+ y3 A4 Q- E/ \1 I5 P+ k0 I GPIODirModeSet(SOC_GPIO_0_REGS, AD7606_PAR_RESET, GPIO_DIR_OUTPUT);* b0 \% e7 d- K: ]. X, Q
GPIOPinWrite(SOC_GPIO_0_REGS, AD7606_PAR_RESET, GPIO_PIN_HIGH);5 D' ?: o5 e K9 t* @3 Y! i& v
Task_sleep(1000);
4 g( x2 T* g9 J. ?9 f3 g9 }8 @, Q GPIOPinWrite(SOC_GPIO_0_REGS, AD7606_PAR_RESET, GPIO_PIN_LOW);) J4 b+ z) [- D9 t
Task_sleep(1000);
1 r# f. E7 F' u" ^* I# G
$ S4 ^3 ?& ?9 v+ B2 `0 [ /*Set the AD7606_PAR_CONVST to output mode*/
1 K, S- R' Q& {1 j' V% c" V6 T GPIODirModeSet(SOC_GPIO_0_REGS, AD7606_PAR_CONVST, GPIO_DIR_OUTPUT);4 a/ C6 Y6 \! { g3 H
GPIOPinWrite(SOC_GPIO_0_REGS, AD7606_PAR_CONVST, GPIO_PIN_LOW);- E; |$ D1 r+ _$ O
, |. ]: g& ^5 l/ U1 }, ?( P: O! K GPIODirModeSet(SOC_GPIO_0_REGS, AD7606_PAR_RD, GPIO_DIR_OUTPUT);4 o `. S2 u, R8 o
GPIOPinWrite(SOC_GPIO_0_REGS, AD7606_PAR_RD, GPIO_PIN_HIGH);
+ a. ^# k! z, x& W
8 b; _& m; x* j}; B$ ?7 h/ ^0 N+ D7 v. N
2 {$ Y/ z4 j2 W, I- O3 C* y# D Q V- M4 |3 Y
static void ad7606_busy_hwi(UArg ad_addr) {
, [0 W0 d% m) }7 ^% _! ?* D r
% C4 Z# s. {+ M
( Y' ?* ^- R& r9 N4 W2 y5 n /* Disable the interrupts for pins of bank AD7606_PAR_BUSY in GPIO.*/! A/ j) D6 h% A3 @# Y
GPIOBankIntDisable(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_GPIO_BANK); //用仿真器debug,发现程序能进入这里。
7 z7 f6 G+ M' S1 X
; x# S; f2 o) J if(GPIOPinIntStatus(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_V1) == GPIO_INT_PEND)1 q: @- x% [3 N. B& u
{; P; [8 t0 f# A- R w. n i. m6 A* Q
GPIOPinIntClear(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_V1); //问题是:用仿真器debug,发现程序不能进入这里。" V& r0 w8 J1 k5 p9 ]
cs_addr = SOC_EMIFA_CS5_ADDR ;
7 @" Z6 n/ g2 b internal = 0 ;6 Y0 S; U) Z# `2 d7 o/ q
int_flag[0] = 1 ;
) F' i2 g5 S3 s" y$ Y }
$ L3 H4 s& n, h1 F7 R if(GPIOPinIntStatus(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_V2) == GPIO_INT_PEND)1 F1 c; N5 V4 T0 R! O
{: v4 y v( h3 C; o$ s- q; {1 I, l! E
GPIOPinIntClear(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_V2); //问题是:用仿真器debug,发现程序不能进入这里。
0 @; W8 {% O& {3 B2 C cs_addr = SOC_EMIFA_CS4_ADDR ;/ Q. r* G! J! o1 ]" V \" C
internal = 6 ;3 ~. v" }- o0 n& l$ }& D
int_flag[1] = 1 ;
& H! O3 O6 X+ I }1 \/ M) s, M9 r C1 p
if(GPIOPinIntStatus(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_C) == GPIO_INT_PEND)- K/ T5 [4 ` B* E
{- Z3 z6 w; `2 |- N( ?' Z
GPIOPinIntClear(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_C); //问题是:用仿真器debug,发现程序不能进入这里。: M+ E% `+ j* A( N% I1 f4 j
cs_addr = SOC_EMIFA_CS2_ADDR ;4 T; H0 F6 V) r7 O) a1 w0 Z3 V
internal = 12 ;
+ V9 g( q; f9 F: s$ b$ b& e2 U) J int_flag[2] = 1 ;
7 n* b3 H) [9 X5 P }
/ l4 {/ D: R' I8 `$ h8 m- j6 Q4 C 1 d1 u% V; y/ U' ]$ }( [
GPIOPinWrite(SOC_GPIO_0_REGS, AD7606_PAR_CONVST, GPIO_PIN_LOW);5 l- g8 D$ g* j" p
8 t% D3 G4 @1 \, {! R& B* Z
GPIOBankIntEnable(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_GPIO_BANK);
$ T+ M2 E0 |/ x* T8 K. K( P7 d}+ Y9 j V! ?$ D# U
; e. A, ]% ]# s' @% B- d: \
, Q' q2 c# p; _! }0 A6 c& [+ g% \( M- i i# j2 t6 d
' S" w$ n2 U$ S |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
|