[STM8] STM8单片机TIM_CNTR计数器有什么用的问题?求解答

[复制链接]
5393|20
 楼主| whirt_noob 发表于 2016-3-23 22:28 | 显示全部楼层 |阅读模式
void TIM4_Init(void)//256us中断一次
{

TIM4_EGR = 0x01; // 允许产生更新事件
TIM4_PSCR = 0x07;//计数器时钟=主时钟/128=16MHZ/128 //相当64us
TIM4_ARR = 31;// 设定重装载时的寄存器值,255是最大值
TIM4_CNTR = 31; // 设定计数器的初值 // 定时周期=(ARR+1)*64=16.320mS,本次为2ms
TIM4_CR1 = 0x01; // b0 = 1,允许计数器工作// b1 = 0,允许更新// 设置控制器,启动定时器
TIM4_IER = 0x01;// 允许更新中断
_asm("rim"); // 允许CPU全局中断
}


在STM8中CNTR有什么用?  测试中不管设置什么值延时时间都没有变化。

 楼主| whirt_noob 发表于 2016-3-23 22:43 | 显示全部楼层
如果我要设置成5us中断一次   TIM4_APP要如何设置
cxcaayiic 发表于 2016-3-24 08:08 来自手机 | 显示全部楼层
我的程序里在中断服务程序里改变了初值CNTR,功能正常,你试试。
 楼主| whirt_noob 发表于 2016-3-24 08:29 | 显示全部楼层
cxcaayiic 发表于 2016-3-24 08:08
我的程序里在中断服务程序里改变了初值CNTR,功能正常,你试试。

我的也是啊!中断设置成2ms这个CNTR不管怎么设置好像都不会有影响
 楼主| whirt_noob 发表于 2016-3-24 09:43 | 显示全部楼层
还有ST的参考手册上说TIM4是个向上增长计数器,我怎么感觉是个向下的?
狼烟客 发表于 2016-3-24 09:45 | 显示全部楼层
1、“写计数器的操作没有缓存,并且可以在任何时候写TIM1_CNTRH和TIM1_CNTRL寄存器”
2、“在向上计数模式中,计数器从0计数到用户定义的比较值(TIMx_ARR寄存器的值),然后重新从0开始计数并产生一个计数器溢出事件”,
以上,摘自STM8S手册。在你这里,你把TIM4_CNTR设置为31,等于TIM4_ARR,意思是说,TIM4从31开始计数然后在TIM4_CNTR等于31时触发中断。。。。。这好像没有意义啊,计时时间应该是计时器时钟周期的整数倍,用这种方法是无法64us得到5us的。仅供参考!

评分

参与人数 1威望 +3 收起 理由
whirt_noob + 3 很给力!

查看全部评分

 楼主| whirt_noob 发表于 2016-3-24 10:41 | 显示全部楼层
狼烟客 发表于 2016-3-24 09:45
1、“写计数器的操作没有缓存,并且可以在任何时候写TIM1_CNTRH和TIM1_CNTRL寄存器”
2、“在向上计数模式 ...

STM8在2MHZ下运行  ,TIME4设置128分频,算下来确实是64us,确实没法得到5us  
cxcaayiic 发表于 2016-3-24 18:39 来自手机 | 显示全部楼层
那就直接不分频,16Mhz大概是59.6ns的周期,设置定时器计数84个周期产生中断就是5.0064us多一点,这个精度应该够用了吧
戈卫东 发表于 2016-3-24 20:15 | 显示全部楼层
ARR = FREQ_TIMCLK / 200000;  /* 频率200k 就是5us */

评分

参与人数 1威望 +2 收起 理由
whirt_noob + 2 很给力!

查看全部评分

 楼主| whirt_noob 发表于 2016-3-25 10:16 | 显示全部楼层
cxcaayiic 发表于 2016-3-24 18:39
那就直接不分频,16Mhz大概是59.6ns的周期,设置定时器计数84个周期产生中断就是5.0064us多一点,这个精度 ...

不分频是在大概62ns的周期吧?定时器设置也就80个周期就产生中断就可以了。为什么我们算的不太一样?
cxcaayiic 发表于 2016-3-25 18:12 来自手机 | 显示全部楼层
whirt_noob 发表于 2016-3-25 10:16
不分频是在大概62ns的周期吧?定时器设置也就80个周期就产生中断就可以了。为什么我们算的不太一样?{:sh ...

你是对的,我误按2的24次方算了
309030 发表于 2016-3-25 20:33 | 显示全部楼层
计时时间应该是计时器时钟周期的整数倍
mark0668 发表于 2016-3-25 20:41 | 显示全部楼层
先写高位,再写低位CNTR
 楼主| whirt_noob 发表于 2016-3-25 21:01 | 显示全部楼层
cxcaayiic 发表于 2016-3-24 18:39
那就直接不分频,16Mhz大概是59.6ns的周期,设置定时器计数84个周期产生中断就是5.0064us多一点,这个精度 ...

不分频好像是大概是62ns的样子吧,定时器只需设置80个周期就够了
 楼主| whirt_noob 发表于 2016-3-25 21:02 | 显示全部楼层
309030 发表于 2016-3-25 20:33
计时时间应该是计时器时钟周期的整数倍

我懂了
 楼主| whirt_noob 发表于 2016-3-25 21:04 | 显示全部楼层
mark0668 发表于 2016-3-25 20:41
先写高位,再写低位CNTR

CNTR是八位的啊,先写低四位?后写高四位?太笨没听懂就指点
 楼主| whirt_noob 发表于 2016-3-25 21:05 | 显示全部楼层
戈卫东 发表于 2016-3-24 20:15
ARR = FREQ_TIMCLK / 200000;  /* 频率200k 就是5us */

已解决
米尔豪斯 发表于 2016-3-25 22:46 | 显示全部楼层
在增计数模式中,计数器从0计数到TIMx_ARR寄存器的值,然后重新从0开始计数并产生一个计数器溢出事件

评分

参与人数 1威望 +2 收起 理由
whirt_noob + 2 赞一个!

查看全部评分

hayppy 发表于 2018-9-12 12:18 | 显示全部楼层
cxcaayiic 发表于 2016-3-24 18:39
那就直接不分频,16Mhz大概是59.6ns的周期,设置定时器计数84个周期产生中断就是5.0064us多一点,这个精度 ...

你好,16MHz可以产生59.6ns周期,我怎么用Tim4定时GPIO只能产生4.4us脉冲呢?
可否发一下你的Timer代码?谢谢!
hayppy 发表于 2018-9-12 13:06 | 显示全部楼层
cxcaayiic 发表于 2016-3-24 18:39
那就直接不分频,16Mhz大概是59.6ns的周期,设置定时器计数84个周期产生中断就是5.0064us多一点,这个精度 ...

你好,怎样配置定时器使GPIO输出50ns脉冲呢?
您需要登录后才可以回帖 登录 | 注册

本版积分规则

个人签名:永远保持一颗充满激情的心

16

主题

286

帖子

8

粉丝
快速回复 在线客服 返回列表 返回顶部