|
|
您好。使用GPIO中断时,中断能进入ISR,但是不能区分具体的GPIO端口。程序如下:6 I2 V* F1 _" K+ w/ b% H
#define AD7606_PAR_BUSY_GPIO_BANK 5
) a- V/ Z; S2 L; C; L: b7 \$ `#define AD7606_PAR_BUSY_GPIO_BANK_INT SYS_INT_GPIO_B5INT# {5 o! p: n4 Y+ i$ V V
7 _0 J4 H3 Y* a: N8 U1 C7 n$ A#define AD7606_PAR_BUSY_V1 GPIO_TO_PIN(5, 11) //BANK5的中断口5.11
8 g- e( x$ L* Q" E/ d#define AD7606_PAR_BUSY_V2 GPIO_TO_PIN(5, 9) //BANK5的中断口5.9
, U! S* o9 ~! n) H#define AD7606_PAR_BUSY_C GPIO_TO_PIN(5, 5) //BANK5的中断口5.5
8 r& R2 V. n4 w! p& O: ~#define AD7606_PAR_BUSY GPIO_TO_PIN(5, 4)
" }) C) y8 x/ u& ~5 b6 q
- ?2 h/ \. T" S t7 p( r#define AD7606_PAR_CONVST GPIO_TO_PIN(5, 1)* {3 F: S# b; ] z; }6 e
#define AD7606_PAR_RD GPIO_TO_PIN(5, 2)
/ m: l- V) E8 z) o; A' P#define AD7606_PAR_RESET GPIO_TO_PIN(5, 0)6 ~1 Q, _! B7 ?
# r. E1 O* G" E
% Y* ~4 e0 y4 ^' A6 U+ r
3 e, O w K% P- Gstatic void ad7606_irq_setup(ad7606 *ad) {& b! B; J! u; J
Hwi_Params hwiParams;' \8 \7 v% A* N
Hwi_Handle myHwi;
* D+ o2 r$ f1 _) K Error_Block eb;
0 T# j. ~! \& N# U1 ~
5 j7 k" u+ \7 g: D* j; g( r Error_init(&eb);: T6 j; ~2 ~1 P- [, H
Hwi_Params_init(&hwiParams);8 ?: l2 m7 d$ s* G/ x+ p3 o
hwiParams.arg = (unsigned int)ad;
' Y1 i0 z- T6 Y& S- W0 o8 r hwiParams.enableInt = FALSE;
* x# j/ Y w5 x3 t5 w hwiParams.eventId = SYS_INT_GPIO_B5INT;
E4 `, ?3 b1 c$ V hwiParams.priority = 4;8 G) V, e" p7 x
myHwi = Hwi_create(8, ad7606_busy_hwi, &hwiParams, &eb); //注册BANK5中断处理函数( }) _+ f3 d m% v8 a7 s
if (myHwi == NULL) 0 M* E# ^" u$ A7 [. _, q
LOG_FATAL("failed to create hwi");
0 S* _& v+ U8 \
8 O. A; Y% b J5 H8 @$ z0 J) Q /* enable both interrupts */1 y' M8 `1 s1 B
Hwi_enableInterrupt(ad->irq_event);
) M( o% X4 ~9 u. N}
1 G( X/ |% b: J9 I) {
: f5 I5 _. f6 A* [
8 _6 M, q/ h1 Dstatic void ad7606_gpio_pinmux_setup(ad7606 *ad) {0 D& u- v* r1 ^5 A* A& ]
volatile unsigned int savePinMux = 0;
6 K8 n( p) y2 Y9 m5 Q. T //初始化5.11、5.9 、 5.5为GPIO口
9 }& ~) M: W7 J5 ?+ K5 g/ x$ o/ ~ savePinMux = HWREG(SOC_SYSCFG_0_REGS + SYSCFG0_PINMUX(11)) & (~(SYSCFG_PINMUX11_PINMUX11_27_24 | SYSCFG_PINMUX11_PINMUX11_19_16));
/ X" ]1 G8 n% a. b" ^" k- s: m3 L% w
HWREG(SOC_SYSCFG_0_REGS + SYSCFG0_PINMUX(11)) = (PINMUX11_BUSY_V1_ENABLE | PINMUX11_BUSY_V2_ENABLE | savePinMux);! e0 g V5 T; X! k
9 u" `0 z) s0 S2 @3 X( h2 \ 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));- [: X1 V; \1 K# I1 s& t
5 c Y6 D+ M1 t) f; \ HWREG(SOC_SYSCFG_0_REGS + SYSCFG0_PINMUX(12)) = (PINMUX12_RESET_ENABLE | PINMUX12_CONVST_ENABLE | PINMUX12_RD_ENABLE | PINMUX12_BUSY_C_ENABLE | savePinMux);
1 P; V$ x8 o B k. M2 n4 e1 m% R \: I8 N& `
}8 X0 Q, G) y: j8 \0 K& @
- I7 l( ]$ a6 [- v9 z
5 m3 I( S4 G" w$ t
static void ad7606_gpio_setup(ad7606 *ad) {
' K, w6 Q( B2 j1 ^6 v; d /*Set the AD7606_PAR_BUSY to the input mode*/
9 g1 a n o6 E! p //初始化5.11、5.9 、 5.5为中断口" r7 i' l4 ^+ S* b: Y
GPIODirModeSet(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_V1, GPIO_DIR_INPUT);- E8 Q/ e5 V/ R$ Z% Z
GPIODirModeSet(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_V2, GPIO_DIR_INPUT);& F6 Y1 {5 y. c! g5 ?
GPIODirModeSet(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_C, GPIO_DIR_INPUT);
9 L6 j" p1 V$ T9 A4 d //GPIODirModeSet(SOC_GPIO_0_REGS, AD7606_PAR_BUSY, GPIO_DIR_INPUT);
% F4 }1 Z+ z: ~$ v7 Q( r: ? /*Set the AD7606_PAR_BUSY to the Falling Edge Interrupt*/
/ P# G8 q1 m" F, F6 n: m GPIOIntTypeSet(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_V1, GPIO_INT_TYPE_FALLEDGE);4 `( c6 [4 P# c6 D& Q8 N
GPIOIntTypeSet(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_V2, GPIO_INT_TYPE_FALLEDGE);
' d* {) C7 O- ?* G* q' M GPIOIntTypeSet(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_C, GPIO_INT_TYPE_FALLEDGE);
1 ?4 z5 k: B# ~2 D, j( u //GPIOIntTypeSet(SOC_GPIO_0_REGS, AD7606_PAR_BUSY, GPIO_INT_TYPE_FALLEDGE);2 D" w' L# e3 i
/*The interrupt setting allows AD7606_PAR_BUSY_GPIO_BANK*/
0 X$ J: F- i3 g$ v- }2 \0 Z4 }( f GPIOBankIntEnable(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_GPIO_BANK);
6 S& ]1 Q8 I" F4 ?, G+ D( R$ s$ B- b, f
GPIODirModeSet(SOC_GPIO_0_REGS, AD7606_PAR_RESET, GPIO_DIR_OUTPUT);$ ?2 I# }' I+ Y/ T/ ]' k$ e
GPIOPinWrite(SOC_GPIO_0_REGS, AD7606_PAR_RESET, GPIO_PIN_HIGH);
/ z" f& k8 w7 }# M% v Task_sleep(1000);5 P- T9 \4 o! u, j4 X( u% m
GPIOPinWrite(SOC_GPIO_0_REGS, AD7606_PAR_RESET, GPIO_PIN_LOW);) S% w% {/ ^6 L1 _3 x. L
Task_sleep(1000);1 ?$ j/ ^$ p& W3 X! e; ]9 @$ s7 \
7 Y6 R: n7 t- D$ _) `8 D) [
/*Set the AD7606_PAR_CONVST to output mode*/5 {9 P; E# |% |! I; o2 b* Q
GPIODirModeSet(SOC_GPIO_0_REGS, AD7606_PAR_CONVST, GPIO_DIR_OUTPUT);
+ o2 ^4 ?! \. _2 g; o GPIOPinWrite(SOC_GPIO_0_REGS, AD7606_PAR_CONVST, GPIO_PIN_LOW);
! ]! y, L m* p: t/ R9 I# m3 h; A' L3 O' E5 T/ w6 n/ T( \
GPIODirModeSet(SOC_GPIO_0_REGS, AD7606_PAR_RD, GPIO_DIR_OUTPUT);
- u0 F; g7 a1 p+ h8 i GPIOPinWrite(SOC_GPIO_0_REGS, AD7606_PAR_RD, GPIO_PIN_HIGH);
* L" N* ` j# M- r7 ^1 v5 Q3 }- P2 ^! T5 @
}& Q7 d6 ^; I- ^" O
7 _* \5 J; _/ N$ q3 ~
! S" ^; B/ b; B! c: w$ Vstatic void ad7606_busy_hwi(UArg ad_addr) {
4 [7 a2 [7 M: y- h
$ w* C% a' k2 N- ^1 ^& u+ ~$ I# b. K( N/ f2 B9 n2 z7 l3 Y
/* Disable the interrupts for pins of bank AD7606_PAR_BUSY in GPIO.*/, x3 H- a; s9 J( [, S5 w* ?% {
GPIOBankIntDisable(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_GPIO_BANK); //用仿真器debug,发现程序能进入这里。+ g _$ S2 j. P( {( ~) ^
! h2 p R9 v6 b/ l if(GPIOPinIntStatus(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_V1) == GPIO_INT_PEND)
+ I. a4 I5 D2 M6 k% q3 ] {
/ W" e! M: y: W3 x) n& f0 k2 K GPIOPinIntClear(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_V1); //问题是:用仿真器debug,发现程序不能进入这里。
0 V/ N* @! Q1 @4 |+ Y7 t cs_addr = SOC_EMIFA_CS5_ADDR ;; B' e7 R0 _. }) J
internal = 0 ;
) k1 C) i4 L2 M2 ?# y int_flag[0] = 1 ;& X, Z3 X/ e5 l# m# W' d
}
) y1 G3 O% e+ i2 A if(GPIOPinIntStatus(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_V2) == GPIO_INT_PEND)
V4 P) P9 |4 \+ [" O+ S0 o1 W. S3 l" Y {$ L/ G. ]- o- o" ~
GPIOPinIntClear(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_V2); //问题是:用仿真器debug,发现程序不能进入这里。
, Q6 J, S! @! N) ? cs_addr = SOC_EMIFA_CS4_ADDR ;
7 d Q1 n/ ?. o% A. E internal = 6 ;
5 K- v9 F, ]; o+ w1 O1 X7 x" p int_flag[1] = 1 ;4 a4 q) T2 h+ X! v" a1 _
}. R) x, R' K1 b' r- M& _+ X3 E% n. Q# X
if(GPIOPinIntStatus(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_C) == GPIO_INT_PEND)
8 N' N5 A- i! L R7 A {
7 H- w1 b* { R; E$ Z GPIOPinIntClear(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_C); //问题是:用仿真器debug,发现程序不能进入这里。
' Y9 Q9 l4 ?/ m g6 Q cs_addr = SOC_EMIFA_CS2_ADDR ;
7 {) |+ W6 n& ^ internal = 12 ;, {5 X M0 h5 L! B1 m7 H) X0 J
int_flag[2] = 1 ;1 P+ x1 L6 V: [/ m8 U
}0 h3 ^! L6 A' p& m6 t7 b
1 V- J( A3 {+ y% G, ~. @6 q GPIOPinWrite(SOC_GPIO_0_REGS, AD7606_PAR_CONVST, GPIO_PIN_LOW);! c4 U ?. }- M( `' B! V% O
- I0 a; h, u* S6 R' T2 S c( ^
GPIOBankIntEnable(SOC_GPIO_0_REGS, AD7606_PAR_BUSY_GPIO_BANK);
( |8 w# P4 R. U/ j8 A}
0 r/ o/ g9 l/ \% h5 @7 Y |1 N, J j- a3 M" w: a( H7 ^4 |
5 @: X% H( W3 j6 }+ [! L. G) ^7 g
/ C2 z; F3 O5 h6 L9 G2 p+ x* F F7 P9 n3 {. Y1 V& v
|
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
|