版主
  
主题
帖子
积分10609
阅读权限200
注册时间2008-11-22
最后登录1970-1-1
在线时间 小时
|

楼主 |
发表于 2019-3-1 15:18
|
显示全部楼层
ZYNQ采用了结构指针加函数指针来实现复杂的功能还有它总之采用强制转换来实现类型转换,所以好多用了void *
# `# y; r. M c1 x$ `! e! j, M* S! L- X$ J: ~: V" J: `! `1 z, s& d
" M2 n! `7 {, H% s: l#include <stdio.h>* N/ M. Y" P( Y2 K6 }6 h$ C
#include "xscugic.h"
6 v" ?+ i5 l0 |/ U1 F ]#include "xil_exception.h"
0 t3 `1 C. u y x& L
$ w; j! G* a/ F; s% A) {. `! f, b#define INT_CFG0_OFFSET 0x00000C009 }: u+ @8 {% T+ y# j V+ I# d; j
. H; V6 F4 T6 r// Parameter definitions
( h9 ~ D; q9 n2 t5 k#define SW1_INT_ID 613 @' O2 t) D5 X N
#define SW2_INT_ID 620 {9 V7 _2 K6 ^& k& O$ a, A
#define SW3_INT_ID 63, l) f6 f7 w! X! I9 F }. x
#define INTC_DEVICE_ID XPAR_PS7_SCUGIC_0_DEVICE_ID
2 F& X9 T5 u; D+ o* c#define INT_TYPE_RISING_EDGE 0x039 p4 V3 E& v" @ l
#define INT_TYPE_HIGHLEVEL 0x01
1 S: v4 U: T' ?# L! n% z#define INT_TYPE_MASK 0x03
. ~* K2 k7 u; K9 f+ ^! G2 W) r6 O
1 ^$ u; \$ @$ V! p: }8 R1 Q( B% |! Qstatic XScuGic INTCInst;+ a7 ]* H7 ?8 G
- H) G1 B" A4 U) P# J- I: [static void SW_intr_Handler(void *param);
* w: C9 K0 j7 O' N# `static int IntcInitFunction(u16 DeviceId);) k) b; b! r+ e* ^0 T3 `
+ y0 U! m3 i \: D$ F8 xstatic void SW_intr_Handler(void *param)
( l0 }. e& w# R{
0 ?4 C; s, f, v$ G- g int sw_id = (int)param;; w5 [. r2 \7 X, u. k- w
printf("SW%d int\n\r", sw_id);% S# Z' W! w# D& {
}( ?1 g. O: j5 w1 [* d$ N
" P) i# z% K' {8 z) H
void IntcTypeSetup(XScuGic *InstancePtr, int intId, int intType)+ N6 E f9 r! L( W# }
{
7 F# L ?' w# g- p: h& d, ? int mask;
& B/ y* N# P/ t8 e V7 N$ D
9 b6 x$ r+ c6 [% c. F+ S intType &= INT_TYPE_MASK;
) e @- a- F5 j& |6 r0 y: b! y5 G8 Q* J mask = XScuGic_DistReadReg(InstancePtr, INT_CFG0_OFFSET + (intId/16)*4);
( O1 W5 ?! x8 ^% P mask &= ~(INT_TYPE_MASK << (intId%16)*2);/ h d U. S o6 s
mask |= intType << ((intId%16)*2);) v* y1 s0 O; k
XScuGic_DistWriteReg(InstancePtr, INT_CFG0_OFFSET + (intId/16)*4, mask);
- Y* J1 g* g! f# G" i4 X' ]: k! ^}
~3 _+ l+ X. E) Q- J5 |' \. g, [6 c$ E7 E( {8 p, O& X+ [! a8 ^& f
int IntcInitFunction(u16 DeviceId)
( n* h: F$ D4 ]( w4 d1 ]* d s- j. w{
7 l" _! P" g6 p8 B ] XScuGic_Config *IntcConfig;- [1 n' e6 W9 {/ P/ [
int status;1 }/ z' A5 z' W
( S! R, v. ~% ?: X1 P: m, G, R // Interrupt controller initialisation6 f+ m+ h! e5 y8 ~+ Z
IntcConfig = XScuGic_LookupConfig(DeviceId);' P, i" U% E% L$ |7 u4 A
status = XScuGic_CfgInitialize(&INTCInst, IntcConfig, IntcConfig->CpuBaseAddress);( l& j% g$ g, f9 U
if(status != XST_SUCCESS) return XST_FAILURE;# Q- ?7 N. T: |- e5 D q; H; K
+ w" U) ~6 ]- h" ? // Call to interrupt setup+ J; m4 s+ q* ]/ p C- B5 Q- M
Xil_ExceptionRegisterHandler(XIL_EXCEPTION_ID_INT,! G0 F# Y7 ~8 C3 c! [0 s
(Xil_ExceptionHandler)XScuGic_InterruptHandler,& M; O' x! ~8 e. ^
&INTCInst);
7 b! ?7 D; W7 b0 E3 d; G. e% Z! n Xil_ExceptionEnable();& W' _6 B/ q! }4 X0 D" ]3 _. w0 F
' ~. T+ B/ X+ y4 d+ X8 M% e7 _
// Connect SW1~SW3 interrupt to handler# \6 {( d6 e2 |+ E" d/ Y
status = XScuGic_Connect(&INTCInst,
& m( f& Q9 v2 j, F' Z0 L# M SW1_INT_ID,
+ t( T* I- S) t2 @% J (Xil_ExceptionHandler)SW_intr_Handler,
5 R4 V7 G' E" m1 l# [ M9 S3 u/ \ (void *)1);
' k% w5 m/ k; v$ L: T* r if(status != XST_SUCCESS) return XST_FAILURE;: M. H# a4 @- V% C; C% E i+ C6 F
7 n A# m B% I* N% B# l
status = XScuGic_Connect(&INTCInst,& `3 P9 \8 R6 |3 T7 B! m
SW2_INT_ID,0 \5 p/ L& D3 b7 i$ j
(Xil_ExceptionHandler)SW_intr_Handler,
; ]$ ^( O+ F6 c( T (void *)2);$ R6 m; v: F+ G& s1 y$ g0 V
if(status != XST_SUCCESS) return XST_FAILURE;5 w/ T3 f; c5 m ]/ E% z! F
" Z, u- s d# _! l9 E: L1 _. n status = XScuGic_Connect(&INTCInst,# v0 t0 E% k! H1 r4 F
SW3_INT_ID,# {6 H* E. C2 y' U
(Xil_ExceptionHandler)SW_intr_Handler,! q6 k+ ~6 c1 t" s
(void *)3);
. P0 O+ f6 Y9 b* n" D9 e! ~ if(status != XST_SUCCESS) return XST_FAILURE;
7 n! ?& t; h3 M8 C& G4 [: i+ c) }7 O0 t
// Set interrupt type of SW1~SW3 to rising edge
9 F6 b) ~1 k* j' [& ^* A; |7 _0 k IntcTypeSetup(&INTCInst, SW1_INT_ID, INT_TYPE_RISING_EDGE);$ ~. ~# ?1 i8 [- o& u) u
IntcTypeSetup(&INTCInst, SW2_INT_ID, INT_TYPE_RISING_EDGE);* y A) [. T7 p; r3 s
IntcTypeSetup(&INTCInst, SW3_INT_ID, INT_TYPE_RISING_EDGE);' d4 p5 q# l1 z: r* K8 t
! w8 i, [+ U6 u1 n* M G! {) r" J4 r
// Enable SW1~SW3 interrupts in the controller
2 {. z! u* q* ?# e2 P XScuGic_Enable(&INTCInst, SW1_INT_ID);: a( S: V5 [5 ?7 V
XScuGic_Enable(&INTCInst, SW2_INT_ID);' ]8 q# ]% C# W# x9 A
XScuGic_Enable(&INTCInst, SW3_INT_ID);2 E: a8 _" m; v& W) m: p1 j5 }
; Q" e# }) A' [7 q0 ]
return XST_SUCCESS;1 Z8 v0 g0 h; B
}1 |3 F% @/ T/ X+ e2 P2 E% C
9 h, R) U& R' q% `& Y5 \int main(void): V& D& X& `- n, w" [ a/ N, F
{
" v! S q& W# J7 D# }$ w- f5 s; {5 W9 u print("PL int test\n\r");
' c& J% r) [7 W( T1 t IntcInitFunction(INTC_DEVICE_ID);9 H0 W3 c! G- f5 ^+ Z( R
while(1);
+ [# m% M- b! G return 0;- `0 \& Y* k3 l
}/ B* U' V5 x4 x2 A1 S! Y
) d7 ^( V+ z4 [: S, m3 Z4 }% d7 A$ q5 s( R8 h7 x
" Z9 V5 D2 r) ?6 C
|
|