STM8定时器工作原理、相关寄存器、代码功能实现详解

STM8单片机教程08   定时器

 

注意:本文案需要配合无际单片机编程-STM8单片机教程视频学习。

注意:本文案需要配合无际单片机编程-STM8单片机教程视频学习。

 

一  本节课的任务:

  • 学习了解STM8 单片机的定时器功能
  • 实现STM8单片机的定时器驱动功能

 

二  硬件介绍:(必须掌握)

1.STM8的外设驱动实验,选择的是“lora门磁&遥控器“的主板,我们打开对应的原理图,如图所示:

 

2.打开原理图,我们可以看到 原理图上 红色框选的部分。 红色框选的部分,就是本节课需要使用的原理图部分。

LED电路的简单的分析:

①.灯是有极性的, 也就是有方向的。  

②LED的负极接GND.  如果LED2要亮,则正极是高电平。 否则就灭。

通过图纸我们可以看到LED2 和单片机的PA3连接。  所以通过控制PA3输出高电平或者低电平就可以控制LED灯的亮 或者灭。

 

三  STM8单片机的定时器介绍:

1.定时器的工作原理:

定时器的主要作用就是用来精准定时的。  就好比我们用日历,用时间来度量时间一样。

下面我们就用数数,来简单给大家距离说明一下定时器的工作原理。

向上计数

向下计数

……..

 

2.STM8单片机的定时器介绍:

我们先打开STM8L10x单片机的规格书,简单的了解一下STM8L10X单片机的定时器功能。

如果所示,STM8L10x单片机共有3个定时器,分别是TIM2、TIM3、TIM4.

 

其中TIM2和TIM3是16位的基本定时器,TIM4是8位定时器。

 

因TIM2和TIM3是16位,所以定时时间更长,功能更加强大,所以我们今天主要给大家介绍一下TIM2和TIM3;

 

因为STM8单片机(以及后面的STM32单片机)的寄存器比较多,如果像51单片机一样,直接对寄存器操作的话,程序代码相对比较复杂。  为了方便工程师的开发,ST官方将对单片机内部寄存器的操作封装成了库文件,方便我们调用。   目前ST提供了两种库,一种是标准库,一种是hal 库。  各有优势。

所以方便的学习,建议大家再学习的初期直接使用库函数使用,不要花太多的精力再寄存器上面,我们需要改变对51单片机开发的思维模式,所以本小段仅供大家了解。

 

四 官方提供的TIM例程 (掌握)

我们就TIM2为例给大家介绍一下定时器功能。

1.STM8打开标准库文件夹,打开定时器例程

如上图所示,是标准库中定时器2的例程。

我们打开TIM2文件夹可以看到,总共包含5个例程。

STM8单片机的定时器功能比51单片机复杂很多,和STM32有点类似,包括输入捕获,OCA激活模式,OC激活模式,PWM输出,正弦波输出等功能。

在例程里面我们找不到最基本的定时功能的例程,这里我们选择最后一个文件夹,TIM2_SinewaveGeneration,并将文件夹中的4个文件复制到\Project\STM8L10x_StdPeriph_Templates 下,如图所示。

 

2.进入\Project\STM8L10x_StdPeriph_Templates\EWSTM8,打开工程

本例程的主要功能是输出正弦波波形。我们需要实现的是基本的定时功能。打开通过例程可以看到,程序代码有点小复杂,研究起来不怎么容易。

我们在打开stm8l10x_tim2.h文件,看定时器2相关的函数,如果所示,TIM2的头文件声明的函数非常多,要研究完这些函数需要比较久的时间,而且我们项目暂时上都用不到,所以我们就就先不研究这个例程,如果大家时间比较充沛的话,可以花点时间自行研究一下。

 

那如何高效的实现我们的定时器功能呢。

我们可以通过百度,来了解一下别人是怎么说实现的。

通过百度“stm8定时器”关键词,找到以下下的例程:

