找回密码
 注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

巢课
电巢直播8月计划
查看: 206|回复: 2
打印 上一主题 下一主题

[经验] DSP28335定时器和外部输入中断

[复制链接]

156

主题

503

帖子

1186

积分

四级会员(40)

Rank: 4Rank: 4Rank: 4Rank: 4

积分
1186
跳转到指定楼层
1#
发表于 2016-6-28 14:50 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

EDA365欢迎您!

您需要 登录 才可以下载或查看,没有帐号?注册

x
外部中断初始化
# L* D2 g, E" l2 N#include "extint.h"# Z& j$ S9 t0 i+ F
//按键和外部中断都用了GPIO13,查询和中断不能同时使用
; O' s, \" w$ @' t" ^void InitExtInt(void)
3 f( Q& ]6 _4 G3 e0 G& Z3 g& ~{2 G5 m/ u$ K, Q2 q' S
     EALLOW;) g# K* ]  e0 [4 ]5 T2 U
     GpioCtrlRegs.GPAMUX1.bit.GPIO13 = 0;
: ]: x% O- T" Y     GpioCtrlRegs.GPADIR.bit.GPIO13 = 0;           //作为输入IO口
) h0 d* L% N9 N, `/ f  E5 kGpioCtrlRegs.GPAQSEL1.bit.GPIO13= 0;          //和时钟同步* t# {+ [, I. R* B% c
     GpioIntRegs.GPIOXINT1SEL.bit.GPIOSEL = 13;    //选择GPIO13为外部输入XINT1输入引脚( n; F9 M& B% f7 f6 ~
XIntruptRegs.XINT1CR.bit.POLARITY= 0;         //下降沿触发中断
+ P8 m! X, K% k; e6 @XIntruptRegs.XINT1CR.bit.ENABLE = 1;          //使能XINT1中断( F4 m* {, D4 S( ~0 P7 Z3 v
EDIS;. G8 E1 p0 a4 G- g" Y' \/ l
}  L6 n: Q5 ^% K3 A7 R

& j# f  r) o: l& x8 i  U//外部中断1服务函数  ,按下按键,进中断,亮灯响鸣2 {4 H& F7 Y# q2 T; n, r& h
interrupt void ISRExint1(void)$ b9 k/ Y8 j/ q
{0 V' O3 W+ z2 e+ @
        PieCtrlRegs.PIEACK.all = PIEACK_GROUP1;  Z" }3 s) k8 o$ d
DELAY_US(1000);- q8 v" W: c8 U; B; F: e
if(GpioDataRegs.GPADAT.bit.GPIO13 == 0)
3 N( J. I: ]. `; J# X{) V9 }% P( V) i' y( Z  ~
    LED4=~LED4;
