STM8单片机定时器驱动的深度解析
Posted 无际单片机编程
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了STM8单片机定时器驱动的深度解析相关的知识,希望对你有一定的参考价值。
上一节给大家介绍了基于标准库STM8单片机GPIO的驱动,本节课主要给大家介绍一下STM8定时器的驱动。
我们先打开STM8L10x单片机的规格书,简单的了解一下STM8L10X单片机的定时器功能。
如果所示,STM8L10x单片机共有3个定时器,分别是TIM2、TIM3、TIM4.
其中TIM2和TIM3是16位的基本定时器,TIM4是8位定时器。
因TIM2和TIM3是16位,所以定时时间更长,功能更加强大,所以我们今天主要给大家介绍一下TIM2和TIM3;
我们以TIM2为例给大家介绍一下定时器功能。
- STM8打开标准库文件夹,打开定时器例程
如上图所示,是标准库中定时器2的例程。
我们打开TIM2文件夹可以看到,总共包含5个例程。
STM8单片机的定时器功能比51单片机复杂很多,和STM32有点类似,包括输入捕获,OCA激活模式,OC激活模式,PWM输出,正弦波输出等功能。
2.在例程里面我们找不到最基本的定时功能的例程,这里我们选择最后一个文件夹,TIM2_SinewaveGeneration,并将文件夹中的4个文件复制到\\Project\\STM8L10x_StdPeriph_Templates 下,如图所示。
3.进入\\Project\\STM8L10x_StdPeriph_Templates\\EWSTM8,打开工程
本例程的主要功能是输出正弦波波形。我们需要实现的是基本的定时功能。打开通过例程可以看到,程序代码有点小复杂,研究起来不怎么容易。
4.我们在打开stm8l10x_tim2.h文件,看定时器2相关的函数.
如图所示,TIM2的头文件声明的函数非常多,要研究完这些函数需要比较久的时间,而且我们项目暂时上都用不到,所以我们就就先不研究这个例程,如果大家时间比较充沛的话,可以花点时间自行研究一下。
5.那如何高效的实现我们的定时器功能呢。我们可以通过百度,来了解一下别人是怎么说实现的。
通过百度“stm8定时器”关键词,找到以下下的例程:
如上图,GUA_timer2_Init(void) 就是单片机的初始化程序代码
INTERRUPT_HANDLER(TIM2_UPD_OVF_TRG_BRK_IRQHandler, 19) 是定时器2的中断服务函数。
6.我们研究一下定时器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);
①我们先看第一句代码:
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.
7.初始化程序代码就先介绍到这里,我们在和大家一起看一下中断服务函数:
INTERRUPT_HANDLER(TIM2_UPD_OVF_TRG_BRK_IRQHandler, 19);
这个函数是定时器TIM2 向上计数中断服务函数,TIM2定时中断服务代码就在这里添加。
其中 TIM2_ClearITPendingBit(TIM2_IT_Update); 表示清除中断服务标志。
定时器实验测试:
1.我们先打开Lora模块的原理图如下:
2.定时器软件设计
实现功能:定时器TIM2实现1mS延时
实验效果:PC2 1ms 反转一次 PC3 1000ms反转一次
程序开发:
#include "stm8l10x.h"
__IO uint16_t counter = 0; TIM2 定时功能
void TIM2_Config(void);
void TIM2_OverHandle1(void);
void main(void)
{
CLK_MasterPrescalerConfig(CLK_MasterPrescaler_HSIDiv1); ///配置系统时钟1分频 16M HZ
TIM2_Config(); 定时器2初始化
GPIO_Init(GPIOC, GPIO_Pin_2|GPIO_Pin_3, GPIO_Mode_Out_PP_High_Fast); // PC2 PC3 配置为输出
enableInterrupts(); 打开总中断
while(1)
{
}
}
/* 配置定时器2 定时时间:1ms;
void TIM2_Config(void)
{
CLK_PeripheralClockConfig(CLK_Peripheral_TIM2, ENABLE); /* Enable TIM2 clock */
TIM2_DeInit();
TIM2_TimeBaseInit(TIM2_Prescaler_16, TIM2_CounterMode_Up, 1000);
TIM2_ITConfig(TIM2_IT_Update, ENABLE); /* Update Interrupt Enable */
TIM2_ARRPreloadConfig(ENABLE); /* ARRPreload Enable */
TIM2_Cmd(ENABLE); /* Enable TIM2 */
}
void TIM2_OverHandle1(void)
{
GPIO_ToggleBits(GPIOC, GPIO_Pin_2);
counter ++;
if(counter>999)
{
counter = 0;
GPIO_ToggleBits(GPIOC, GPIO_Pin_3);
}
}
中断服务函数:
extern void TIM2_OverHandle1(void);
INTERRUPT_HANDLER(TIM2_UPD_OVF_TRG_BRK_IRQHandler, 19)
{
TIM2_OverHandle1();
TIM2_ClearITPendingBit(TIM2_IT_Update);
}
示波器测试效果如下:
测试操作图:
PC2 脚位输出效果图
PC3 脚位输出效果图。
3.最后我们打开TIM2定时器的硬件规格书,简单的了解一下TIM2相关的寄存器。
从截图可以看出定时器TIM2的相关寄存器共22个寄存器,相对比较多,研究起来比较复杂,所以我们一般在软件程序开发过程中,尽量不要过多的研究单片机内部的相关寄存器,直接用库函数即可。如果碰到了相关问题再去找相应的寄存器分析。
关于定时器,我们就先讲到这里。
以上是关于STM8单片机定时器驱动的深度解析的主要内容,如果未能解决你的问题,请参考以下文章