打印
[STM8]

关于STM8S定时器时间计算问题?

[复制链接]
10659|10
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
尛舞icc|  楼主 | 2014-8-2 08:16 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
请教下各位高手,以下这段STM8S003F3P单片机定时器计算有没问题,为什么每次计算出来  时间都差一倍,还是资料没看懂,求指教:附定时器初始化代码!
              {
                CLK_CMSR=0xE1;//内部HSI震荡选择
                CLK_CKDIVR = 0x08;//HSI内部8M震荡
                TIM1_CR1 = 0x00;//定时器计数方式控制寄存器
                TIM1_IER = 0x01;//允许中断
                TIM1_PSCRH = 0x01;//定时器预分频高8位
                TIM1_PSCRL = 0x8f;//定时器预分频低8位f=8M/399+1=20000
                TIM1_ARRH = 0x00;        //定时器初始上限值高8位(20000=1000000/50)
                TIM1_ARRL = 0x01;//定时器初始上限值低8位(50US进中断)
                TIM1_CR1 = 0x01;//开定时器1
             }
本来想定个50us的,然后弄成1秒,实际出来时间是计算的2倍...
沙发
hopewise| | 2014-8-2 11:05 | 只看该作者
/*******************************************
* 名称:     TIM4_Init
* 功能:     TIM4初始化
* 入口参数: 无
* 出口参数: 无
* 说明:     定时时间是250us
                                                 TIM4_ARR值 =        t*fmaster/分频系数
                                                 t--定时时间,单位是秒
                                                 f_master单位是HZ
                                                 分频系数=2的TIM4_PSCR[2:0]的次方
********************************************/
void TIM4_Init()
{
           TIM4_IER = 0x00;  // 禁止中断
     TIM4_EGR = 0x01;  //允许产生更新事件

                 TIM4_PSCR=0X04;   //分频系数是16
                 TIM4_ARR=250;     //定时时间是250us
                 TIM4_CNTR=250;
                 TIM4_IER=0X01;    //开定时器中断
}       

使用特权

评论回复
板凳
hopewise| | 2014-8-2 11:10 | 只看该作者
我用的是外部晶振16MHZ,故在程序开始要选择if(CLK_CMSR != 0XB4)
                 
{
     CLK_SWCR |= 0X02;    //SWEN置1,使能切换
     CLK_SWR=0XB4;        //目标时钟源--0XB4指HSE                          
     while((CLK_SWCR&0X08)==0); //等待,直到切换成
                                功,SWIF被置1
     CLK_SWCR = 0;        //消除标志位
     CLK_CSSR |= 0X01;    //打开时钟安全系统CSS
}

使用特权

评论回复
地板
hopewise| | 2014-8-2 11:12 | 只看该作者
/*******************************************
* 名称:     TIM2_Init
* 功能:     TIM2初始化
* 入口参数: 无
* 出口参数: 无
* 说明:     定时时间是1ms
                                                 TIM1_ARR值 =        t*fmaster/分频系数
                                                 t--定时时间,单位是秒
                                                 f_master单位是HZ
                                                 分频系数=2的TIM2_PSCR[3:0]的次方
********************************************/
void TIM2_Init()
{   
     TIM2_IER = 0x00;      //禁止中断
     TIM2_EGR = 0x01;      //允许产生更新事件
                 
     TIM2_PSCR=0X04;       //分频系数是16

     TIM2_ARRH =0x03;      //定时时间数值
     TIM2_ARRL =0xE8;
                 
     TIM2_CNTRH=0X03;
     TIM2_CNTRL=0XE8;
                 
     TIM2_IER=0X01;        //开定时器中断
}       

使用特权

评论回复
5
尛舞icc|  楼主 | 2014-8-2 13:57 | 只看该作者
hopewise 发表于 2014-8-2 11:05
/*******************************************
* 名称:     TIM4_Init
* 功能:     TIM4初始化

我这个是定时器1   每次计算的和实际的都差一倍    每次定时都要用LED先测试过才敢用  o(︶︿︶)o 唉

使用特权

评论回复
6
mmuuss586| | 2014-8-2 15:21 | 只看该作者
尛舞icc 发表于 2014-8-2 13:57
我这个是定时器1   每次计算的和实际的都差一倍    每次定时都要用LED先测试过才敢用  o(︶︿︶)o 唉 ...


可以按你楼上的程序,改成定时器4,8分频试下;

使用特权

评论回复
7
尛舞icc|  楼主 | 2014-8-3 13:08 | 只看该作者
mmuuss586 发表于 2014-8-2 15:21
可以按你楼上的程序,改成定时器4,8分频试下;

好的  
3Q

使用特权

评论回复
8
mingjiezhong| | 2014-8-9 18:16 | 只看该作者
你是没有进去做口线翻转,否则就会发现不是时间间隔那么简单,我的帖子就知道了,我避开了但是为什么这样也没搞清楚,看来真正搞清楚的人不多

使用特权

评论回复
9
尛舞icc|  楼主 | 2014-8-17 10:11 | 只看该作者
mingjiezhong 发表于 2014-8-9 18:16
你是没有进去做口线翻转,否则就会发现不是时间间隔那么简单,我的帖子就知道了,我避开了但是为什么这样也 ...

没听懂   你说的是什么...  刚接触这个单片机 不久呢   有些地方不太理解

使用特权

评论回复
10
温庆瑞| | 2016-11-28 10:39 | 只看该作者
* 说明: Timer定时1MS 计算
         使用外部24MHz:    1/(主晶体/分频值PSC)*(计数器ARP值+1益出)=定时时间
         基准值BaseTime_Max=1/(24000000/32768)*(65535+1)=89.478s  
         基准值BaseTime_Min=1/24000000*(1+1)=0.083us

         使用内部部16MHz   1/(主晶体/分频值PSC)*(计数器ARP值+1益出)=定时时间
         基准值BaseTime_Max=1/(16000000/32768)*(65535+1)=134.217s
         基准值BaseTime_Min=1/16000000*(1+1)=0.125us

使用特权

评论回复
11
3304756| | 2016-12-27 20:36 | 只看该作者
这个不错

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

67

主题

230

帖子

2

粉丝