|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
外部中断初始化: M4 \& I# w9 z* V4 w
#include "extint.h"
7 v( R8 V; N- q+ j//按键和外部中断都用了GPIO13,查询和中断不能同时使用% c1 z k- g7 X4 z9 T; H0 R8 p3 W0 B+ ^
void InitExtInt(void)
$ K, {* M9 z9 A+ s f2 G* j{
C+ T2 V9 e! U3 f- u6 X# Q EALLOW;& N: G% q4 C* Y) f; G0 \/ B+ f/ b
GpioCtrlRegs.GPAMUX1.bit.GPIO13 = 0;9 |+ d& j5 ^/ h% s" t8 y% q
GpioCtrlRegs.GPADIR.bit.GPIO13 = 0; //作为输入IO口
+ l, H1 W' C6 {$ cGpioCtrlRegs.GPAQSEL1.bit.GPIO13= 0; //和时钟同步
& Z7 ^" `: ?8 v. v3 ^7 g; f6 I GpioIntRegs.GPIOXINT1SEL.bit.GPIOSEL = 13; //选择GPIO13为外部输入XINT1输入引脚
5 @) c. L( b; e# TXIntruptRegs.XINT1CR.bit.POLARITY= 0; //下降沿触发中断
. B; ?( F" [$ h9 CXIntruptRegs.XINT1CR.bit.ENABLE = 1; //使能XINT1中断' Z! y- r" ]7 F% b
EDIS; E8 J0 [! |( \7 O% e
}5 |# \8 x- r- I0 V* g ?" `# ^. F$ G9 c
$ E! v+ y9 q- c6 T
//外部中断1服务函数 ,按下按键,进中断,亮灯响鸣: I3 t- R* ~4 ~" h; s' D
interrupt void ISRExint1(void)6 P) O# ~1 K- @% E
{
2 _ [5 S' @: C9 H' d( u% | PieCtrlRegs.PIEACK.all = PIEACK_GROUP1;/ }( I7 J( T G& _. h k9 ~
DELAY_US(1000); w$ s- y" c. U. T' m( k/ c" ~1 ]6 ^5 {
if(GpioDataRegs.GPADAT.bit.GPIO13 == 0)
0 {: u( [$ i; r& y{
+ g8 p, j& K: ]! C LED4=~LED4;
, Q& o2 m7 ~! m; o. |5 y BUZZ_ON" E! a1 Q1 x) W% B
DELAY_US(100000);' L* _7 l( q+ @6 @
BUZZ_OFF
! O& e6 e; M' v( r0 v DELAY_US(100000);
7 c4 [' w2 m0 t0 m BUZZ_ON0 r6 {" @& J! m* s2 v4 t; v) K& B
DELAY_US(100000);
0 G0 E. A V0 T2 D4 d+ X BUZZ_OFF- G1 N; @& @2 w: \( R
}+ }& [9 P: P ^8 b: X
}7 }% O5 f8 X3 R# W7 F' _% D
5 \" } g1 r4 g9 @" x1 f
3 ]* ?) O$ g2 O9 N定时器0,1,2中断初始化7 k; J ]' B+ y; \) S0 N& J5 ^/ a' L
InitCpuTimers(); // For this example, only initialize the Cpu Timers7 S- v! m" ~& w. D$ s0 _
ConfigCpuTimer(&CpuTimer0, 150, 500000); // 500us 150MHz CPU Freq, 1 second Period (in uSeconds)
, Q/ [/ R( t7 L) U ]& K ConfigCpuTimer(&CpuTimer1, 150, 1000000);
$ V# L+ d8 v: h" o$ j" a! V ConfigCpuTimer(&CpuTimer2, 150, 3000000);8 x$ ]. P2 r3 s1 \
StartCpuTimer0();
$ l' q& C3 I+ S' w, s StartCpuTimer1();# y5 `/ s0 u0 g# r7 P' J7 N
StartCpuTimer2();! `* L- p5 b5 I
/ y1 y' E" |; K- K& Z0 J- ?
* _, v, S8 i8 E1 L$ G
#include "timer.h"
) h8 i" B) I4 M* b, \& ninterrupt void ISRTimer0(void)
& S4 `: q, R2 }1 v x{: u1 @, K! D! j t
static u8 timer0_count=0;
( V5 D3 D; b% F' H; M// Acknowledge this interrupt to receive more interrupts from group 1. y0 f! T- Z I. Y8 w" A$ z
PieCtrlRegs.PIEACK.all = PIEACK_GROUP1; //0x0001赋给12组中断ACKnowledge寄存器,对其全部清除,不接受其他中断
* E! g% \. v H* o CpuTimer0Regs.TCR.bit.TIF=1; // 定时到了指定时间,标志位置位,清除标志3 z/ t9 {8 j' }9 G6 @# [
CpuTimer0Regs.TCR.bit.TRB=1; // 重载Timer0的定时数据# O+ T7 V3 S5 o/ e
8 \. |4 z/ C; |, ? timer0_count++;. n6 r# p7 V$ E7 p. [5 \* Z4 \
if(timer0_count==4) //2000ms =2s8 v7 {5 p, p1 R+ ~" b
{
1 A! t3 {1 C% ?( A6 y. m timer0_count =0;% L) E0 ~5 _6 x( ~! u x- I' [
LED1=~LED1;
) Q( ?, y- \/ {" V+ q0 s3 | }
. G4 O4 m& G1 b! j+ B, c} y- D j; T# q4 l& {
( u- f7 S" Y5 B% Y G/ J( |
5 s. \9 C. `8 J2 K//1s
2 U8 ?; g/ V3 Q8 C) E( \+ Zinterrupt void ISRTimer1(void)9 x4 e2 @6 s/ s. U4 h" R3 f
{/ N' e7 N: r! u0 x7 [* t
static u8 timer1_count=0;
6 ~( w. \/ l& { r# I) @. V// Acknowledge this interrupt to receive more interrupts from group 1% V" p/ \8 j" [3 y
//PieCtrlRegs.PIEACK.all = PIEACK_GROUP1; //0x0001赋给12组中断ACKnowledge寄存器,对其全部清除,不接受其他中断
. a7 p, t4 u& H( U3 J CpuTimer1Regs.TCR.bit.TIF=1; // 定时到了指定时间,标志位置位,清除标志
1 y; X9 s8 B0 {' Z$ ?& k3 s' N& y CpuTimer1Regs.TCR.bit.TRB=1; // 重载Timer0的定时数据
6 F: a) s9 B, w; ?1 X( f3 \2 Z* e, O4 b# P9 ~
timer1_count++;
( S6 d4 T6 [0 t, T2 L& x' s if(timer1_count==1)
: U+ i' o1 G- ]/ X {
- ]# Q/ ], n9 ^7 T. b& q timer1_count =0;! q( ]* b3 t& _' A* y
LED2=~LED2;9 M. ]( b; g: [
}
7 M3 _3 u: I8 ?* {& i. V/ m}
* Y; c" T; }) W- o/ n4 L. u& k+ W9 @
; @1 i1 ]2 V& u% _0 r* W2 Q//3s% y: @4 B( E! F, Q2 {: p8 n" d
interrupt void ISRTimer2(void)6 F( @7 C3 e9 a2 G4 d1 B9 Z4 S( e
{6 m1 f) S" K+ J, n
static u8 timer2_count=0;( u+ q% i) H& K& a. f. J' b
// Acknowledge this interrupt to receive more interrupts from group 1- c; l4 H x7 f
PieCtrlRegs.PIEACK.all = PIEACK_GROUP1; //0x0001赋给12组中断ACKnowledge寄存器,对其全部清除,不接受其他中断7 x' H% e: B% k% v) U0 A: V. u3 P
CpuTimer2Regs.TCR.bit.TIF=1; // 定时到了指定时间,标志位置位,清除标志
' N7 s. ^* A4 i1 @* S CpuTimer2Regs.TCR.bit.TRB=1; // 重载Timer0的定时数据
0 F# p2 }# e; t% ~' ~# J) p+ c( ~8 V& y9 e* A, b% X
timer2_count++;
) S& `+ p- `. R0 a: Q7 S1 @ if(timer2_count==1)
# \% }: u$ K L {8 y! n3 B+ W6 I0 K! H4 J
timer2_count =0;- a; a; K) Q9 K- P5 E8 ]
//LED3=~LED3;
& k/ B* y8 [6 K |5 S9 Q }
5 N3 G0 |. Z9 K8 b q6 P% Y}1 `! d* [; N# @( W: V4 W! z
; e/ R+ d( `, l% t N- w: ]指定中断服务函数地址
$ l, ?2 a4 g T' S/ M, b* b- p EALLOW; // protected registers
1 x+ }) j; t0 g4 d* g9 {. N4 h PieVectTable.XINT1 = &ISRExint1; //外部中断1服务程序
1 B! t, z' V$ K2 l' z, ? PieVectTable.TINT0 = &ISRTimer0; //定时器0中断服务3 R: r' f+ o' V4 ?2 K9 |
PieVectTable.XINT13 = &ISRTimer1; //定时器1中断服务8 Z5 n; j$ t" k/ O, m# K
PieVectTable.TINT2 = &ISRTimer2; //定时器2中断服务+ t5 p! W5 \: b- q7 B
EDIS; // This is needed to disable write to EALLOW protected registers
8 ~* x2 a. [5 v' E2 t$ g
9 R0 C) \) C+ G+ ^) k开CPU级中断( I, l3 N- a$ r7 g& o2 a
IER |= M_INT1; //开启CPU中断 组1
5 `; ?1 ^1 x( H& C IER |= M_INT13; //开启CPU中断 13 XINT13 / CPU-Timer1* O+ N9 Z- u' Z7 S8 @
IER |= M_INT14; //开启CPU中断 组14 TINT2
3 P" g% F! L2 K" Q! m0 F& K' t
7 {5 S7 u5 ~" s' j& H/ l PieCtrlRegs.PIEIER1.bit.INTx7= 1; //CPU定时器 TIMER0中断 组1的第4个中断使能
& `% B3 t( T+ U! Q$ e& ~( M* O( G9 } CpuTimer1Regs.TCR.all = 0x4001; // 使能TIMER1 Use write-only instruction to set TSS bit = 0
8 D$ K1 s' k3 q# L0 U. h CpuTimer2Regs.TCR.all = 0x4001; // 使能TIMER2 Use write-only instruction to set TSS bit = 04 d" Q" g. v7 J
* Q/ B- {# H& h; D4 R9 w; _9 ^7 H( L
EINT; //开启全局中断
4 X0 p% R/ E, P+ q* L# r* { ERTM; //开启全局实时中断,调试用DBGM |
|