大家好,我是单片机爱好者-MCU起航。这一节我们介绍如何使用库函数方式控制STM8S103F3P6片上的定时器2,也就是TIM2。前面几节说了TIM1的用法,包括基本的定时、捕获、输入PWM测量、输出PWM。TIM2的功能其实和TIM1类似,只是没有那么强大。所以我们只看其中比较常见的功能:定时和PWM输出。
这一节先研究下定时功能。
关于TIM2,我先放一个数据手册里的截图,了解它的主要功能:
可以看到,计数、自动装载、预分频器、输入捕获、输出比较、PWM生成、单脉冲,这些功能TIM2都有,所以它也是很强大的。
这里我们通过代码实现一个简单的功能:500ms一次中断。
用到的功能:分频,向上计数,自动重装载。
代码如下:
/* Includes ------------------------------------------------------------------*/
#include "stm8s.h"
#include "timer2_config.h"
/* Private defines -----------------------------------------------------------*/
/* Private function prototypes -----------------------------------------------*/
/* Private functions ---------------------------------------------------------*/
void Delay(uint16_t nCount)
{
/* Decrement nCount value */
while (nCount != 0)
{
nCount--;
}
}
void main(void)
{
CLK_HSIPrescalerConfig(CLK_PRESCALER_HSIDIV4);
GPIO_Init(GPIOB, GPIO_PIN_4, GPIO_MODE_OUT_PP_HIGH_SLOW);
timer2_init();
while (1);
}
跟TIM1的定时中断类似,主函数里先初始化PB4,然后对TIM2进行初始化,代码如下:
#include "timer2_config.h"
/***************************************
* TIMER2初始化
* 0.5秒一次中断
***************************************/
void timer2_init(void)
{
disableInterrupts();
TIM2_DeInit();
TIM2_TimeBaseInit(TIM2_PRESCALER_16, 62499);
TIM2_Cmd(ENABLE);
TIM2_ITConfig(TIM2_IT_UPDATE, ENABLE);
enableInterrupts();
}
函数名字都很简单,我就说下这一行的功能:
TIM2_TimeBaseInit(TIM2_PRESCALER_16, 62499);
TIM2的时基初始化,系统时钟做16分频然后提供给TIM2,定时周期为62499+1,也就是62500.
系统时钟为2MHZ,16分频后是125000,62500刚好是它的一半,也就是0.5秒。
中断部分的代码如下:
INTERRUPT_HANDLER(TIM2_UPD_OVF_BRK_IRQHandler, 13)
{
/* In order to detect unexpected events during development,
it is recommended to set a breakpoint on the following instruction.
*/
TIM2_ClearITPendingBit(TIM2_IT_UPDATE);
GPIO_WriteReverse(GPIOB, GPIO_PIN_4);
}
功能也很简单,清除TIM2的中断标志,然后PB4状态翻转。
最后,编译、下载、上电,功能正常!
打完收工!
要获取该程序完整的工程文件,可以关注公众号:单片机爱好者,然后回复关键词:STM8S。可以获取完整的下载链接,里面包含工程文件、视频、PPT、数据手册等所有相关资料。