如上图,GUA_timer2_Init(void) 就是单片机的初始化程序代码

INTERRUPT_HANDLER(TIM2_UPD_OVF_TRG_BRK_IRQHandler, 19) 是定时器2的中断服务函数。

 

我们解析一下初始化程序代码:

CLK_PeripheralClockConfig(CLK_Peripheral_TIM2,ENABLE);//  /* Enable TIM2 clock */

TIM2_DeInit();

TIM2_TimeBaseInit(TIM2_Prescaler_1, TIM2_CounterMode_Up, 16*13);     

TIM2_ARRPreloadConfig(ENABLE);

TIM2_ITConfig(TIM2_IT_Update , ENABLE); TIM2_Cmd(ENABLE);

 

①我们先看第一句代码:

CLK_PeripheralClockConfig(CLK_Peripheral_TIM2,ENABLE);

打开定时器TIM2的时钟,官网提供的例程也有,也就是TIM2初始化,首先要打开定时器时钟,关于本函数的参数在这里就给大家不逐个解释了。

 

②第二句: TIM2_DeInit();

TIM2_DeInit();  复位定时器2功能。我们打开stm8l10x_tim2.h 和stm8l10x_tim2.c文件查看本函数的说明,如下图所示。

 

③我们研究一下第三句TIM2_TimeBaseInit(TIM2_Prescaler_1, TIM2_CounterMode_Up, 16*13); 

这句比较重要,是TIM2的初始化函数,我们比较详细的研究一下本函数,我们先在stm8l10x_tim2.c参看一下本函数的原型。

通过截图可以看到,本函数3个参数变量的解释。

第一个参数:TIM2_Prescaler_TypeDef TIM2_Prescaler

用来配置TIM2的分频参数的。共支持8个参数,单片机默认的工作频率是16M,如果我们先选择TIM2_Prescaler_1,表示TIM2的工作频率是16M,选择TIM2_Prescaler_16,表示16分频,16M/16 =1M.  TIM2用定时器功能一般选择TIM2_Prescaler_16.

 

第二个参数:TIM2_CounterMode_TypeDef TIM2_CounterMode

用来配置定时器的计数模式,TIM2共有5种技术模式。 我们最常用的第一种TIM2_CounterMode_Up,表示向上计数。

 

第三个参数:uint16_t TIM2_Period, 用来配置TIM2工作的计数周期。如果配置成1M,如果给参数配置成1,表示TIM2定时器的计时周期为1/1M妙,1微妙。(系统时钟16M,TIM2工作频率16分频)。

 

④第四句: TIM2_ARRPreloadConfig(ENABLE);

我们先看一下本函数的原函数的函数说明:

如上图所示,本函数的主要功能就是 使能,关闭,分频参数的更新,因为我们的定时器配置之后,分频的参数不需要更改,所以这个打开,或者关闭,没有什么影响。

 

⑤第五句 TIM2_ITConfig(TIM2_IT_Update , ENABLE);

我们先看一下本函数的原始函数的说明:

如上图所示:本函数主要的功能就是打开TIM2的中断功能。

参数说明:

参数1:TIM2_IT_TypeDef TIM2_IT

表示中断方式选择,共有4种,我们选择TIM2_IT_Update 即可,表示向上计数中断。

参数2:FunctionalState NewState

表示中断功能打开还是关闭。  如果要打开中断,选择ENABLE,如果关闭中断,选择DISABLE。

 

⑥第六句:TIM2_Cmd(ENABLE);

函数原型如下:

本函数的功能就是打开或关闭定时器TIM2. 

初始化程序代码就先介绍到这里,我们在和大家一起看一下中断服务函数:

INTERRUPT_HANDLER(TIM2_UPD_OVF_TRG_BRK_IRQHandler, 19);

这个函数是定时器TIM2 向上计数中断服务函数,TIM2定时中断服务代码就在这里添加。

其中 TIM2_ClearITPendingBit(TIM2_IT_Update); 表示清除中断服务标志。

 

