OpenEdv-开源电子网

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

关于STC定时器重装值

[复制链接]

32

主题

119

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
298
金钱
298
注册时间
2015-1-30
在线时间
40 小时
发表于 2016-10-6 18:07:13 | 显示全部楼层 |阅读模式
5金钱
#define MAIN_Fosc        22118400L        //定义主时钟
#define        SysTick         10000                // 次/秒, 系统滴答频率, 在4000~16000之间
#define        Timer0_Reload        (65536UL - ((MAIN_Fosc + SysTick/2) / SysTick))                //Timer 0 中断频率, 在config.h中指定系统滴答频率, 在4000~16000之间.
        AUXR = 0x80;        //Timer0 set as 1T, 16 bits timer auto-reload,
        TH0 = (u8)(Timer0_Reload / 256);
        TL0 = (u8)(Timer0_Reload % 256);
        ET0 = 1;        //Timer0 interrupt enable
        TR0 = 1;        //Tiner0 run



这些代码是STC试验箱里面的代码 是在官网下载的  请问#define        Timer0_Reload        (65536UL - ((MAIN_Fosc + SysTick/2) / SysTick))这个是怎么写的  虽然我知道是什么意思
我想问的是 这句代码怎么推导来的! 假如我要定时300US怎么写这个宏呢?

最佳答案

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

1、STC单片机的定时器部分是自己设计的,跟通常8051单片机不同所以计算方式不同。具体在技术手册上有详细说明。根据代码只知道你的单片机是工作在 1T模式,16位定时器。 2、附上个人意见,仅供参考,勿怪:2.1、你问问题不说是哪款单片机?怎么解决?2.2、做开发成长学习的过程是 问题--思考--查找答案--验证答案--解决问题!你问的这种问题在芯片的技术手册上有详细说明。看过即可解决。在论坛是无法问出所以然的。还是建议以自 ...
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

2

主题

60

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
206
金钱
206
注册时间
2016-7-26
在线时间
33 小时
发表于 2016-10-6 18:07:14 | 显示全部楼层
1、STC单片机的定时器部分是自己设计的,跟通常8051单片机不同所以计算方式不同。具体在技术手册上有详细说明。根据代码只知道你的单片机是工作在  1T模式,16位定时器。
2、附上个人意见,仅供参考,勿怪:2.1、你问问题不说是哪款单片机?怎么解决?2.2、做开发成长学习的过程是 问题--思考--查找答案--验证答案--解决问题!你问的这种问题在芯片的技术手册上有详细说明。看过即可解决。在论坛是无法问出所以然的。还是建议以自己动手为先。
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165309
金钱
165309
注册时间
2010-12-1
在线时间
2108 小时
发表于 2016-10-6 19:08:41 | 显示全部楼层
帮顶
回复

使用道具 举报

32

主题

119

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
298
金钱
298
注册时间
2015-1-30
在线时间
40 小时
 楼主| 发表于 2016-10-7 12:32:29 | 显示全部楼层
哥,看来是我没把问题说清楚,单片机说的是STC系列的他旗下的单片机都一样的 Timer0_Reload        (65536UL - ((MAIN_Fosc + SysTick/2) / SysTick))  这个宏计算出来(65536-(22118400+10000/2)/10000)=63232.66  1T模式下计数器+1需要约 1000000000/22118400=45NS左右 根据贴数来的代码可知定时100US左右 对吗? 我的问题是这个重装值 为什么是  (65536UL - ((MAIN_Fosc + SysTick/2) / SysTick))这么算的  
回复

使用道具 举报

32

主题

119

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
298
金钱
298
注册时间
2015-1-30
在线时间
40 小时
 楼主| 发表于 2016-10-7 12:37:33 | 显示全部楼层
laojiyou 发表于 2016-10-7 09:57
1、STC单片机的定时器部分是自己设计的,跟通常8051单片机不同所以计算方式不同。具体在技术手册上有详细说 ...

关于STC系列单片机的计数器是向上计数的,对于这个定时器功能我没有什么问题,我只是在想官方 计算重装值的 思想#define        Timer0_Reload        (65536UL - ((MAIN_Fosc + SysTick/2) / SysTick))  就单论这句话
回复

使用道具 举报

2

主题

60

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
206
金钱
206
注册时间
2016-7-26
在线时间
33 小时
发表于 2016-10-7 14:06:37 | 显示全部楼层
本帖最后由 laojiyou 于 2016-10-7 14:07 编辑

好吧 那我说下我的个人理解:
1.1T单片机的意思就是1个时钟周期既是一个机器周期,22.1184Mhz晶振则说明1秒有22118400个时钟周期或者机器周期,那么要是延时1ms应该是有22118400/1000个时钟周期,所以除以10000  是延时100us的所需时钟周期数,
2、至于为什么加入Systick/2,只是为了保证时钟周期的准确性,因为22118400/10000是2211.84,在程序中进行强制类型转换成整数是2211,但是2211.84更接近2212,加入Systick/2后的强制类型转换后是2212,所以保证了计时的准确性。
回复

使用道具 举报

3

主题

32

帖子

0

精华

初级会员

Rank: 2

积分
108
金钱
108
注册时间
2016-8-6
在线时间
16 小时
发表于 2016-10-18 13:47:46 | 显示全部楼层
同意3楼的看法。这种问题应该多看数据手册,多看几次就会理解的。
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2024-11-23 19:06

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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