大家好,我是单片机爱好者-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、数据手册等所有相关资料。