五 TIM寄存器讲解:(跳过)

 

六  实现代码(必须掌握)

我们复制上节课的代码到定时器文件夹下。并命名位  “演示例程-定时器”

实现代码:(实现的效果: LED2 建议1秒闪烁)

代码编辑:

最终代码:

#include “stm8l10x.h”

#define LED_GPIO_PORT  GPIOA

#define LED_GPIO_PINS  GPIO_Pin_3

void TIM_Config(void);

void main(void)

{

CLK_MasterPrescalerConfig(CLK_MasterPrescaler_HSIDiv4);   ////系统时钟 /* select Clock = 4 MHz */

GPIO_Init(LED_GPIO_PORT, LED_GPIO_PINS, GPIO_Mode_Out_PP_Low_Fast);

TIM_Config();

enableInterrupts();

GPIO_SetBits(LED_GPIO_PORT, LED_GPIO_PINS);

while (1);

}

void TIM_Config(void)

{

CLK_PeripheralClockConfig(CLK_Peripheral_TIM2, ENABLE);  ///第一步打开TIM2 时钟

TIM2_DeInit();                                          ///第2步复位TIM2的功能    关闭TIM2功能

TIM2_TimeBaseInit(TIM2_Prescaler_4, TIM2_CounterMode_Up, 1000); ///配置定时器TIM2的参数

TIM2_ITConfig(TIM2_IT_Update, ENABLE);   //////第4步复位TIM2的功能    关闭TIM2功能定时器2  中断使能

TIM2_ARRPreloadConfig(ENABLE);  ///TIM2定时器参数更新使能

TIM2_Cmd(ENABLE); /////打开TIM2的功能

}

void time2interhander(void)

{

static uint16_t count = 0;

// GPIO_ToggleBits(GPIOA, GPIO_Pin_3);

count ++;

if(count > 999)

{

count = 0;

GPIO_ToggleBits(LED_GPIO_PORT, LED_GPIO_PINS);

}

}

INTERRUPT_HANDLER(TIM2_UPD_OVF_TRG_BRK_IRQHandler, 19)

{

time2interhander();

TIM2_ClearITPendingBit(TIM2_IT_Update);

}

void Delay(uint16_t nCount)

{

while (nCount != 0)

{

nCount–;

}

}

 

七 程序烧录与功能测试

实验需要的器材:

连接图如下:

连接方式: 

  • ST-LINK 和门磁主板的烧录接口P3的丝印要一一对应。 如上图蓝色所示:
    • VCC  —-  3.3V
    • GND  —-  GND
    • SWIM —-  SWIM
    • REST —-    RST
  • 电池供电 3.7V 锂电池插到J1 接口,如上图黄色所示。
  • ST LINK 插到电脑USB接口。 如上图红色所示。
  • 建议大家都可以自行购买一个USB Hub。  这样测试更加方便,也可以避免电脑的USB插拔次数过多而老化。

 

查看测试效果:

 

八   了解定时器2的相关寄存器

最后我们打开TIM2定时器的硬件规格书,简单的了解一下TIM2相关的寄存器。

从截图可以看出定时器TIM2的相关寄存器共22个寄存器,相对比较多,研究起来比较复杂,所以我们一般在软件程序开发过程中,尽量不要过多的研究单片机内部的相关寄存器,直接用库函数即可。如果碰到了相关问题再去找相应的寄存器分析。

关于定时器,我们就先研究到这里。

 

本节课结束,感谢查看。

 

给TA买糖
共{{data.count}}人
人已赞赏
单片机百科单片机自学指南

STM8单片机外部中断工作原理、相关寄存器、代码功能实现详解

2023-5-25 12:40:57

单片机百科单片机自学指南

STM8单片机串口工作原理、库函数、驱动代码详解

2023-5-25 15:16:09

0 条回复 A文章作者 M管理员
    暂无讨论,说说你的看法吧