STM32
直播中

辛太励

8年用户 1155经验值
擅长:20153
私信 关注
[问答]

如何同时使用STM8L单片机的多个定时器呢

怎样去使用STM8L的定时器呢?
如何同时使用STM8L单片机的多个定时器呢?

回帖(1)

刘桂英

2021-12-17 14:24:03
背景介绍

笔者在最近的项目中需要同时使用STM8L单片机的多个定时器。STM8L系列单片机定时器4(TIM4)相关的例程很多,稍微修改一下也能用,但是定时器1(TIM1)相关的用法介绍就很少,某些例程根本就无法正常工作。基于此,笔者将STM8L的定时器用法介绍一下,并给出参考代码。
  调试环境

  硬件:STM8L151K4T6最小系统板
IDE:IAR for STM8 (v7.14版本)
烧写工具:STVP
  简介

  STM8系列单片机包括三种类型的定时器。一种是16位高级控制型定时器,功能较为强大,可以实现定时、计数、外部PWM输出、输入捕获等多种功能,典型的有TIM1;第二种为通用型16位定时器,典型的有TIM2、TIM3;第三种是8位基本型定时器,主要是指TIM4。这里我们只使用到定时器的最基本的定时功能,并使用TIM4和TIM1来举例说明。
  TIM4使用方法
首先是最基础的8位定时器TIM4,寄存器介绍请参考数据手册。这里只介绍初始化的步骤:
  

  • 打开外设时钟CLK_PCKENR1
  • 设置预分频寄存器TIM4_PSCR
  • 设置计数器值TIM4_CNTR
  • 设置自动重载寄存器TIM4_ARR
  • 开定时器中断TIM4_IER
  • 开总中断;
  • 使能计数器TIM4_CR1

  参考代码如下:(具体定时时间的用法看代码备注)

//TIM4初始化
void Init_Timer4(void)
{
    CLK_PCKENR1=0x04; //L系列外设时钟默认关闭,需打开
    TIM4_EGR=0x01;    //计数器更新,可省略
    TIM4_PSCR=0x07;//分频值(2^7)/8M=16us,16us*255*122=500ms
    TIM4_CNTR=255;//计数器值
    TIM4_ARR=255;//自动重装的值
    TIM4_CR1=0x01;//使能计数器
    TIM4_IER=0x01;//更新中断使能
}
//TIM4中断处理函数
#pragma vector=TIM4_UIF_vector
__interrupt void TIM4_UIF_IRQHandler(void)
{
    i++;
    TIM4_SR1=0x00;
    if(i==122)
    {
        LED_PORT^=1;//亮灯验证TIM4正常工作
        i=0;
    }
}


TIM1使用方法

//TIM1初始化
void Init_Timer1(void)
{
    CLK_PCKENR2 = 0x02; //L系列外设时钟默认关闭,需打开
    //TIM1_EGR=0x01;    //计数器更新
    TIM1_PSCRH=0x1F;//分频值 8m/(1F3F+1)= 1000Hz=1ms
    TIM1_PSCRL=0x3F;//分频值
    TIM1_ARRH=0;//自动重装的值
    TIM1_ARRL=0x31;//自动重装的值 49*1ms=49ms,频谱测试50ms
    TIM1_CNTRH=0;//计数器值
    TIM1_CNTRL=0x31;//计数器值
    TIM1_IER=0x01;//更新中断使能
    TIM1_CR1=0x01;//使能计数器
}
//TIM1中断处理函数
#pragma vector=TIM1_OVR_UIF_vector
__interrupt void TIM1_OVR_UIF_IRQHandler(void)
{
    i++;
    TIM1_SR1=0x00;
    if(i==10)
    {
        LED_PORT^=1;//异或
        i=0;
    }
}
举报

更多回帖

发帖
×
20
完善资料,
赚取积分