|
您好。使用GPIO中断时,中断能进入ISR,但是不能区分具体的GPIO端口。程序如下:
; H" ]7 \+ ~' o& v. X$ L" R* W. o' R( B#define AD7606_PAR_BUSY_GPIO_BANK 5
1 Q2 z: { ]0 b$ \. v3 a" n#define AD7606_PAR_BUSY_GPIO_BANK_INT SYS_INT_GPIO_B5INT
, k1 f/ V% A/ I2 K$ T2 L& o
* Q* |/ [* j6 @% K. ], D7 N#define AD7606_PAR_BUSY_V1 GPIO_TO_PIN(5, 11) //BANK5的中断口5.11
4 D! o! x, P F& e/ b#define AD7606_PAR_BUSY_V2 GPIO_TO_PIN(5, 9) //BANK5的中断口5.9
. V7 ^: q& r2 y$ |- \! x#define AD7606_PAR_BUSY_C GPIO_TO_PIN(5, 5) //BANK5的中断口5.5% G& Z" h5 d8 O
#define AD7606_PAR_BUSY GPIO_TO_PIN(5, 4), p7 x1 u, `. y* F* b+ n
, }& o6 N3 }% i( L, u
#define AD7606_PAR_CONVST GPIO_TO_PIN(5, 1)" }# |+ T3 ~- l( n0 ^
#define AD7606_PAR_RD GPIO_TO_PIN(5, 2)( m+ ~* w+ g! P+ v
#define AD7606_PAR_RESET GPIO_TO_PIN(5, 0)
3 ?/ m9 F7 b5 f3 W# s$ n( O2 j
5 G$ d' l2 I! K9 B; B( c/ \0 w
B* C/ o( h8 f6 N5 ?8 I5 e* [" q) k8 x
static void ad7606_irq_setup(ad7606 *ad) {: D, M# E! g9 F, j% [1 W7 f! H
Hwi_Params hwiParams;
& y% Q6 O! D# ^% g; ? Hwi_Handle myHwi;# f# y2 Z' D. i, ?5 f% a
Error_Block eb;" A) ~8 l' H2 X( M6 L; z) j# h; s
5 |. ]7 W+ C: q2 T- O Error_init(&eb);
% J/ _3 N7 f& X+ |' O Hwi_Params_init(&hwiParams);
0 d- J s+ Q6 f: j3 t hwiParams.arg = (unsigned int)ad;
8 x& T7 _8 a' S: ~+ O5 Q% D hwiParams.enableInt = FALSE;
' k. W0 I: ]! m( f9 _4 T hwiParams.eventId = SYS_INT_GPIO_B5INT;1 X a% y, k8 R8 R# e6 {# I
hwiParams.priority = 4;# E" |1 h! y: m' |1 ^: Q# i* p- |2 D
myHwi = Hwi_create(8, ad7606_busy_hwi, &hwiParams, &eb); //注册BANK5中断处理函数8 ]2 L1 U. m! q& c
if (myHwi == NULL)
* P1 o e4 y: A9 r# x6 u6 e& w! Y LOG_FATAL("failed to create hwi");
3 H4 F4 t# L# C* N4 [
9 Y8 M) u# w! A% b0 H5 ~; g /* enable both interrupts */ k ]* ?8 v! _. h% S$ U# D
Hwi_enableInterrupt(ad->irq_event);
; x; F* ]- Q' ]; H}* |" K* R/ [" a
( N) g" [" j: M
& M, x+ H% `" [* S$ j0 Y! q& p
static void ad7606_gpio_pinmux_setup(ad7606 *ad) {
2 _+ o( c k2 A" s% w volatile unsigned int savePinMux = 0;
- h, C9 A% l K, `& i1 V //初始化5.11、5.9 、 5.5为GPIO口$ i7 T( h# X+ j: H6 ~. q
savePinMux = HWREG(SOC_SYSCFG_0_REGS + SYSCFG0_PINMUX(11)) & (~(SYSCFG_PINMUX11_PINMUX11_27_24 | SYSCFG_PINMUX11_PINMUX11_19_16));
& f- N3 G5 ?7 b; B+ [4 O1 t( u3 w4 b y$ |" h; v
HWREG(SOC_SYSCFG_0_REGS + SYSCFG0_PINMUX(11)) = (PINMUX11_BUSY_V1_ENABLE | PINMUX11_BUSY_V2_ENABLE | savePinMux);
. i0 J* ^$ j$ b) x2 w' g1 T& T, V) j) r
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 R+ w; L, T- l, c
4 n4 L0 C ~( g
HWREG(SOC_SYSCFG_0_REGS + SYSCFG0_PINMUX(12)) = (PINMUX12_RESET_ENABLE | PINMUX12_CONVST_ENABLE | PINMUX12_RD_ENABLE | PINMUX12_BUSY_C_ENABLE | savePinMux);3 p3 i: W0 h: q
- p4 m1 E9 o: O+ j8 F
}
0 J/ _% h0 Q8 O' \) ^& U+ o* x; i3 A. s. K
" X! }+ J; S$ D0 l( P: c. Estatic void ad7606_gpio_setup(ad7606 *ad) {- x. C; ?8 T, L1 Q6 c' ]/ Z7 E& N
/*Set the AD7606_PAR_BUSY to the input mode*/; L, e, a0 s$ |
//初始化5.11、5.9 、 5.5为中断口( o; v5 _$ J$ F/ y
GPIODirModeSet(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_V1, GPIO_DIR_INPUT);
5 W" t, ^4 k; o0 h( i; V: U0 D5 | GPIODirModeSet(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_V2, GPIO_DIR_INPUT);
9 k/ Y9 ]8 { Y, I& | GPIODirModeSet(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_C, GPIO_DIR_INPUT);
; ?3 l5 l* @5 B+ c //GPIODirModeSet(SOC_GPIO_0_REGS, AD7606_PAR_BUSY, GPIO_DIR_INPUT);
& d! v7 Z5 T: L p9 [( B3 X' b /*Set the AD7606_PAR_BUSY to the Falling Edge Interrupt*/
* _2 `9 N2 b7 b# ]' f! m$ H GPIOIntTypeSet(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_V1, GPIO_INT_TYPE_FALLEDGE);
V: ?+ X5 c' @ GPIOIntTypeSet(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_V2, GPIO_INT_TYPE_FALLEDGE);9 S9 }; q. U+ y2 n+ o. R
GPIOIntTypeSet(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_C, GPIO_INT_TYPE_FALLEDGE);
5 _# S: J; \6 N' Y //GPIOIntTypeSet(SOC_GPIO_0_REGS, AD7606_PAR_BUSY, GPIO_INT_TYPE_FALLEDGE);$ L; Y: e$ A3 I8 M, K
/*The interrupt setting allows AD7606_PAR_BUSY_GPIO_BANK*/
, A- _ Y7 @) M! p. K |4 C GPIOBankIntEnable(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_GPIO_BANK); S6 Q6 ^3 N9 \8 G
6 |/ E1 |; Z8 R3 ]4 a GPIODirModeSet(SOC_GPIO_0_REGS, AD7606_PAR_RESET, GPIO_DIR_OUTPUT);
% e8 V" l: |1 S GPIOPinWrite(SOC_GPIO_0_REGS, AD7606_PAR_RESET, GPIO_PIN_HIGH);
$ c- U7 Y- l0 n+ Q5 s Task_sleep(1000);* V' g/ C5 i7 p4 M* O, u
GPIOPinWrite(SOC_GPIO_0_REGS, AD7606_PAR_RESET, GPIO_PIN_LOW);
6 B- i: a3 A* ~( k/ @$ w3 t4 k Task_sleep(1000);
/ f# z# i. Q# E3 E
- x" A4 ~, d$ \0 S3 m2 v* U /*Set the AD7606_PAR_CONVST to output mode*/
! G7 K6 O+ B X2 u+ Y0 [3 _% J9 ^: c GPIODirModeSet(SOC_GPIO_0_REGS, AD7606_PAR_CONVST, GPIO_DIR_OUTPUT);1 o# Z) p; f/ s( T* U1 @: e) ]
GPIOPinWrite(SOC_GPIO_0_REGS, AD7606_PAR_CONVST, GPIO_PIN_LOW);6 q- e; E8 g: B% t' n- C1 |
! Z, G+ u6 p/ K" B GPIODirModeSet(SOC_GPIO_0_REGS, AD7606_PAR_RD, GPIO_DIR_OUTPUT);6 M+ x. C7 u$ k
GPIOPinWrite(SOC_GPIO_0_REGS, AD7606_PAR_RD, GPIO_PIN_HIGH);) t; v3 s" `3 `6 G! @/ \
" V$ s6 A' B4 O" t2 m3 f W( ^
}
, ^' \" {1 O& s3 q& r* j; a l/ l: ], _. S$ A
+ F8 C8 j, u' B" Tstatic void ad7606_busy_hwi(UArg ad_addr) {
- L1 S: {# P/ C; d2 d
9 c9 S5 T( i1 K: ]
3 L4 s1 u; K9 q( F6 S /* Disable the interrupts for pins of bank AD7606_PAR_BUSY in GPIO.*/
5 S$ o, v8 v. V8 g) O GPIOBankIntDisable(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_GPIO_BANK); //用仿真器debug,发现程序能进入这里。
: ? X& K8 L( G8 X0 Y/ a; I" p* u# Z8 b2 j- S( d1 D
if(GPIOPinIntStatus(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_V1) == GPIO_INT_PEND)( K0 d R3 M3 d! W8 c& S
{% t7 {$ Z: A2 F( _+ B; A: n
GPIOPinIntClear(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_V1); //问题是:用仿真器debug,发现程序不能进入这里。
4 j1 ~* h3 m- L% s8 u8 [ m cs_addr = SOC_EMIFA_CS5_ADDR ;
2 S, _+ M2 w( v! G( m internal = 0 ;
) p! X0 z0 j% W& V int_flag[0] = 1 ;6 f! A9 o& {% a5 n
}
2 W! E" \) }' n- _6 [ if(GPIOPinIntStatus(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_V2) == GPIO_INT_PEND)6 [! u- m: g5 F# K, C' i( a
{
% g! D# j, e6 O7 k3 i GPIOPinIntClear(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_V2); //问题是:用仿真器debug,发现程序不能进入这里。, N- ~* Y5 ^4 B( h. F, r
cs_addr = SOC_EMIFA_CS4_ADDR ;
7 p7 {* U8 {3 J# s$ v k# o: Y5 D internal = 6 ;
+ T% k* ^/ ~0 E3 R8 e int_flag[1] = 1 ;
" p/ B/ G7 c$ b* r! c }1 F6 ^3 z" h# S$ g2 \# k# `
if(GPIOPinIntStatus(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_C) == GPIO_INT_PEND)
* J0 l2 U/ W2 K7 ` {5 N4 X" d8 Y0 L: S j7 N3 }5 [8 t d
GPIOPinIntClear(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_C); //问题是:用仿真器debug,发现程序不能进入这里。5 Z- R$ S7 L& B: M; p
cs_addr = SOC_EMIFA_CS2_ADDR ;: [9 @3 p- c$ U- l
internal = 12 ;2 c! Z! A6 x4 A1 ~ x! X2 f
int_flag[2] = 1 ;
% Y; D* D% Q' w+ Q4 B6 { }# e+ T6 }1 ^4 ~; [! s: d j
" z1 f; k+ | K( p0 @2 k+ E GPIOPinWrite(SOC_GPIO_0_REGS, AD7606_PAR_CONVST, GPIO_PIN_LOW);
% h9 h2 `/ F2 p! L 7 _/ P* {: B5 V% a! v- V, s
GPIOBankIntEnable(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_GPIO_BANK);8 [0 L% W& ?$ I5 ~$ Z c
}: G3 y" ?& t! B( \* t- Q1 f
+ }% `: w( [5 ?1 e
: i; Q, b; Y: D+ U3 z! J# @2 |( v, ~+ a* |. w: v( `
1 e* N2 d- _2 \) p) U! @& p |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
|