打印
[STM8]

STM8L TIM4定时器的问题

[复制链接]
4349|6
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
mlmbcsz|  楼主 | 2016-5-11 18:50 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
#include<iostm8l051f3.h>

#define Work_LedToggle()                   (PA_ODR ^= (1 << 6))     //取反


void SysClock_Init(void)               
{
    CLK_ICKCR |= 0x01;                                                              //开启内部HSI
    while(!(CLK_ICKCR&0x02));                                               //HSI准备就绪读取CLK_ICKCR第一位
    CLK_SWR = 0x01;                                                              //HSI为主时钟源
    CLK_CKDIVR &=~0X03;                                                 //16分频
    CLK_ICKCR |=(1 << 2);  //open LSI clock
}

void Delay_Init(void)
{
    CLK_PCKENR1 |= (1 << 2);                                        //open peripheral clock  打开定时器4
    TIM4_CR1 |= (1 << 7);                                            //enable preload                        
    TIM4_PSCR = (1 << 2) | (1 << 0);                            //prescaler = 32
    TIM4_ARR = 250;                                                   //1MS
    TIM4_SR1 &=~(1 << 0);                                       //clear updata interrupt flag
}

void Delay_ms(u16 ms)
{
    TIM4_CR1 |= (1 << 0);                                         //open TIM4
    while(ms--)
    {
        Feed_Dog();
        while((TIM4_SR1 & (1 << 0)) == 0);
        TIM4_SR1 &=~(1 << 0);
    }
    TIM4_CR1 &=~(1 << 0);                                     //close TIM4
}


void main()
{
        SysClock_Init();
        Delay_Init();
        while(1)
        {
                 Work_LedToggle();
                 Delay_ms(1);
        }        
}

请问一下,这里单片机用HSI内部16MHz的时钟,系统时钟通过16分频后系统时钟为1M TIM4定时为1Ms,为什么这里的初始值是250 看数据手册计算公式应该是:TIM4_ARR = 定时的时间(秒)* 主时钟的频率 / 预分频的系数 按照这样的公式TIM4_ARR = 32,为什么这里是250呢?
沙发
deviceplugs| | 2016-5-11 22:46 | 只看该作者
可以直接用ucos ii操作系统的软件定时器啊

使用特权

评论回复
板凳
tanjping| | 2016-5-13 16:48 | 只看该作者
TIM4为8位定时器,你设定为16分频,只能向上计数,设定250应是定时250us的呀,
我使用TIM4是这样设定的
void TIM4_initialzation(void)
{

         //16M时钟 设定计数时钟128的分频,计数周期为1ms,//初始化计数器值,设定自动重载寄存器值   
  TIM4_TimeBaseInit(TIM4_PRESCALER_128,125 );
  TIM4_PrescalerConfig(TIM4_PRESCALER_128, TIM4_PSCRELOADMODE_IMMEDIATE);   
  TIM4_SetCounter(0x0000);//将计数器的初始值设置为0
  TIM4_ARRPreloadConfig(ENABLE);
  TIM4_ITConfig(TIM4_IT_UPDATE, ENABLE);//允许计数溢出中断   
  TIM4_Cmd(ENABLE); //启用定时器
}
示波器看过,没有问题,1ms准准的

使用特权

评论回复
地板
re34| | 2017-4-5 16:05 | 只看该作者
楼上重复造轮子来吧    TIM4_PrescalerConfig(TIM4_PRESCALER_128, TIM4_PSCRELOADMODE_IMMEDIATE) 去掉

使用特权

评论回复
5
上官梦舞| | 2020-5-18 13:18 | 只看该作者
re34 发表于 2017-4-5 16:05
楼上重复造轮子来吧    TIM4_PrescalerConfig(TIM4_PRESCALER_128, TIM4_PSCRELOADMODE_IMMEDIATE) 去掉[em ...

这一句确实多余了。

使用特权

评论回复
6
上官梦舞| | 2020-5-18 13:40 | 只看该作者
void TIM4_Init(void)
{
  CLK_PeripheralClockConfig(CLK_Peripheral_TIM4,ENABLE);
  TIM4_TimeBaseInit(TIM4_Prescaler_16, 125);
  TIM4_SetCounter(0x00);
  TIM4_ARRPreloadConfig(ENABLE);
  TIM4_ITConfig(TIM4_IT_Update, ENABLE);
  TIM4_Cmd(ENABLE);
}

使用特权

评论回复
7
dongnanxibei| | 2020-5-19 09:36 | 只看该作者
这个系列可以图形化配置时钟吗

使用特权

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

本版积分规则

4

主题

30

帖子

1

粉丝