% b* B: W0 D; `$ N    BUZZ_ON' C7 D3 t. Y! i1 z' Q# A! |
    DELAY_US(100000);
# r) S# p) Y/ z    BUZZ_OFF
+ i" l0 b% a7 {. w1 l) `2 N      DELAY_US(100000);; g' z; O! l% ]* A  B
    BUZZ_ON) E4 v; X# P( S  I1 u2 {
    DELAY_US(100000);5 b* N$ n6 w6 }+ {/ c
    BUZZ_OFF
  B4 G2 n% s- l    }7 \7 M. \  K% n4 H9 f; B' ^
}
9 N$ {3 G# g- B, y8 e2 ^) o$ h4 ?8 B
  t+ R  x, k9 p1 a* V( r
定时器0,1,2中断初始化
1 Q  c! y# j& J$ h; i7 E    InitCpuTimers();   // For this example, only initialize the Cpu Timers1 r9 a  ~3 f  ^' g' Z7 @
    ConfigCpuTimer(&CpuTimer0, 150, 500000);  // 500us 150MHz CPU Freq, 1 second Period (in uSeconds)) f) J! s2 H* A$ X3 F! e# W3 K) ~) K$ W
    ConfigCpuTimer(&CpuTimer1, 150, 1000000);* [- K4 `& A, g
    ConfigCpuTimer(&CpuTimer2, 150, 3000000);
) m( b9 E0 C! u9 c; S    StartCpuTimer0();
# N9 j$ w: J. q* Q/ _* d7 v    StartCpuTimer1();8 Y4 u. L1 i( O* Y
    StartCpuTimer2();' K. {7 K" [2 e6 P, \# C' [% p

* Y: V. Z- N5 R5 u( L- S. ~' z/ R- Z- A/ N# N% h
#include "timer.h"' B9 M! \, C  b/ T% Y/ P9 n* j1 M: H2 \  d
interrupt void ISRTimer0(void)( I" l7 C: ~% ^9 I4 y6 P. y# s' g
{% f- s" U( P# S" @6 H7 j
    static u8 timer0_count=0;; d, }0 e0 j$ O- D* U- u
// Acknowledge this interrupt to receive more interrupts from group 1
8 {/ F( ?: ^# v. t2 p! F2 X    PieCtrlRegs.PIEACK.all = PIEACK_GROUP1; //0x0001赋给12组中断ACKnowledge寄存器,对其全部清除,不接受其他中断2 y1 H( U  C3 T4 S% s# V) w4 M/ f- }
    CpuTimer0Regs.TCR.bit.TIF=1; // 定时到了指定时间,标志位置位,清除标志
/ C" g; j  t/ N* r* X! j' F/ {, m    CpuTimer0Regs.TCR.bit.TRB=1;  // 重载Timer0的定时数据
% e9 }5 z0 D1 c9 e" i2 o  @" w8 I/ h  L8 Z, M0 l/ K
    timer0_count++;
; J4 q  W' d9 h    if(timer0_count==4)  //2000ms =2s* k$ e7 Y' O- _6 @% V! B* N6 c& Z
    {  f1 m: x4 L) C& J. s$ {  m% ^1 Y
    timer0_count =0;% N) h, V3 L% P5 [* H+ ?: \
    LED1=~LED1;
1 i7 ?+ O( `5 Q+ N    }& o1 L% X* v2 ]3 ~
}
+ z) L$ `9 V% L! J7 c
. X" \) D0 U+ |; Y# A: @5 R% o: h
8 t! S: T# @. N+ |9 p0 B//1s, z7 R6 ?/ `7 O0 f  K" T5 H# B8 L
interrupt void ISRTimer1(void)
5 D- _9 O' B; O) d. I8 p: S! h{
' M( S; u3 i; Y3 B; p    static u8 timer1_count=0;
: u5 m( }9 I0 l// Acknowledge this interrupt to receive more interrupts from group 1* i! M$ n! I6 p
    //PieCtrlRegs.PIEACK.all = PIEACK_GROUP1; //0x0001赋给12组中断ACKnowledge寄存器,对其全部清除,不接受其他中断9 r) k( t+ R) O: o- Y
    CpuTimer1Regs.TCR.bit.TIF=1; // 定时到了指定时间,标志位置位,清除标志
/ ~9 _/ D4 X7 L, }6 r' M* K; h    CpuTimer1Regs.TCR.bit.TRB=1;  // 重载Timer0的定时数据
* j1 d- L9 x8 I# t4 b! b% E) P: e/ Z8 T% t  a/ I) w* J
    timer1_count++;& V0 y6 Z$ I& F, U0 ]# b
    if(timer1_count==1)
' u/ m0 \' b" n& G, s    {2 G: t4 I. I  b( G/ k/ R/ i
    timer1_count =0;
+ z" |( [( x5 X    LED2=~LED2;" u3 Z3 G: E: z) z& {3 E
    }
1 O( a. T/ A& s* D# u}
/ w: Y8 K# w9 A
9 x* \/ j% S- J6 B; z//3s$ o/ T1 n4 }- B/ ?
interrupt void ISRTimer2(void)
1 I# z' r" ]3 ~8 e3 X0 j, @3 G{' R2 S& W" a7 v( H
    static u8 timer2_count=0;
; e7 G, }4 S9 d, q6 P  b// Acknowledge this interrupt to receive more interrupts from group 12 @- W4 M+ _5 s& q& D
    PieCtrlRegs.PIEACK.all = PIEACK_GROUP1; //0x0001赋给12组中断ACKnowledge寄存器,对其全部清除,不接受其他中断
