版主
主题
回帖0
积分10609
阅读权限200
注册时间2008-11-22
最后登录1970-1-1
在线时间 小时
|
楼主 |
发表于 2019-3-1 15:18
|
显示全部楼层
ZYNQ采用了结构指针加函数指针来实现复杂的功能还有它总之采用强制转换来实现类型转换,所以好多用了void *
+ h; ^1 H; ^% Y3 Z- r. M
+ E/ V, G9 x- t( O$ o& r$ p7 v
7 ]" N' X: e) i' s1 \7 F/ G#include <stdio.h>
2 Z$ h* C. }6 J: x5 n#include "xscugic.h"9 e# E. Q; w" e6 q. T
#include "xil_exception.h"' ]+ K! J- k1 Z- [, W0 n3 `2 A
! C) W& V& ]" Q#define INT_CFG0_OFFSET 0x00000C00% c N* K% Y( C2 r
- e R. \) ^( s: f7 I6 r
// Parameter definitions& K& ?2 Q! U; B( g, l0 a
#define SW1_INT_ID 616 `1 q, v) ~' i' l8 L
#define SW2_INT_ID 62
. s3 H. G/ T+ e- n$ p1 `# ~/ c#define SW3_INT_ID 63
4 S) o0 s; l# Q#define INTC_DEVICE_ID XPAR_PS7_SCUGIC_0_DEVICE_ID3 u0 e' U6 C8 i, t' c6 r
#define INT_TYPE_RISING_EDGE 0x03# Y5 P* G& x9 D
#define INT_TYPE_HIGHLEVEL 0x01/ n- ~( ?8 [+ s* K
#define INT_TYPE_MASK 0x03
! H! I9 G7 Z- Y& H: [4 T6 U
* ]% q4 N) I7 s4 b' m) [static XScuGic INTCInst;
! R. a/ P/ f, P7 p
+ i8 O" c/ H( ^/ Cstatic void SW_intr_Handler(void *param);9 y4 I8 M& V5 q; {& k' K
static int IntcInitFunction(u16 DeviceId); N. u% i4 v3 f: i: j. z
+ [. \# c% k5 l: ~7 k+ y
static void SW_intr_Handler(void *param)! t. t/ J' [/ t4 T% g) O. n; c
{7 S9 T6 }/ F' U/ ~7 ^- O/ P9 Z$ \
int sw_id = (int)param;
}( o3 b) ^$ G, @9 @ printf("SW%d int\n\r", sw_id);
3 v4 c1 p% S1 v# W+ b ^# g}; |/ ?% \. H" D) ]1 s/ h8 ^& u
: ]/ E1 Z7 I$ m! ^; h* Lvoid IntcTypeSetup(XScuGic *InstancePtr, int intId, int intType)$ K# ~$ W6 d: A: @
{
0 b; Y! r H( O# Y$ G* \% A int mask;
' B" @$ W* ^% T0 Q, n5 J+ Z) q2 ]8 c' d( z8 P" d
intType &= INT_TYPE_MASK;
# V4 K/ c# t% Z5 f mask = XScuGic_DistReadReg(InstancePtr, INT_CFG0_OFFSET + (intId/16)*4);$ {; t4 N, l2 H3 d: h; B% g
mask &= ~(INT_TYPE_MASK << (intId%16)*2);* V1 G2 i6 `3 I ^9 Z6 D
mask |= intType << ((intId%16)*2);! T) x, i4 q, r. Z7 J9 V
XScuGic_DistWriteReg(InstancePtr, INT_CFG0_OFFSET + (intId/16)*4, mask);# L% \+ g) W& e0 h& }* U
}. R) k" N6 u$ ^- I
6 Y; u# T1 `5 ]" s! J8 A/ Y! Uint IntcInitFunction(u16 DeviceId)
) g c/ Z1 I( w* s{
6 E0 m' ^* n9 g' n5 @ XScuGic_Config *IntcConfig;7 m5 U0 R9 o+ j
int status;# c: M, ?* k9 m6 w/ A
4 C0 g) s$ i( E" |1 ^. u
// Interrupt controller initialisation
E8 p% y, h4 O$ l' f7 F IntcConfig = XScuGic_LookupConfig(DeviceId);
5 D( L' k- ]5 }- v }9 q( k8 V status = XScuGic_CfgInitialize(&INTCInst, IntcConfig, IntcConfig->CpuBaseAddress);1 z Q9 R7 ^' } K
if(status != XST_SUCCESS) return XST_FAILURE;4 x6 {0 W1 @# Q2 U$ a
: O0 Z7 x# j% r1 q8 q8 Q // Call to interrupt setup
/ H: {; f5 x* C( U Xil_ExceptionRegisterHandler(XIL_EXCEPTION_ID_INT,4 Y7 o2 A5 Q4 h& W0 G
(Xil_ExceptionHandler)XScuGic_InterruptHandler,
: p' L/ D/ U1 f5 Q4 V W- `* Y, f% v &INTCInst);
! A1 x( B: F) q" H0 Q. v Xil_ExceptionEnable();& |3 v; N+ ~# R- v. L+ r0 G: B% U$ u
; |. f. U( L4 u4 f4 g9 w0 h, _3 x/ `/ R // Connect SW1~SW3 interrupt to handler B9 T! B5 y- O+ r0 I" b+ ^! s
status = XScuGic_Connect(&INTCInst,
9 q9 _& T5 ]" j" o SW1_INT_ID,
1 b" g* g$ S# E* u( o6 q' E (Xil_ExceptionHandler)SW_intr_Handler,7 N; |3 H, s. M# @. T/ a: \- _
(void *)1);- N' V8 y& m v6 L+ M+ {! ?2 D& g
if(status != XST_SUCCESS) return XST_FAILURE;
1 h( `/ c% p) h9 N; {, T
/ i3 p1 l+ K. D! G status = XScuGic_Connect(&INTCInst,
/ e* I: _7 r8 z/ a& _$ C7 A) Y SW2_INT_ID,
4 h ?5 w8 F3 P6 P% G& Y# X4 W (Xil_ExceptionHandler)SW_intr_Handler,
$ t/ k" M2 e, e0 ^9 H (void *)2);0 C, p& F- Y9 W9 L2 a; d0 u
if(status != XST_SUCCESS) return XST_FAILURE;6 x4 `1 h1 y% p% Q7 h8 L
% C. r4 Q5 B- c+ \) z, F! \
status = XScuGic_Connect(&INTCInst,
% ^8 ?5 f7 u) W0 L8 m SW3_INT_ID,
4 Q# d) k5 S6 ~- \6 Q) m& E (Xil_ExceptionHandler)SW_intr_Handler,/ u+ g2 e: e7 P8 S1 n8 s
(void *)3);
: ~/ w/ B R) f5 X" Z if(status != XST_SUCCESS) return XST_FAILURE;) R) \2 s* F2 {2 F9 s
5 N8 J! L7 e( x( y# i7 X // Set interrupt type of SW1~SW3 to rising edge1 \4 D+ B H( c) x2 C% `! z5 B
IntcTypeSetup(&INTCInst, SW1_INT_ID, INT_TYPE_RISING_EDGE);
/ l9 q: s U1 T9 i1 Z8 R3 r5 W IntcTypeSetup(&INTCInst, SW2_INT_ID, INT_TYPE_RISING_EDGE);
4 O4 v$ x9 f& M* q' d1 z5 s IntcTypeSetup(&INTCInst, SW3_INT_ID, INT_TYPE_RISING_EDGE);# b- E* M# X( H0 |% s* v
& {) K8 ~) c9 k
// Enable SW1~SW3 interrupts in the controller
# k' {5 @. @: [1 t, H! E XScuGic_Enable(&INTCInst, SW1_INT_ID);
3 \2 f% }% C8 O" r XScuGic_Enable(&INTCInst, SW2_INT_ID);6 L4 k4 l, y o' F6 F
XScuGic_Enable(&INTCInst, SW3_INT_ID);. b. J2 v) q& q2 [
1 \+ O% H2 i( ] return XST_SUCCESS;
+ e; \( V5 n+ f# a5 F0 e}. r# r" N4 D9 M$ U+ f/ m4 M
0 A! {3 Y; d- L3 i" [5 V8 G
int main(void)
1 F3 }# Q. @& H( L+ V2 i{- `, G& ~! {) i, n
print("PL int test\n\r");: U5 C" t3 U9 [% C; b" v$ x7 b: W
IntcInitFunction(INTC_DEVICE_ID);
9 B3 d2 ~/ \9 f) `% X while(1);
& @) s1 o; O& k S6 I; \0 z/ d return 0;9 v6 L; B8 K% |5 ]3 W6 @" F
}2 ^# C1 z5 q0 p) V) }& Q
, l: c, N6 K6 O- ?
7 }% S6 t. F9 s4 E5 \1 t- t; G5 K; G
|
|