OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 6605|回复: 14

怎么用51核的cc2530做一个100us的定时中断?新人求解答

[复制链接]

7

主题

21

帖子

0

精华

初级会员

Rank: 2

积分
69
金钱
69
注册时间
2015-8-15
在线时间
0 小时
发表于 2015-8-26 09:39:42 | 显示全部楼层 |阅读模式
5金钱
我用的是定时器3,看TI的官方例程都是用自由计数模式,最快都要255us一次中断,而我把模式改成模模式或者倒计数模式,也设置了初值,定时器都没在工作(我用ccdebugger看T3CNT判断的)。我再做旋转编码器的去抖所以想定个100us的定时中断。

最佳答案

查看完整内容[请看2#楼]

回复【2楼】小李飞砖: --------------------------------- //定时器初始化 void InitT3() {        T3CTL |= 0x08 ;         //开溢出中断        T3IE = 1;               //开T3中断  &n ...
不要怂!就是干!
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

10

主题

560

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1739
金钱
1739
注册时间
2014-6-27
在线时间
943 小时
发表于 2015-8-26 09:39:43 | 显示全部楼层
回复【2楼】小李飞砖:
---------------------------------
//定时器初始化
void InitT3()
{     
  T3CTL |= 0x08 ;         //开溢出中断     
  T3IE = 1;               //开T3中断
  T3CTL|=0XE0;            //128分频,128/16000000*N=0.5S,N=62500
  T3CTL &= ~0X03;         //自动重装,选择自由模式 00->0xff  62500/256=244(次)
  T3CTL |=0X10;           //启动
  EA = 1; //开总中断
}
你自己改下参数,得到你要的时间。
回复

使用道具 举报

7

主题

21

帖子

0

精华

初级会员

Rank: 2

积分
69
金钱
69
注册时间
2015-8-15
在线时间
0 小时
 楼主| 发表于 2015-8-26 15:38:22 | 显示全部楼层
调试半天发现定时器3会工作,但是在启动后会进一次中断,然后就关闭了(我是直接看T3CTL的值判断的),得在中断里添加T3CTL |= 0x10才能保证定时器继续工作。。。
但是这是为什么啊?定时器3会自动关闭,我是在裸机上跑的实验,也没看到其他地方有对T3CTL的START位清零啊,有没有51高手?求指导!!
不要怂!就是干!
回复

使用道具 举报

7

主题

21

帖子

0

精华

初级会员

Rank: 2

积分
69
金钱
69
注册时间
2015-8-15
在线时间
0 小时
 楼主| 发表于 2015-8-27 10:43:10 | 显示全部楼层
回复【3楼】TinyBoy:
---------------------------------
其实我是想用模模式或者倒计数模式,这样设置方便,也不需要在中断做累加处理。你这个方法我也用过,但是不能准确定时100us,会有十几微秒的偏差。现在我可以用模模式了,但是会出现我在1楼说的那种情况,你知道是怎么回事吗?T3CTL的START会硬件清零?
不要怂!就是干!
回复

使用道具 举报

10

主题

560

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1739
金钱
1739
注册时间
2014-6-27
在线时间
943 小时
发表于 2015-8-27 10:57:29 | 显示全部楼层
回复【4楼】小李飞砖:
---------------------------------
十几微秒的偏差?不管用哪种模式,都能得到准确中断时间的,时间不对是你设置的问题。
回复

使用道具 举报

7

主题

21

帖子

0

精华

初级会员

Rank: 2

积分
69
金钱
69
注册时间
2015-8-15
在线时间
0 小时
 楼主| 发表于 2015-8-27 11:10:55 | 显示全部楼层
回复【5楼】TinyBoy:
---------------------------------
如果定时器的输入频率是16M,工作在自由计数模式,那么每次中断周期都是以255*计数一次的时间,这个计数时间是从16M分频之后得来的,这样怎么都不会有整100us出现吧?
不要怂!就是干!
回复

使用道具 举报

7

主题

21

帖子

0

精华

初级会员

Rank: 2

积分
69
金钱
69
注册时间
2015-8-15
在线时间
0 小时
 楼主| 发表于 2015-8-27 11:14:04 | 显示全部楼层
回复【6楼】小李飞砖:
---------------------------------
我之前的意思是,相对于100us而言,自由模式的中断周期会有一定偏差。还有。。。我1楼提的那种情况能顺带解答下么。。。
不要怂!就是干!
回复

使用道具 举报

10

主题

560

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1739
金钱
1739
注册时间
2014-6-27
在线时间
943 小时
发表于 2015-8-27 11:22:58 | 显示全部楼层
回复【6楼】小李飞砖:
---------------------------------
用溢出模式,得不到整的100US,你就用其他方式,看你做的东西,时间也不是要很准的,不一定就是100US。当然,这个100US一定可以弄出来的,你用其他方式。
回复

使用道具 举报

10

主题

560

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1739
金钱
1739
注册时间
2014-6-27
在线时间
943 小时
发表于 2015-8-27 11:29:49 | 显示全部楼层
回复【7楼】小李飞砖:
---------------------------------
用溢出模式,可以得到96US的时间,如果用其他模式,可以得到你想要的100US,多动手试试,不要怀疑它。
回复

使用道具 举报

10

主题

560

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1739
金钱
1739
注册时间
2014-6-27
在线时间
943 小时
发表于 2015-8-27 11:39:29 | 显示全部楼层
回复【7楼】小李飞砖:
---------------------------------
如果你真想用溢出中断,就做个变量累计,可以得到接近100US的时间,不要太纠结那一点点误差,你又不是做想要很精准的东西。
回复

使用道具 举报

7

主题

21

帖子

0

精华

初级会员

Rank: 2

积分
69
金钱
69
注册时间
2015-8-15
在线时间
0 小时
 楼主| 发表于 2015-8-27 12:09:18 | 显示全部楼层
回复【10楼】TinyBoy:
---------------------------------
溢出模式是哪个?四种模式都是溢出触发中断啊。我在用状态机做旋转编码器去抖,然后是用定时器轮询的方式判断正反转,所以想用模模式分频完直接设置T3CC0就能实现自定周期的中断,这样调试也方便。至于100us完全是怕来不及去抖。。
不要怂!就是干!
回复

使用道具 举报

10

主题

560

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1739
金钱
1739
注册时间
2014-6-27
在线时间
943 小时
发表于 2015-8-27 14:07:56 | 显示全部楼层
回复【11楼】小李飞砖:
---------------------------------
编码器输出波形你看过了?我不知道我以前弄的编码器和你弄的是不是一样,编码器可以中断来判断,不用定时器。
回复

使用道具 举报

7

主题

21

帖子

0

精华

初级会员

Rank: 2

积分
69
金钱
69
注册时间
2015-8-15
在线时间
0 小时
 楼主| 发表于 2015-8-27 16:10:45 | 显示全部楼层
回复【12楼】TinyBoy:
---------------------------------
- - 没有示波器。。。全是靠上网找的资料,我用的是EC11的旋转编码器。用中断我一开始也试过,但是有大神建议我中断最好少做程序,最好用定时器做轮询,函数就放在主任务里。
不要怂!就是干!
回复

使用道具 举报

10

主题

560

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1739
金钱
1739
注册时间
2014-6-27
在线时间
943 小时
发表于 2015-8-27 16:34:46 | 显示全部楼层
回复【13楼】小李飞砖:
---------------------------------
旋转编码器,就是判断左旋或者右旋的情况吧?如果是这样,用中断又何妨,进一次中断就执行几行代码就OK,还省了定时器。
回复

使用道具 举报

13

主题

84

帖子

0

精华

高级会员

Rank: 4

积分
763
金钱
763
注册时间
2016-1-20
在线时间
129 小时
发表于 2016-9-11 15:24:00 | 显示全部楼层
void InitT3()
{     
    T3CTL |= 0x08 ;          //开溢出中断     
    T3IE = 1;                //开总中断和T3中断
    T3CTL |= 0xE0;           //128分频,128/16000000*N=0.5S,N=62500
    T3CTL |= 0x02;          //
   
    T3CC0 = 20%256;
    T3CCTL0 |= 0x04;
   
    T3CTL |= 0x10;           //启动
    EA = 1;                  //开总中断
}
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2024-11-23 18:25

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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