& {5 {" f7 N$ C    CpuTimer2Regs.TCR.bit.TIF=1; // 定时到了指定时间,标志位置位,清除标志
4 s4 U7 m  N  J4 X9 W1 P    CpuTimer2Regs.TCR.bit.TRB=1;  // 重载Timer0的定时数据
' s1 H% L3 y9 u* K  T& ?; c
( D( u' t0 m0 ?0 W$ O7 H    timer2_count++;" V0 Y) c' S3 |8 N
    if(timer2_count==1)9 D) w7 B3 Y& b% ?3 }
    {" O0 m4 b- [9 ^7 ^) m- l- P
    timer2_count =0;. y0 `- H8 S' b0 y
    //LED3=~LED3;
/ J% [$ D- _! u8 P    }, k5 R; s+ C: |- i% \" c! M
}9 ]! j: d! \  a! n/ n- I
1 t2 y0 j2 u! g. y2 G2 g
指定中断服务函数地址
% Z2 E' k: \, e  @" j+ G' W. x     EALLOW;  //  protected registers
# k9 ~, @, Y, e. L' E1 S/ Q4 ^3 }% z3 |    PieVectTable.XINT1 = &ISRExint1;  //外部中断1服务程序' Z3 a0 Q) A- q9 |
    PieVectTable.TINT0 = &ISRTimer0;   //定时器0中断服务
# Q5 }/ g8 ]1 P7 m    PieVectTable.XINT13 = &ISRTimer1;   //定时器1中断服务2 ?, E4 n$ t9 s  ]6 q, N) D; o
    PieVectTable.TINT2  =  &ISRTimer2;    //定时器2中断服务
- u. [& r# ~3 J. g- m$ t    EDIS;    // This is needed to disable write to EALLOW protected registers
' J( r& |4 {$ E5 {
* L! b$ U) U: ^8 X& [开CPU级中断
# g- z6 Z2 S7 M: Z1 K* H    IER |= M_INT1;    //开启CPU中断 组1& S! w! P7 X" B2 }7 d
    IER |= M_INT13;   //开启CPU中断 13   XINT13 / CPU-Timer1
2 c5 d. g" Z7 A    IER |= M_INT14;   //开启CPU中断 组14 TINT24 B% Q  F& Y9 O' a, |
   
7 W8 d# e4 D! l    PieCtrlRegs.PIEIER1.bit.INTx7= 1;  //CPU定时器 TIMER0中断   组1的第4个中断使能6 \2 h* w$ A* G( b& a) ~0 k
    CpuTimer1Regs.TCR.all = 0x4001; // 使能TIMER1 Use write-only instruction to set TSS bit = 0& l# G" q. @, H- K2 x9 Q
    CpuTimer2Regs.TCR.all = 0x4001; // 使能TIMER2 Use write-only instruction to set TSS bit = 0
0 a0 x+ P8 ~  w  `" j: ?5 S& }! S/ `8 ^- @2 w% G) R
    EINT;   //开启全局中断
7 ?( l+ Y0 I% ?% Z5 Z# O    ERTM;   //开启全局实时中断,调试用DBGM
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友 微信微信
收藏收藏 支持!支持! 反对!反对!

155

主题

662

帖子

1191

积分

四级会员(40)

Rank: 4Rank: 4Rank: 4Rank: 4

积分
1191
2#
发表于 2016-6-29 09:53 | 只看该作者
资源多,学习不止步* U+ Y/ m& ]5 b

160

主题

620

帖子

1233

积分

四级会员(40)

Rank: 4Rank: 4Rank: 4Rank: 4

积分
1233
3#
发表于 2016-6-29 10:08 | 只看该作者
必须赞一个~; G/ |6 l& e& c/ a3 m# I
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

推荐内容上一条 /1 下一条

巢课

技术风云榜

关于我们|手机版|EDA365 ( 粤ICP备18020198号 )

GMT+8, 2024-11-24 04:01 , Processed in 0.056156 second(s), 32 queries , Gzip On.

深圳市墨知创新科技有限公司

地址:深圳市南山区科技生态园2栋A座805 电话:19926409050

快速回复 返回顶部 返回列表