|
EDA365欢迎您!
您需要 登录 才可以下载或查看,没有帐号?注册
x
外部中断初始化
0 \5 {7 b! S/ P#include "extint.h"* J$ R$ x; [: R4 [
//按键和外部中断都用了GPIO13,查询和中断不能同时使用
3 \8 F5 Z: C! ~& Nvoid InitExtInt(void)
7 f9 S$ D2 C' p1 Q! R. _{0 `, l2 W$ U j* r* w
EALLOW;
( ?$ W' c4 |5 N _( \ GpioCtrlRegs.GPAMUX1.bit.GPIO13 = 0;
$ f, g1 u7 g, h# K; {5 v2 a) A GpioCtrlRegs.GPADIR.bit.GPIO13 = 0; //作为输入IO口4 U4 p& F+ {0 C0 p
GpioCtrlRegs.GPAQSEL1.bit.GPIO13= 0; //和时钟同步$ ^+ U# c8 n7 \3 A$ ^- x# {
GpioIntRegs.GPIOXINT1SEL.bit.GPIOSEL = 13; //选择GPIO13为外部输入XINT1输入引脚2 s6 V# g% i2 \: v
XIntruptRegs.XINT1CR.bit.POLARITY= 0; //下降沿触发中断% A! i6 m" J/ Q* ]
XIntruptRegs.XINT1CR.bit.ENABLE = 1; //使能XINT1中断. I& K: Z" J+ e. C5 g9 X; f8 U. N- `
EDIS;
& z7 J8 M, v7 Y9 D}
8 t7 s: h6 T# u: N7 p7 @: o
: G2 g+ \4 Q ~3 e; M//外部中断1服务函数 ,按下按键,进中断,亮灯响鸣
7 B- d0 K, J/ j. P ?2 [' H# u$ E' uinterrupt void ISRExint1(void)
2 Z8 b/ I; ^) K" E" T1 M, ^ B{
' D% v7 G& A7 [8 U$ V! ` PieCtrlRegs.PIEACK.all = PIEACK_GROUP1;
8 J& L8 w8 |. I) NDELAY_US(1000);
" x! M2 j" r! k1 H1 Mif(GpioDataRegs.GPADAT.bit.GPIO13 == 0)3 _' X% e" P& C8 i! C
{2 L# K) A% V' {# s9 D. o2 W, t
LED4=~LED4;
3 Y* r* H/ Y+ f0 i6 k7 p2 R3 Q) X BUZZ_ON
0 Y+ X+ G: x: m5 s3 S4 q. f DELAY_US(100000);
# q7 h# m$ ^% M, Y& V BUZZ_OFF
) v0 O& W2 t$ E% u. f DELAY_US(100000);3 [$ T: P) A8 y1 K; d; N
BUZZ_ON5 S8 e' V% `' m- P% @8 P4 P3 G- N
DELAY_US(100000);
; {+ s* w6 J# H/ h( \0 T Q/ g BUZZ_OFF
2 }# ~2 B0 e* _1 b% _6 l" q }
# E+ s' l' q! n8 g: u2 ~- G6 H}+ c0 e4 u, D2 ?6 r/ l0 t. M" _
1 i, O* a# t+ K
; Q2 I; _. l% o$ P) t定时器0,1,2中断初始化
, L( D6 ~2 J$ z8 h InitCpuTimers(); // For this example, only initialize the Cpu Timers/ T9 p3 _# ?' w7 z( A% e [
ConfigCpuTimer(&CpuTimer0, 150, 500000); // 500us 150MHz CPU Freq, 1 second Period (in uSeconds)$ ^7 }1 s& e0 t7 d: e' B8 Q
ConfigCpuTimer(&CpuTimer1, 150, 1000000);
" n6 s$ c1 J. v4 i ConfigCpuTimer(&CpuTimer2, 150, 3000000);: R9 w' V' ^; X* ?3 ^9 I/ ^5 Y; x
StartCpuTimer0();
' d. q) V* _( S9 L% r3 ? StartCpuTimer1();/ T/ t6 M2 r! G4 T2 f: c
StartCpuTimer2();
6 L, p+ j+ f- {9 b
; O6 @& O+ {; p' g2 _ Y- }1 S& l0 H. u z0 f) o) e
#include "timer.h"
* _8 u9 C7 p/ f. f# Linterrupt void ISRTimer0(void)
+ y6 s* P5 I) o{+ s, p; n/ Z. |
static u8 timer0_count=0;9 U0 @4 v2 v. l* K* g2 r) q
// Acknowledge this interrupt to receive more interrupts from group 1, F% o- ]0 I4 d% {) N( o
PieCtrlRegs.PIEACK.all = PIEACK_GROUP1; //0x0001赋给12组中断ACKnowledge寄存器,对其全部清除,不接受其他中断5 T2 z8 t( F' K5 z& {
CpuTimer0Regs.TCR.bit.TIF=1; // 定时到了指定时间,标志位置位,清除标志" z/ B7 A; G" `9 Z% v
CpuTimer0Regs.TCR.bit.TRB=1; // 重载Timer0的定时数据
7 Y4 `$ U( z: G. t7 O# C
i5 r6 h% G/ e4 J) Z4 n2 T/ y5 D timer0_count++;
1 W0 W/ W2 s# i K6 S if(timer0_count==4) //2000ms =2s
5 R! R$ B. {% t6 | K {$ B+ N0 I/ D% i$ Q
timer0_count =0;
v$ O9 v* t7 }' Y z LED1=~LED1;$ P/ G; o% _, x& H, H" l
}+ W! ~$ n- s7 |$ H7 z% P
}
$ v6 ]' j- H; F3 X1 E% n$ ]6 ]1 a% k& `: C, i
. {: E. }+ n4 O* [' ]
//1s+ ^" Q: J+ ^) W
interrupt void ISRTimer1(void)2 p3 N/ P5 ?# _" M& P+ [
{( R7 D/ o( O( S& I
static u8 timer1_count=0;
. C, t, S" A$ p3 t; z// Acknowledge this interrupt to receive more interrupts from group 1) i1 G/ e# T2 E3 n
//PieCtrlRegs.PIEACK.all = PIEACK_GROUP1; //0x0001赋给12组中断ACKnowledge寄存器,对其全部清除,不接受其他中断
6 G% P2 x5 V& U- u" b CpuTimer1Regs.TCR.bit.TIF=1; // 定时到了指定时间,标志位置位,清除标志
1 n, S0 W8 s+ Q) ~# ?1 ^) r2 A; p) | CpuTimer1Regs.TCR.bit.TRB=1; // 重载Timer0的定时数据
# z4 s" R" q% K" i6 m
) d/ j. |, n- y6 M- R timer1_count++;; w3 n4 P, n {/ K! z
if(timer1_count==1)/ b5 \" q- Z& n' j) u& Y9 x( o: J
{
8 c- _! y. }' U. h timer1_count =0;
h" I# S6 P4 F$ k LED2=~LED2;/ [5 R6 S* C0 P4 I4 ~
}
( {8 L' c: V9 ?! o}
& P o% Z# P4 \% k
6 k" t' [2 y9 s$ q3 M//3s" w0 l- c6 v. P: T/ T4 J
interrupt void ISRTimer2(void)6 B8 w4 c3 ~# L# J$ E& d
{+ H/ d! c1 l X6 [
static u8 timer2_count=0;
5 z3 e7 v1 N* C/ K// Acknowledge this interrupt to receive more interrupts from group 1
; F$ K( V% X# l PieCtrlRegs.PIEACK.all = PIEACK_GROUP1; //0x0001赋给12组中断ACKnowledge寄存器,对其全部清除,不接受其他中断/ g! `! q2 M; }3 \' @' |7 H
CpuTimer2Regs.TCR.bit.TIF=1; // 定时到了指定时间,标志位置位,清除标志
& ]3 A1 _- J; X) F3 o$ t CpuTimer2Regs.TCR.bit.TRB=1; // 重载Timer0的定时数据
5 u; B( P" L9 m
4 ^5 I7 o3 F: u timer2_count++;
5 l, P3 l% v! P* f if(timer2_count==1)0 p1 D, W) A( S+ r7 |" [( v) ]7 u
{
1 N& ^! n; q8 L) b- O1 M timer2_count =0;; n' y6 r8 O J! r Z! a
//LED3=~LED3;; j' F6 ]$ C2 L
}! R6 u' q# v. [
}
2 a7 a; `/ W( A; S7 x: ~: B/ |$ ^: Y, s- V
指定中断服务函数地址
" C2 Z$ _& n; I/ D& l EALLOW; // protected registers
" a+ z1 D" U6 X! S: B PieVectTable.XINT1 = &ISRExint1; //外部中断1服务程序
$ G: B. F9 `4 k; J. D; j PieVectTable.TINT0 = &ISRTimer0; //定时器0中断服务5 B& z" J6 {$ K* P1 H3 t, ?) z
PieVectTable.XINT13 = &ISRTimer1; //定时器1中断服务; Y2 f g9 ~2 `1 j
PieVectTable.TINT2 = &ISRTimer2; //定时器2中断服务) V5 ]$ O# i* ]: S9 b( k
EDIS; // This is needed to disable write to EALLOW protected registers; n6 H0 Q9 T5 U0 A: |4 y$ d
( |( w' _2 x, i" S2 {* g8 L
开CPU级中断# w0 Z% v/ X7 s& y4 \' A
IER |= M_INT1; //开启CPU中断 组1
, ^3 M0 s- F7 c3 r) N5 @' L IER |= M_INT13; //开启CPU中断 13 XINT13 / CPU-Timer1
~- }& w/ ?( Y5 L& I2 ` IER |= M_INT14; //开启CPU中断 组14 TINT2& Q A( `5 }3 y# o
2 Y5 J8 t" Q6 A0 O n* u PieCtrlRegs.PIEIER1.bit.INTx7= 1; //CPU定时器 TIMER0中断 组1的第4个中断使能
# a# G& _- A Z9 K CpuTimer1Regs.TCR.all = 0x4001; // 使能TIMER1 Use write-only instruction to set TSS bit = 0! n" j& g" a1 ]9 }2 M a- {
CpuTimer2Regs.TCR.all = 0x4001; // 使能TIMER2 Use write-only instruction to set TSS bit = 0) J8 e; [4 t, u& E
; r5 W5 W7 {6 G7 k EINT; //开启全局中断/ M |# A" G, R- O2 ?, p, q0 E
ERTM; //开启全局实时中断,调试用DBGM |
|