版主
主题
回帖0
积分10609
阅读权限200
注册时间2008-11-22
最后登录1970-1-1
在线时间 小时
|
楼主 |
发表于 2019-3-1 15:18
|
显示全部楼层
ZYNQ采用了结构指针加函数指针来实现复杂的功能还有它总之采用强制转换来实现类型转换,所以好多用了void *! w! H+ r7 C" V1 z
: s* m! B9 u! K
; ~5 W' Y! s3 Z. K- Q#include <stdio.h>/ v0 G: E7 e$ z8 h, { r' y8 f
#include "xscugic.h") o, [9 M9 A" l7 y, P
#include "xil_exception.h"
% E2 n7 {6 t7 m) X% O, E* g1 J: A4 n
#define INT_CFG0_OFFSET 0x00000C00# J# R$ }# F! d, M {
9 `! C+ O8 X8 S0 y3 Y9 V
// Parameter definitions2 u4 T& s$ Z$ F0 A$ Z
#define SW1_INT_ID 61
; d0 g/ ~4 k4 w& K( q# Z d8 E3 ?#define SW2_INT_ID 628 I% v9 q9 h- J: p% c/ Y$ N8 V- ]
#define SW3_INT_ID 63
" ]8 T9 T" E. P! S) ~! v1 n#define INTC_DEVICE_ID XPAR_PS7_SCUGIC_0_DEVICE_ID! e& i, G1 o: t# G' O0 n: n' B2 W
#define INT_TYPE_RISING_EDGE 0x03- t8 N& z, k6 I4 {
#define INT_TYPE_HIGHLEVEL 0x01% c" B7 i* Z9 H5 y7 z$ X2 H+ b [4 Q
#define INT_TYPE_MASK 0x03
7 m2 l9 A' Y5 _; x+ u
% q+ V' z! i dstatic XScuGic INTCInst;
+ U O L* U, y t: H: d: |$ J& Z2 J" F0 P, v
static void SW_intr_Handler(void *param);0 z9 f* Q, Z& m$ o8 L
static int IntcInitFunction(u16 DeviceId);
$ i/ e' U) q Q6 v" h& F
U3 `1 j; B/ w astatic void SW_intr_Handler(void *param)
2 X# c/ E3 \- Y1 m{, S( X7 [4 I/ N
int sw_id = (int)param;
; V' B. l! k7 F- Z printf("SW%d int\n\r", sw_id);0 f' P( y3 F0 T: ^
}$ r2 ?! y: d7 v; s- J
6 w/ X9 t+ u( N& E2 F0 `! lvoid IntcTypeSetup(XScuGic *InstancePtr, int intId, int intType)3 b) a* d. |# N& Y; E' w5 K, J% k0 J5 l
{' F4 [/ n, s/ ^5 P5 f' x: D
int mask;
w' t! ]( Q) h6 i* ?5 \* `: o( u3 j# w% b8 ^$ }
intType &= INT_TYPE_MASK;' a8 q p# t& A" t3 K3 |
mask = XScuGic_DistReadReg(InstancePtr, INT_CFG0_OFFSET + (intId/16)*4);. E2 N9 I* g# Z6 U! V5 z" M
mask &= ~(INT_TYPE_MASK << (intId%16)*2);
3 q6 R, `5 o5 x6 H; V' O4 x' j# { mask |= intType << ((intId%16)*2);9 G- ]7 q) G/ m! q( ^; b6 ]7 k, ?2 |) i
XScuGic_DistWriteReg(InstancePtr, INT_CFG0_OFFSET + (intId/16)*4, mask);
% V. T* a9 a' V9 ~, B2 J) Z S}$ T$ [3 q+ Y( o! S
! E1 E5 I/ Y: p, Z2 Y2 aint IntcInitFunction(u16 DeviceId)
2 ], c1 L& S4 ~* q x0 o{7 ^$ W+ y" S$ P0 X# r7 l7 Z/ n
XScuGic_Config *IntcConfig;
* ^# c& R h1 r/ G) v% u int status;
0 q7 }4 E* \2 G$ \
+ }6 A+ `1 N0 o# g) X7 Y // Interrupt controller initialisation; @7 L& ^) W0 {$ h1 ^( P
IntcConfig = XScuGic_LookupConfig(DeviceId);
% F0 h7 ^9 J; v% t. @7 J! [+ T% X status = XScuGic_CfgInitialize(&INTCInst, IntcConfig, IntcConfig->CpuBaseAddress);$ ? h/ U8 F: t/ X- M7 \
if(status != XST_SUCCESS) return XST_FAILURE;
9 u9 }# }- }; c6 c; N) u4 K; w5 ?) t- }; x0 g) q
// Call to interrupt setup
$ {4 y2 S6 q2 v Xil_ExceptionRegisterHandler(XIL_EXCEPTION_ID_INT,
: Z D1 d5 Q* }5 D/ k ] (Xil_ExceptionHandler)XScuGic_InterruptHandler,
1 Q4 z2 _4 X' ?) r# t; I4 g3 _ &INTCInst);( z8 ]8 n1 v w {7 e/ _
Xil_ExceptionEnable();
$ J( w; B# D* h% K3 r( {0 s# `+ ?; ^+ ]' ?) s3 _& A: k; r! U! G! I8 L0 z
// Connect SW1~SW3 interrupt to handler& v Y2 t5 X: p0 R/ p1 f
status = XScuGic_Connect(&INTCInst,; `2 Q' R. p. o# Q) }
SW1_INT_ID,
0 W! j) ?' N1 c( n) X! ?1 U (Xil_ExceptionHandler)SW_intr_Handler,
m" @6 O7 {% ~, {4 l. o (void *)1);
2 V" Y! ^2 C+ e$ H5 m- M if(status != XST_SUCCESS) return XST_FAILURE;
( [8 L p* A0 K- C
; V9 {9 u" O' y3 Q! A) l# h" P status = XScuGic_Connect(&INTCInst,
, L; Z- u# V: P' g6 ^ SW2_INT_ID,
5 d' b! G! C8 f (Xil_ExceptionHandler)SW_intr_Handler,
8 [0 x/ @) J, n& X; M5 z" @$ b l (void *)2);
7 U& m8 f; y; i/ M# e N; T/ B4 W if(status != XST_SUCCESS) return XST_FAILURE;
+ K& \( L8 C6 ]8 U, ]) w1 `1 \$ i, m7 R( J j, v; q3 A
status = XScuGic_Connect(&INTCInst,
) I- f4 u2 F, R+ u6 \ f$ u$ i k SW3_INT_ID,- m$ J9 M& {* y) R5 S* }% ]; U
(Xil_ExceptionHandler)SW_intr_Handler,
. O/ M/ q/ N/ t- Z% p. G (void *)3);3 p" u- ]1 B6 T: q
if(status != XST_SUCCESS) return XST_FAILURE;* S# T/ J% {7 J) y
# S& m9 `! a& j0 B
// Set interrupt type of SW1~SW3 to rising edge
6 q, g E3 }% o- f/ l; z5 P IntcTypeSetup(&INTCInst, SW1_INT_ID, INT_TYPE_RISING_EDGE);, g$ T n: _1 F+ G' y4 `
IntcTypeSetup(&INTCInst, SW2_INT_ID, INT_TYPE_RISING_EDGE);4 i0 q8 F' k5 ?" E7 Q
IntcTypeSetup(&INTCInst, SW3_INT_ID, INT_TYPE_RISING_EDGE);
2 _7 U1 ^- I2 g5 L- H& G& }1 J+ ^, w7 F' w6 `
// Enable SW1~SW3 interrupts in the controller
: z h; w( i( C+ a XScuGic_Enable(&INTCInst, SW1_INT_ID);
) S7 O% c. T9 ?3 d XScuGic_Enable(&INTCInst, SW2_INT_ID);: h) R+ i6 R5 t0 I0 [
XScuGic_Enable(&INTCInst, SW3_INT_ID);
c8 s3 e6 `. W8 a( I
: D# r/ u2 z* v- n5 [& q3 g return XST_SUCCESS;* D0 J0 ^ L3 U+ {
}( s2 P) Q% c' [. G
2 M3 s) Q+ i# i+ fint main(void)
1 [( b& w# X6 q% V9 r' Z3 X{
$ Y! s+ }; w) h+ [ print("PL int test\n\r");
+ x5 J! G, n/ r5 X: a/ I9 a IntcInitFunction(INTC_DEVICE_ID);
3 Q9 T* a. `9 V. e0 u while(1);
1 O2 J; s. @6 j7 b( L F" c* Q return 0;
; b5 E) j' f4 @2 l, q5 o) j" G}
# G/ _' k8 d, U& t
9 X3 T' x7 d7 d5 v: e- |. M: ~, r0 {7 `5 W" v
+ P1 @3 u; P4 M/ U! j* s$ ^ K |
|