简介:这一章节将说明如何在stm8s上面部署一个TIM1,也就是定时器,我们将利用这一个定时器精准定时1ms单位,并用它来为LED灯闪烁时间作参考。
一、stm8定时器简述
打开用户手册,可以看到这张模块图鲜明的表明了STM8S103F3的外设内设都有哪些,我们可以看到右下角的几个定时器
可以得知,STM8S具有一个高级控制定时器TIM1,一个普遍应用定时器TIM2和一个基本定时器TIM4,可用的功能和配置逐级往下
二、配置TIM定时器
先看一条初始化TIM1的语句示例
TIM1_TimeBaseInit(0, TIM1_COUNTERMODE_UP, 800, 0);
第一个参数0,是预分频值,这里为0就是1分频,也就是我们定时器将和系统内置晶振时间一样,也是16Mhz。
第二个参数TIM1_COUNTERMODE_UP,这个是向上计数模式,除了向上计数模式还有向下计数与中央对齐模式TIM1_COUNTERMODE_CENTERALIGNED1,TIM1_COUNTERMODE_CENTERALIGNED2,TIM1_COUNTERMODE_CENTERALIGNED3和TIM1_COUNTERMODE_DOWN可选。
第三个参数800是指这个计数器将每50us中断一次,跳转到stm8s_it.c中的中断处理函数。这一个数值的计算方法: 定时器溢出值 = 预计定时时间/( 1/频率 ),16bit最大值为65535。
第四个参数是重装载的开始时间这里再装载时候从0开始
中断配置与使能函数
TIM1_ITConfig(TIM1_IT_UPDATE , ENABLE);
自动预装载使能
TIM1_ARRPreloadConfig(ENABLE);//每次中断后会自动装载之前配置的指定数值
使能定时器函数
TIM1_Cmd(ENABLE);
定时器的初始化函数参考
void InitTIM1(void)
{
TIM1_TimeBaseInit(0,TIM1_COUNTERMODE_UP,1600,0);
TIM1_ITConfig(TIM1_IT_UPDATE , ENABLE);
TIM1_ARRPreloadConfig(ENABLE);
TIM1_Cmd(ENABLE);
}
三、TIM中断设置与应用
打开stm8s_it.c文件找到tim1的中断处理函数部分
之前我已经在主函数中添加了u8 g_timer这一个变量用于计算 ,现在在中断处理函数下面添加函数用于每次增加timer ,这一个数值主要用于计算次数,按照我们的设定是100us中断一次,则10次为1ms,当变量为5000时就为0.5s。
增加g_timer数值的函数,在中断处理函数中调用
void timerAdd()
{
g_timer += 1;
}
中断处理函数
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.
*/
timerAdd();
TIM1_ClearITPendingBit(TIM1_IT_UPDATE);
}
之后再设置 根据这一个数值进行延时等待的函数,以1ms为单位 设计delay函数
void delay(int ms)
{
while(g_timer<ms*10);
g_timer = 0;
}
整体以上一篇文章为基础进行修改增加定时器函数,工程文件打包下载:
http://download.csdn.net/detail/u012388993/9906394