|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
外部中断初始化$ \" P3 Z" t9 H0 P' X
#include "extint.h"3 i7 _; {; U6 o
//按键和外部中断都用了GPIO13,查询和中断不能同时使用
. i" @' y5 c' n# Z% \void InitExtInt(void)& R9 ^8 i/ G6 k
{9 q, l3 c, f$ H0 q0 M4 G# k% N
EALLOW;
% C, J3 F: f( T2 P! x6 r GpioCtrlRegs.GPAMUX1.bit.GPIO13 = 0;
4 W4 k! ]- \' I- G8 { GpioCtrlRegs.GPADIR.bit.GPIO13 = 0; //作为输入IO口1 [2 f: Y( V/ _) K$ i3 a4 e: {' S
GpioCtrlRegs.GPAQSEL1.bit.GPIO13= 0; //和时钟同步1 g4 E: ~* q9 @. Y3 ]7 v
GpioIntRegs.GPIOXINT1SEL.bit.GPIOSEL = 13; //选择GPIO13为外部输入XINT1输入引脚( b, x) Y- _, }$ \3 w
XIntruptRegs.XINT1CR.bit.POLARITY= 0; //下降沿触发中断7 `" ?! r8 o7 E& I( [8 p# ]& c6 N
XIntruptRegs.XINT1CR.bit.ENABLE = 1; //使能XINT1中断
+ _1 H+ s ]: c' m$ `7 p; lEDIS;$ A! l& _- [( m% a* k0 b" `
}
0 z5 Y3 n' h; G4 g! W4 n3 ^) H2 Q/ }
//外部中断1服务函数 ,按下按键,进中断,亮灯响鸣
( t. M Z3 p, j# y4 T kinterrupt void ISRExint1(void)
6 F) _: u; L: s' f/ o- K7 \{% ~4 G. ?5 B. w5 @
PieCtrlRegs.PIEACK.all = PIEACK_GROUP1;
; O8 r6 M' Z! Y" qDELAY_US(1000);
$ Q+ g- d( i0 D. r1 |# qif(GpioDataRegs.GPADAT.bit.GPIO13 == 0)
, _) u4 k$ j; d& @, C{ N X- ~( W5 ?6 l5 X7 F$ I
LED4=~LED4;
: ^( E$ Q/ Z2 M$ y8 r BUZZ_ON
8 u k- c `6 h/ v# B DELAY_US(100000);
( i+ J% O T% ^3 p/ U4 r BUZZ_OFF
& a" K3 Y8 m* L# j) f; U DELAY_US(100000);) q; p8 I: I* O; Q
BUZZ_ON+ L8 ^6 l" a# w6 S5 x; V2 P0 ^
DELAY_US(100000);
& k; W. V! g& Q, }7 Y6 u, b1 j BUZZ_OFF
, }* n+ Z; U# N }
4 y: c6 y$ W* ~2 R}- {( h; n' ~' |: j; ~5 A* T
7 [0 ~% S+ q! S5 u
, ]6 x+ }; U6 L% s% F定时器0,1,2中断初始化% A5 \) E6 M0 |& h- |8 V
InitCpuTimers(); // For this example, only initialize the Cpu Timers
6 C+ X9 z5 B: G) q- V0 Y8 f ConfigCpuTimer(&CpuTimer0, 150, 500000); // 500us 150MHz CPU Freq, 1 second Period (in uSeconds)- L+ ?$ X8 y! r
ConfigCpuTimer(&CpuTimer1, 150, 1000000);
" F- ~8 {. Z. X/ q; x; ^7 P ConfigCpuTimer(&CpuTimer2, 150, 3000000);( ], B* u" Z6 ~
StartCpuTimer0();
7 L% f5 c- C/ @1 T, S9 q- ? E StartCpuTimer1();+ F/ I: b9 u5 m; @
StartCpuTimer2();
' V3 r( v% Z$ c4 M6 ~) Q, f( {. H
8 b+ S/ h4 S% j T+ S/ S$ B& F: {( B
#include "timer.h"
3 e: |- M! K: ]* v4 j& K' Tinterrupt void ISRTimer0(void)
; h. }" T& `8 `( K+ O{: `. G/ D0 V) n' M' g' j5 B- F& ]) B5 W
static u8 timer0_count=0;
8 Z, Z: l; y9 Z// Acknowledge this interrupt to receive more interrupts from group 1) ^' e8 R; ~+ z" t- b
PieCtrlRegs.PIEACK.all = PIEACK_GROUP1; //0x0001赋给12组中断ACKnowledge寄存器,对其全部清除,不接受其他中断
" ?0 f) p& M7 t" s9 {7 y; ^ CpuTimer0Regs.TCR.bit.TIF=1; // 定时到了指定时间,标志位置位,清除标志
" }. D' ~1 R( M' J) P CpuTimer0Regs.TCR.bit.TRB=1; // 重载Timer0的定时数据
- @5 Y) u4 M' Y; R$ a" a4 c4 b/ p* C
timer0_count++;
" A- s, u9 D# X. u0 |7 n if(timer0_count==4) //2000ms =2s
$ O' [& X3 x8 ]; l {! E3 i* y9 s* B; Q4 A$ \
timer0_count =0;5 B# G7 \# M9 Z$ B# [2 k+ `6 ^
LED1=~LED1;
" f, Y4 c) n( j: H% ^0 I* ?+ u9 ~ }% F7 W% R0 ?0 {; d
}$ _) A1 q: Z5 r' i A- u. V
" N$ Q: R0 ~' T4 \. r# l3 ?
# g7 p2 M4 k0 O) B% H- \//1s- S/ r1 L& H( @& T- Y/ q
interrupt void ISRTimer1(void)' n* Z0 B. h/ S9 `" v; x0 a
{
0 e$ l. _' }" m, M; _3 k& U; p static u8 timer1_count=0;2 k9 f8 z9 Y, ^6 w* |
// Acknowledge this interrupt to receive more interrupts from group 1
* l0 `* ^6 u8 b/ R$ [) |" I //PieCtrlRegs.PIEACK.all = PIEACK_GROUP1; //0x0001赋给12组中断ACKnowledge寄存器,对其全部清除,不接受其他中断# O9 A7 T2 P, n' J# S2 I+ N: |
CpuTimer1Regs.TCR.bit.TIF=1; // 定时到了指定时间,标志位置位,清除标志) W. p9 U1 k. k/ M4 i3 K5 Y
CpuTimer1Regs.TCR.bit.TRB=1; // 重载Timer0的定时数据7 n7 Q( e, }- `: c! n
& o2 }4 p; ~, N8 A0 V! M% x+ P9 o timer1_count++;, ~0 p/ ~& \" i4 W/ Y1 U
if(timer1_count==1)
, `+ i7 g3 i" b9 e1 k) c, K N, s) r {/ u# l, r1 ~; u0 S; C
timer1_count =0;+ C7 V3 ^9 {" I5 }8 v
LED2=~LED2;5 ~' u" m. c: A6 e
}0 ?! s0 a, w$ X
}1 i+ M0 `# P1 [9 O% J
7 E3 K* q2 I; E) M7 s; d//3s
+ X* {8 a! T$ c" s0 ~interrupt void ISRTimer2(void)$ S& A7 r1 Q2 }% M- }0 Z+ a
{
0 E$ t7 `8 f1 E) B( t static u8 timer2_count=0;
3 z4 A9 b- [- [" I5 Z// Acknowledge this interrupt to receive more interrupts from group 1' T2 J+ e) p0 ]. |# B$ r
PieCtrlRegs.PIEACK.all = PIEACK_GROUP1; //0x0001赋给12组中断ACKnowledge寄存器,对其全部清除,不接受其他中断! j* l: B# F( R& O
CpuTimer2Regs.TCR.bit.TIF=1; // 定时到了指定时间,标志位置位,清除标志
* ?# y( y3 p% Z! d" K/ K+ k CpuTimer2Regs.TCR.bit.TRB=1; // 重载Timer0的定时数据! |- q O; F" `( I
0 G5 n+ d( m4 ~5 d9 i" {
timer2_count++;+ c' l& o% z9 r% b
if(timer2_count==1)
) b6 R! W9 x* h7 q' g( R {6 y3 I. M* ^3 [
timer2_count =0;2 Q% n6 W5 v0 a( ^
//LED3=~LED3;' U! G& y( c6 {* `
}7 {9 e6 ~& l5 Q, G/ u$ I
}6 \$ S0 `% Y6 D# [( p" k$ j( e( h L
' o1 w. ?& i1 `- Z
指定中断服务函数地址: M! o; {4 f/ z$ G! S
EALLOW; // protected registers7 V5 y2 g' l( x' K9 E2 V8 T% `% X/ W
PieVectTable.XINT1 = &ISRExint1; //外部中断1服务程序- D, G4 J* k+ L" q/ W c/ O* x9 S; h+ {
PieVectTable.TINT0 = &ISRTimer0; //定时器0中断服务" n4 K$ j G( f7 b
PieVectTable.XINT13 = &ISRTimer1; //定时器1中断服务# t c0 X! X! \4 h
PieVectTable.TINT2 = &ISRTimer2; //定时器2中断服务
2 g' S/ e+ I- A% \* p/ | EDIS; // This is needed to disable write to EALLOW protected registers# z" p( {" O. B4 t) n
( R) W9 X5 S4 t3 u( v% G
开CPU级中断* \5 @% f, f4 f% X4 y
IER |= M_INT1; //开启CPU中断 组1) y+ k1 \& B) ^: {6 S4 w- ^8 _
IER |= M_INT13; //开启CPU中断 13 XINT13 / CPU-Timer1/ X7 k! E, \8 Q, H5 I9 c
IER |= M_INT14; //开启CPU中断 组14 TINT2
8 x" S# Q1 {! c* I: j: g) L2 \ & x+ `: x3 Y' h, W
PieCtrlRegs.PIEIER1.bit.INTx7= 1; //CPU定时器 TIMER0中断 组1的第4个中断使能
9 x; n' Q8 ?1 A: z' C CpuTimer1Regs.TCR.all = 0x4001; // 使能TIMER1 Use write-only instruction to set TSS bit = 0; s& I0 a$ `5 A, P3 A k* v& q) H7 n* m; k
CpuTimer2Regs.TCR.all = 0x4001; // 使能TIMER2 Use write-only instruction to set TSS bit = 0
7 Z/ M: L2 D: l. m# n. a3 A9 V! `' A7 r/ [
EINT; //开启全局中断
0 W* X) ^0 K5 P) u% g ERTM; //开启全局实时中断,调试用DBGM |
|