背景介绍
笔者在最近的项目中需要同时使用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;
}
}
背景介绍
笔者在最近的项目中需要同时使用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;
}
}
举报