STM8S_库函数_定时器自动装载TIM1

大家好,我是单片机爱好者-MCU起航。这里说下使用库函数方式控制STM8S103F3P6片上的定时器1,也就是TIM1,这是个高级定时器。

首先,咱们看一下STM8S103F3P6上有几个定时器,打开数据手册,可以看到如下内容:

可以看到,咱们使用的单片机,有三个定时器:TIM1、TIM2、TIM4。而TIM1是一个高级控制定时器。具体有多高级,咱们看下介绍。由于内容比较多,我这里直接放数据手册里的截图:

可以看到,TIM1的功能是非常丰富的,从基本的定时、自动装载、PWM输出、输入捕获、输出比较、单脉冲输出到各种事件的中断,都有相应的功能。

稍后的几节内容,会依次展示三个例程:

1、自动装载计时

2、测量输入信号的脉冲宽度

3、输出PWM

这一节主要说自动装载计时。 接下来,通过代码实现一个功能:

1秒的一个定时,时间到了以后,板上的LED闪烁,用到的功能:分频,向上计数,自动重装载,重复计数器。代码如下,首先看主函数:

/* Includes ------------------------------------------------------------------*/
#include "stm8s.h"
#include "timer1_config.h"
/* Private defines -----------------------------------------------------------*/
/* Private function prototypes -----------------------------------------------*/
/* Private functions ---------------------------------------------------------*/

void main(void)
{
  GPIO_Init(GPIOB, GPIO_PIN_4, GPIO_MODE_OUT_PP_HIGH_SLOW);
  timer1_init();
  while (1);
  
}

主函数里进行两个操作:PB4初始化、TIM1初始化。PB4不用说了,外接一个LED,低电平点亮,前面的内容里说过了。

TIM1初始化的代码我们看下:

/***************************************
*               TIMER1初始化
*               1秒一次中断
***************************************/
void timer1_init(void)
{
  disableInterrupts();
  TIM1_DeInit();
  TIM1_TimeBaseInit(0x0063, TIM1_COUNTERMODE_UP, 0x03e8, 0x13);
  TIM1_Cmd(ENABLE);
  TIM1_ITConfig(TIM1_IT_UPDATE, ENABLE);
  enableInterrupts();
}

由于库函数的命名比较规范,所以可以从函数名字猜出每个函数的功能:

1、关闭全局中断

2、TIM1寄存器恢复默认设置

3、TIM1时基初始化,这个函数的具体内容下面说

4、TIM1使能,也就是开始计数

5、TIM1的向上计数溢出中断使能

6、全局中断使能

这里面相对复杂的是第三步,我们详细看下这个函数:

/**
  * @brief  Initializes the TIM1 Time Base Unit according to the specified parameters.
  * @param  TIM1_Prescaler specifies the Prescaler value.
  * @param  TIM1_CounterMode specifies the counter mode  from @ref TIM1_CounterMode_TypeDef .
  * @param  TIM1_Period specifies the Period value.
  * @param  TIM1_RepetitionCounter specifies the Repetition counter value
  * @retval None
  */
void TIM1_TimeBaseInit(uint16_t TIM1_Prescaler,
                       TIM1_CounterMode_TypeDef TIM1_CounterMode,
                       uint16_t TIM1_Period,
                       uint8_t TIM1_RepetitionCounter)

这是库函数里面的函数定义部分,我只取了注释部分和函数名称部分,具体的代码不需要看。

结合注释和括号里的参数名称,我们可以知道这几个参数的功能:

TIM1_Prescaler-分频系数

TIM1_CounterMode-计数模式

TIM1_Period-定时周期

TIM1_RepetitionCounter-重复定时次数

STM8S相比8051的定时器有两个突出的地方,一个是计数模式,我们可以选择向上计数、向下计数、中央对其模式。

另一个就是重复定时次数,51里面,要实现一个比较长的定时,需要自己定一个变量,每次定时结束,变量加一;STM8S这里不需要,有一个专门的寄存器完成这个功能。

所以,上面那个函数的功能就是:

TIM1_TimeBaseInit(0x0063, TIM1_COUNTERMODE_UP, 0x03e8, 0x13);

系统时钟做100(0x63=99)分频,向上计数模式,定时周期1000(分频后的时钟),重复计数20(0x13=19)次。

最后,在中断函数里,我们控制LED进行状态的翻转,代码如下:

INTERRUPT_HANDLER(TIM1_UPD_OVF_TRG_BRK_IRQHandler, 11)
{
  /* In order to detect unexpected events during development,
     it is recommended to set a breakpoint on the following instruction.
  */
  TIM1_ClearITPendingBit(TIM1_IT_UPDATE);
  GPIO_WriteReverse(GPIOB, GPIO_PIN_4);
}

内容很简单,清中断标志,然后PB4状态翻转。

编译、下载、上电,功能正常!很简单,打完收工!

要获取该程序完整的工程文件,可以关注公众号:单片机爱好者,然后回复关键词:STM8S。可以获取完整的下载链接,里面包含工程文件、视频、PPT、数据手册等所有相关资料。

发表评论

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据