|
您好。使用GPIO中断时,中断能进入ISR,但是不能区分具体的GPIO端口。程序如下:
( a5 }9 h1 }+ o3 F( K, @#define AD7606_PAR_BUSY_GPIO_BANK 5; Y. |" R% q, @* q) o! [8 S
#define AD7606_PAR_BUSY_GPIO_BANK_INT SYS_INT_GPIO_B5INT" W$ t f* W' d8 n) C% d5 w. q- a
# ]/ ]) ^% ?+ o) X9 v#define AD7606_PAR_BUSY_V1 GPIO_TO_PIN(5, 11) //BANK5的中断口5.11
5 ^ _: E4 A* z" ~6 P# b9 ?#define AD7606_PAR_BUSY_V2 GPIO_TO_PIN(5, 9) //BANK5的中断口5.9
7 H7 {2 v. O: g0 R8 T! k#define AD7606_PAR_BUSY_C GPIO_TO_PIN(5, 5) //BANK5的中断口5.5
( t' s- y% s7 O+ ~* |3 g& b#define AD7606_PAR_BUSY GPIO_TO_PIN(5, 4)2 V+ o# y8 d* t: {
! p( x v6 ^ h1 T4 O! _- m
#define AD7606_PAR_CONVST GPIO_TO_PIN(5, 1)
$ _5 `6 J/ M$ l- Y/ ~: ^#define AD7606_PAR_RD GPIO_TO_PIN(5, 2)
7 A- c, x7 i3 ?7 }- D' b! Y#define AD7606_PAR_RESET GPIO_TO_PIN(5, 0)" C2 h/ e3 N+ g" M
) ~. n- D+ X% K+ }9 \% Z
1 Y. K' N- s; N4 c c
/ m9 C+ t0 h+ A3 tstatic void ad7606_irq_setup(ad7606 *ad) {
/ {0 C4 g2 q# \0 j( x* _8 N Hwi_Params hwiParams;
4 N) N8 H. ?) w9 a. J; U Hwi_Handle myHwi;
* m6 h9 L$ ?" G9 A0 K2 C Error_Block eb;
4 N& `+ g' t' x1 V- {6 @
$ A2 d2 h; t4 t; s Error_init(&eb);+ p& y- z& @4 w& {
Hwi_Params_init(&hwiParams);
1 W% { Y+ V2 P: K hwiParams.arg = (unsigned int)ad;
+ q* n/ b1 b5 @$ m( |; H hwiParams.enableInt = FALSE;% P$ R) q2 l' v# b. T+ W0 d
hwiParams.eventId = SYS_INT_GPIO_B5INT;7 N" z1 } ^ J& s* J
hwiParams.priority = 4;. ]: G$ g$ Z# q: Q
myHwi = Hwi_create(8, ad7606_busy_hwi, &hwiParams, &eb); //注册BANK5中断处理函数
& y/ Q) b" U* [ if (myHwi == NULL)
8 k* y8 O [, c! b+ Y LOG_FATAL("failed to create hwi");: A- U& ~% k3 w/ t [
! M: @* C8 I3 v. b# L+ t$ m* [
/* enable both interrupts */: u! D0 i4 Z' [) G+ C
Hwi_enableInterrupt(ad->irq_event);
6 Z5 P/ ^8 r" d' O J}! C8 f0 l9 x5 V7 L2 I3 B% m- e7 S9 {
7 k7 m$ L: ?- d1 c$ p: ]* v+ x9 h) {, S
static void ad7606_gpio_pinmux_setup(ad7606 *ad) {
" I; B4 a! U! n# B, i# E volatile unsigned int savePinMux = 0;( A7 A0 H f2 y1 W
//初始化5.11、5.9 、 5.5为GPIO口
( N% i6 j: g/ A1 B+ b* t savePinMux = HWREG(SOC_SYSCFG_0_REGS + SYSCFG0_PINMUX(11)) & (~(SYSCFG_PINMUX11_PINMUX11_27_24 | SYSCFG_PINMUX11_PINMUX11_19_16));
. ?; w) i! F5 e0 X# {' x
1 q0 O' N) Z9 r HWREG(SOC_SYSCFG_0_REGS + SYSCFG0_PINMUX(11)) = (PINMUX11_BUSY_V1_ENABLE | PINMUX11_BUSY_V2_ENABLE | savePinMux);
3 ]2 Y2 Z" e( }4 n& R! e: A% w1 l/ i: x B' u* T$ Q
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));
S! y# C4 G4 M6 T X+ i' |/ F( m! I9 Y
HWREG(SOC_SYSCFG_0_REGS + SYSCFG0_PINMUX(12)) = (PINMUX12_RESET_ENABLE | PINMUX12_CONVST_ENABLE | PINMUX12_RD_ENABLE | PINMUX12_BUSY_C_ENABLE | savePinMux);
- q5 Z) d3 N! A% ?$ g3 G8 _- y
( ?2 H- L T$ D}8 e( P% z* x4 |/ w
! ~. X% d8 g" \+ K/ o P
: q: N4 z+ `) O
static void ad7606_gpio_setup(ad7606 *ad) {% |4 y) r6 u0 D! j
/*Set the AD7606_PAR_BUSY to the input mode*/& y) C% q( J, I( _
//初始化5.11、5.9 、 5.5为中断口2 b$ ~. D& t" m% k
GPIODirModeSet(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_V1, GPIO_DIR_INPUT);) U3 k6 v5 Q/ K+ [' J2 s2 n/ ^/ H
GPIODirModeSet(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_V2, GPIO_DIR_INPUT);
' [, w ?" k5 W) a GPIODirModeSet(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_C, GPIO_DIR_INPUT);
7 @. p7 w0 y1 I* X* ~7 G. n3 j //GPIODirModeSet(SOC_GPIO_0_REGS, AD7606_PAR_BUSY, GPIO_DIR_INPUT);
% N9 j% Z8 @& v% f1 V /*Set the AD7606_PAR_BUSY to the Falling Edge Interrupt*/9 d- G$ m: ?5 P5 i& n% m# f
GPIOIntTypeSet(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_V1, GPIO_INT_TYPE_FALLEDGE);" M: X/ S. {8 s9 N1 D
GPIOIntTypeSet(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_V2, GPIO_INT_TYPE_FALLEDGE);
3 h& H$ F1 m' S7 C: t GPIOIntTypeSet(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_C, GPIO_INT_TYPE_FALLEDGE);8 n# J4 w- ~: ~1 P( ^
//GPIOIntTypeSet(SOC_GPIO_0_REGS, AD7606_PAR_BUSY, GPIO_INT_TYPE_FALLEDGE);, |8 N4 p s. t
/*The interrupt setting allows AD7606_PAR_BUSY_GPIO_BANK*/
- e9 A3 k/ d' Y" ~0 I7 _; o& s- p2 @ GPIOBankIntEnable(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_GPIO_BANK);" Q; [' ?* s; u% }% z6 F
9 a5 C5 O0 M, p" p) q4 d6 r2 D2 b
GPIODirModeSet(SOC_GPIO_0_REGS, AD7606_PAR_RESET, GPIO_DIR_OUTPUT);
$ j5 `) j6 F" U& P& f! r: Z GPIOPinWrite(SOC_GPIO_0_REGS, AD7606_PAR_RESET, GPIO_PIN_HIGH);
9 t9 u3 J: j) ^) F% d4 ? Task_sleep(1000);. v# f& C$ _9 I9 p
GPIOPinWrite(SOC_GPIO_0_REGS, AD7606_PAR_RESET, GPIO_PIN_LOW);
" n9 {- p N, u6 E0 n7 M Task_sleep(1000);: k* D4 n) q9 b( [" y
8 @+ p+ A" r( s0 W /*Set the AD7606_PAR_CONVST to output mode*/
6 j& W% I, L! `3 e GPIODirModeSet(SOC_GPIO_0_REGS, AD7606_PAR_CONVST, GPIO_DIR_OUTPUT);! s: _# ]: O8 K+ G2 P& e
GPIOPinWrite(SOC_GPIO_0_REGS, AD7606_PAR_CONVST, GPIO_PIN_LOW);2 t; S7 L% r0 ^0 N2 {% x
! f$ A# X( b, _6 ?; q ~
GPIODirModeSet(SOC_GPIO_0_REGS, AD7606_PAR_RD, GPIO_DIR_OUTPUT);
* f+ j+ R; h9 A2 a" A7 d+ Z* V GPIOPinWrite(SOC_GPIO_0_REGS, AD7606_PAR_RD, GPIO_PIN_HIGH);" _+ @2 b) U$ F O
7 y( ?2 ]! ~$ Y
}
7 C% u, K$ |7 \8 l+ W
; x& c& z+ ?0 C3 `% q: [
* X8 s$ G; }& h# Q! ?; Ystatic void ad7606_busy_hwi(UArg ad_addr) {
: i ?1 d1 P/ F- T: C8 Z4 L q4 P% w# j* @( D1 l* x
! F. j# E0 Z% ]% u5 a /* Disable the interrupts for pins of bank AD7606_PAR_BUSY in GPIO.*/ `& E1 e0 i7 b/ h: j$ R& Y
GPIOBankIntDisable(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_GPIO_BANK); //用仿真器debug,发现程序能进入这里。
6 x! R4 f5 J+ u3 a( d0 R. g3 q+ M4 h. A8 N3 Q \
if(GPIOPinIntStatus(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_V1) == GPIO_INT_PEND)+ Z& h' t& X% g' d- ?! Y* b E: g
{
, \- a `: q) o# K GPIOPinIntClear(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_V1); //问题是:用仿真器debug,发现程序不能进入这里。
$ z; t3 o3 p/ `4 E7 u4 \ cs_addr = SOC_EMIFA_CS5_ADDR ;! [, E3 t) Q: ]$ j, P0 {
internal = 0 ;& F9 S0 ?5 Y2 b3 E, r
int_flag[0] = 1 ;
3 ]5 _* I5 `6 p& o0 r4 A }5 e" e- v0 U: [% v" A9 g
if(GPIOPinIntStatus(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_V2) == GPIO_INT_PEND)
% f; m; ]/ F' l# p3 j/ x4 m {+ @/ F( h( J; r9 k9 F& G
GPIOPinIntClear(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_V2); //问题是:用仿真器debug,发现程序不能进入这里。
" U. o% u# B! b! ^# B( I4 D cs_addr = SOC_EMIFA_CS4_ADDR ;
. L, M* B2 d+ H3 y! m internal = 6 ;
. x# y `, i6 X% a4 ^. i" @; A3 T int_flag[1] = 1 ;7 `1 Z! U( B; A. ~4 u+ u f H
}: I1 V& G8 h' ^8 s6 S% m3 J
if(GPIOPinIntStatus(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_C) == GPIO_INT_PEND)
) q- ]$ n# C" g% |! B( Q! ?% v {
4 K2 p* P4 j5 c5 a' O% f4 s- l- Y GPIOPinIntClear(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_C); //问题是:用仿真器debug,发现程序不能进入这里。7 b+ K) X J4 b1 `. j3 o J$ D
cs_addr = SOC_EMIFA_CS2_ADDR ;
$ t' r1 t2 N0 a& C% P& L internal = 12 ;
& L6 \) a8 j) ? int_flag[2] = 1 ;# c$ o8 h! P( u+ H& E, R4 k) v+ h
}
8 |# C2 ^, u% ?. K" t
. u9 w' X8 V# I7 T" Y* [* {" k GPIOPinWrite(SOC_GPIO_0_REGS, AD7606_PAR_CONVST, GPIO_PIN_LOW);3 `9 D2 f. ? K
/ Z; |5 H8 P0 |! T+ Z GPIOBankIntEnable(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_GPIO_BANK);9 y* h3 o4 K/ J" S6 o9 P
}( D! n$ {1 e9 `$ I: |
* A6 z" m! x$ X
7 Z0 H" N) y: V" R% J5 I- B4 Y7 n! A: ]* S
" Y% X l1 c+ @
|
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
|