|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
外部中断初始化
( [" H! a0 Y! X* _& `* o#include "extint.h"5 T8 ?( @9 P3 V N
//按键和外部中断都用了GPIO13,查询和中断不能同时使用) w: @* N6 x' y" R5 A A1 b
void InitExtInt(void)5 Z* y* d: I6 r. f- T8 c
{
4 }, c5 ] T/ T/ ` EALLOW;6 V! O0 L+ o* u2 R
GpioCtrlRegs.GPAMUX1.bit.GPIO13 = 0;
. C6 z0 B: }. L( z, u% ^ GpioCtrlRegs.GPADIR.bit.GPIO13 = 0; //作为输入IO口
8 q7 J8 s2 `) x- G, `GpioCtrlRegs.GPAQSEL1.bit.GPIO13= 0; //和时钟同步0 L3 @6 S2 Y. K5 Y
GpioIntRegs.GPIOXINT1SEL.bit.GPIOSEL = 13; //选择GPIO13为外部输入XINT1输入引脚& j$ v4 K1 l, M9 i/ p* [
XIntruptRegs.XINT1CR.bit.POLARITY= 0; //下降沿触发中断/ L, \6 N% ~# Q: l+ g9 b
XIntruptRegs.XINT1CR.bit.ENABLE = 1; //使能XINT1中断
& C5 y8 ?! x5 B" H$ |EDIS;
w8 q Y# L' Z/ T0 f4 ~. S0 g}
0 X4 ?$ D% ?7 D& Y& f: c7 Q$ x9 L6 O. L/ _
//外部中断1服务函数 ,按下按键,进中断,亮灯响鸣
1 E; O1 V3 |* A* iinterrupt void ISRExint1(void)) z: \% d7 ~# T$ X- H
{
* b$ W* B# |* d, z7 ] PieCtrlRegs.PIEACK.all = PIEACK_GROUP1;- m J, h. b/ g& I4 Q, U6 |
DELAY_US(1000);
: L- a" M, m& I- ]if(GpioDataRegs.GPADAT.bit.GPIO13 == 0). D o- Y2 L- f" ]9 @: U
{
) q. f i* }, d8 v1 h LED4=~LED4;
9 L8 n4 M, L9 z D BUZZ_ON2 m8 t3 w! u8 p3 k: n/ B
DELAY_US(100000);
. O0 ?% L: F" W: R BUZZ_OFF' K& o @$ \5 g) f, l7 H
DELAY_US(100000);2 h- R. Z8 H2 `5 K
BUZZ_ON
" b' d' c2 s! }2 c DELAY_US(100000);* Y, b! ]! { V o. _0 h
BUZZ_OFF
_$ P/ H- ~' g) P, b: n1 i* }* i9 ` }
0 P# X+ ^* E; S! g7 `% Z}5 x; m/ f9 E. Y2 p6 G; z1 z! B
& }3 F: v! B( e m
: v$ F3 c m# T3 O) i0 q
定时器0,1,2中断初始化% ~/ \5 P5 i7 |
InitCpuTimers(); // For this example, only initialize the Cpu Timers
+ j- n7 M) u& m6 Q! _ ConfigCpuTimer(&CpuTimer0, 150, 500000); // 500us 150MHz CPU Freq, 1 second Period (in uSeconds)
9 T7 i+ p/ h& w9 d$ r: { ConfigCpuTimer(&CpuTimer1, 150, 1000000);4 o2 E) G! i. D y- c0 h' G* P2 Y
ConfigCpuTimer(&CpuTimer2, 150, 3000000);" |/ I% h4 _( G
StartCpuTimer0();. F3 d |& ]8 g) V5 t$ f9 D
StartCpuTimer1();
6 d% K4 K- ?/ h0 o StartCpuTimer2();8 ~$ {) y' P$ e' r5 N, _
+ F, v& ?0 T2 A
: P. P) h8 s- G/ ^0 f#include "timer.h"! _+ e+ j' i: A4 V5 E
interrupt void ISRTimer0(void)
0 a; `. ~0 I; O4 g{
f8 F! R6 ~9 v, G static u8 timer0_count=0;
! X, ^! C/ _" v* h1 Y, H// Acknowledge this interrupt to receive more interrupts from group 1: @' N, Z4 O5 w
PieCtrlRegs.PIEACK.all = PIEACK_GROUP1; //0x0001赋给12组中断ACKnowledge寄存器,对其全部清除,不接受其他中断: J" X: R. Q: O+ x( ? g" s
CpuTimer0Regs.TCR.bit.TIF=1; // 定时到了指定时间,标志位置位,清除标志% ~3 S4 @$ Z$ ` Y. U2 T
CpuTimer0Regs.TCR.bit.TRB=1; // 重载Timer0的定时数据
4 `2 v1 r2 h2 |1 b( ]7 U, U* H P$ k
timer0_count++;: i& A3 r4 _! e* G
if(timer0_count==4) //2000ms =2s
1 t! n0 k& P% M" N. Y5 R {
8 v+ e) t/ p0 v3 A* |/ G) e+ Y2 ^ timer0_count =0;8 H& N( F! Y2 M7 P2 K0 V5 _* F1 `
LED1=~LED1;
2 p3 S4 {+ P% y2 @ }& d+ q# d3 g2 I8 t$ K
}* r1 _; p/ [/ Z" ?- e
0 R: k) |' X. v, I
) G' V0 W+ L2 N# P* i6 q
//1s% z/ V+ ^- H5 {. N5 x
interrupt void ISRTimer1(void)
c" ^" B# \3 S- e5 i{+ e9 x' n" e& c5 @3 r0 L
static u8 timer1_count=0;
, v$ [2 G* Z0 P) U0 q$ Y' q// Acknowledge this interrupt to receive more interrupts from group 1
1 L# e7 K# i6 L2 R5 C) N7 Q' n //PieCtrlRegs.PIEACK.all = PIEACK_GROUP1; //0x0001赋给12组中断ACKnowledge寄存器,对其全部清除,不接受其他中断
! Q/ K- ^: C7 r3 a6 P0 g! u, Y CpuTimer1Regs.TCR.bit.TIF=1; // 定时到了指定时间,标志位置位,清除标志; _* O# C+ C! X& H
CpuTimer1Regs.TCR.bit.TRB=1; // 重载Timer0的定时数据# Z5 {3 d. i$ o8 X' L
% ?: r9 w! z, d+ Q5 c7 n
timer1_count++;) k6 J5 X& @: ]3 ~* G5 ?5 ^
if(timer1_count==1)/ N8 y$ j, }# @/ U
{7 w% s2 f+ n! A: l" T$ u, h
timer1_count =0;
" J6 C! J5 T) O0 Y' K, N) f LED2=~LED2;
' v4 ^$ b0 Z1 x4 h) r }
& y/ s! X+ R- a8 k- Q# n8 s}
7 F7 P0 f9 c/ @- i* H0 t. g) n; U, R5 K _! |8 V9 }6 h* l) R
//3s# b5 q7 p2 h7 w* o4 q2 M0 N
interrupt void ISRTimer2(void)/ o# ]/ y6 x6 L ^
{3 f7 A, s0 ~, B5 ? \1 G, H
static u8 timer2_count=0;8 z, D* N' J" T5 W2 t
// Acknowledge this interrupt to receive more interrupts from group 1" ?$ [+ A( e1 f4 l+ ~" V( g. U7 V
PieCtrlRegs.PIEACK.all = PIEACK_GROUP1; //0x0001赋给12组中断ACKnowledge寄存器,对其全部清除,不接受其他中断
& J4 h- }3 ~6 m. h, U" w CpuTimer2Regs.TCR.bit.TIF=1; // 定时到了指定时间,标志位置位,清除标志4 r5 G4 s# S, | ^& o0 ^9 N
CpuTimer2Regs.TCR.bit.TRB=1; // 重载Timer0的定时数据) D. Z+ h( [5 I% \
! ~/ C5 A* a9 @5 u, o* }7 E' W
timer2_count++;
3 A3 D; N# F; }3 B if(timer2_count==1)
* F5 ?/ F3 E; K; w/ Q6 y {3 C: X }; B1 e* q5 H g' F5 Q
timer2_count =0;! L* `4 \# E% a% Z! i* Y
//LED3=~LED3;/ ^8 b7 R# _/ @" f$ @" Y7 e% ^* U
}
7 c6 d- f6 ^" j! N% m" @8 T9 Z}; b8 t1 f' J$ v: y* }
/ \6 k7 J/ w+ |1 @4 O0 |
指定中断服务函数地址
0 j5 A5 m. A: d) U ~% @8 D/ z EALLOW; // protected registers9 a# ~7 m U3 b6 h
PieVectTable.XINT1 = &ISRExint1; //外部中断1服务程序
: W1 i1 `1 o: y% ~ PieVectTable.TINT0 = &ISRTimer0; //定时器0中断服务
! F" u0 N/ a3 Q! ~- u+ V6 M PieVectTable.XINT13 = &ISRTimer1; //定时器1中断服务+ R7 I% q) ~9 Q6 i9 ?
PieVectTable.TINT2 = &ISRTimer2; //定时器2中断服务; c+ B# s. k, u- Q
EDIS; // This is needed to disable write to EALLOW protected registers
5 C5 ^0 W1 b3 W& L: @/ v8 a" c/ \
; u( {: n0 T0 q) u9 V开CPU级中断# ^( I: ` K! D! Q
IER |= M_INT1; //开启CPU中断 组1
: d$ ?5 G+ p( T" \6 b6 J IER |= M_INT13; //开启CPU中断 13 XINT13 / CPU-Timer1 H1 V+ e, E) K* q
IER |= M_INT14; //开启CPU中断 组14 TINT2$ n: v9 p$ a( o+ _3 z6 s8 A, h
* b, o' M( s# \0 a1 K6 N
PieCtrlRegs.PIEIER1.bit.INTx7= 1; //CPU定时器 TIMER0中断 组1的第4个中断使能
- d6 q: p0 A9 A6 p CpuTimer1Regs.TCR.all = 0x4001; // 使能TIMER1 Use write-only instruction to set TSS bit = 08 d h8 S; x& `$ b
CpuTimer2Regs.TCR.all = 0x4001; // 使能TIMER2 Use write-only instruction to set TSS bit = 0/ Q1 N: ?3 B6 N+ ^( G$ ?
2 B, r, i5 m' \- y7 [9 F EINT; //开启全局中断
" D: E3 \" ~; Y9 } ERTM; //开启全局实时中断,调试用DBGM |
|