打印
[STM8]

STM8L TIM4定时器的问题

[复制链接]
390|7
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
stly|  楼主 | 2022-5-15 12:46 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
#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呢?

使用特权

评论回复
沙发
juventus9554| | 2022-5-15 12:49 | 只看该作者
可以直接用ucos ii操作系统的软件定时器啊

使用特权

评论回复
板凳
supernan| | 2022-5-15 12:53 | 只看该作者
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准准的

使用特权

评论回复
地板
shimx| | 2022-5-15 12:55 | 只看该作者
楼上重复造轮子来吧    TIM4_PrescalerConfig(TIM4_PRESCALER_128, TIM4_PSCRELOADMODE_IMMEDIATE) 去掉

使用特权

评论回复
5
dengdc| | 2022-5-15 12:57 | 只看该作者
这一句确实多余了。

使用特权

评论回复
6
zwll| | 2022-5-15 13:05 | 只看该作者
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
juventus9554| | 2022-5-15 13:08 | 只看该作者
这个系列可以图形化配置时钟吗

使用特权

评论回复
8
stly|  楼主 | 2022-5-15 13:11 | 只看该作者

好的,我明天去单位试一下,多谢各位大侠了哈        

使用特权

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

本版积分规则

433

主题

7058

帖子

0

粉丝