一、简介
本文介绍STM8S系列如何使用定时器1进行精确定时1S。
二、实验平台
编译软件:IAR for STM8 1.42.2
硬件平台:stm8s003f3p6开发板
仿真器:ST-LINK
库函数版本:STM8Sx_AN3298_FW_V4.0.0
三、版权声明
原文地址:http://blog.csdn.NET/feilusia
四、实验前提
1、在进行本文步骤前,请先阅读以下博文:
暂无
2、在进行本文步骤前,请先实现以下博文:
暂无
五、基础知识
1、STM8S的定时器最快能定时多少时长?
答:由于STM8S是16M晶振,定时器最快可以1分频,因此它的定时器频率也是16M。
它定时最快时间是1/16M,也就是1/16us,但是香瓜实测低于50us的定时频率很容易影响代码的正常运行。
因此STM8S的定时频率最快是50us。
六、实验步骤
1、工程中添加自己写的定时器驱动
1)写一个定时器驱动timer1.c(存放在工程的USER文件夹中)
//******************************************************************************
//name: timer1.c
//introduce: 定时器驱动
//author: 甜甜的大香瓜
//changetime: 2016.05.16
//email: 897503845@qq.com
//******************************************************************************
#include "timer1.h"
/*********************内部变量************************/
static u32 gTimer1_Delay;
//******************************************************************************
//name: TIMER1_Init
//introduce: 定时器1初始化
//parameter: none
//return: none
//author: 甜甜的大香瓜
//email: 897503845@qq.com
//changetime: 2016.05.16
//******************************************************************************
void TIMER1_Init(void)
{
TIM1_TimeBaseInit(0,TIM1_COUNTERMODE_UP,800,0); //1分频,向上计数,每50us定时中断一次, 重复计数器值为0
TIM1_ARRPreloadConfig(ENABLE);
TIM1_ITConfig(TIM1_IT_UPDATE , ENABLE);
TIM1_Cmd(ENABLE);
}
//******************************************************************************
//name: TIMER1_Decrement
//introduce: 定时器减1
//parameter: none
//return: none
//author: 甜甜的大香瓜
//email: 897503845@qq.com
//changetime: 2016.05.09
//******************************************************************************
void TIMER1_Decrement(void)
{
if(gTimer1_Delay != 0x00)
{
gTimer1_Delay--;
}
}
//******************************************************************************
//name: TIMER1_Delay50Us
//introduce: 定时器延时50微秒
//parameter: none
//return: none
//author: 甜甜的大香瓜
//email: 897503845@qq.com
//changetime: 2016.05.16
//******************************************************************************
void TIMER1_Delay50Us(u32 nTime)
{
gTimer1_Delay = nTime;
while(gTimer1_Delay != 0);
}
2)写一个定时器驱动头文件timer1.h(存放在工程的USER文件夹中)
//******************************************************************************
//name: timer1.h
//introduce: 定时器驱动的头文件
//author: 甜甜的大香瓜
//changetime: 2016.05.10
//email: 897503845@qq.com
//******************************************************************************
#ifndef __TIMER1_H
#define __TIMER1_H
/*********************头文件************************/
#include "stm8s.h"
/*********************外部函数声明************************/
void TIMER1_Init(void);
void TIMER1_Decrement(void);
void TIMER1_Delay50Us(u32 nTime);
#endif
3)工程中添加timer1.c
4)添加定时器驱动的路径
$PROJ_DIR$\..\USER
注意USER文件夹是与“Project”、“FWlib”文件夹同级的自定义文件,用于存放香瓜写的代码。
2、修改中断服务函数
1)添加头文件(stm8s_interruput.c中)
#include "timer1.h"
2)修改中断服务函数(stm8s_interruput.c中)
#pragma vector=0xD
__interrupt void TIM1_UPD_OVF_TRG_BRK_IRQHandler(void)
{
TIMER1_Decrement();
TIM1_ClearITPendingBit(TIM1_IT_UPDATE);
}
在中断服务函数里不停地减gTimer1_Delay这个全局变量。
3、应用层中调用
1)添加头文件(main.c中)
#include "timer1.h"
2)初始化(main.c的main函数中)
//开启定时器
TIMER1_Init();
//开全局中断
asm("rim");
初始化定时器后要记得开全局中断。
3)测试延时1S(main.c的main函数中)
//延时1S
TIMER1_Delay50Us(20000);
七、实验结果
仿真,在“TIMER1_Delay50Us”函数前后设置断点,可发现执行时长为1S。或者用示波器观察更为准确。
因此,实验成功。
上一篇:STM8 中关于PWM1 和 PWM2的区别
下一篇:STM8S PWM应用 用于设置红外38KHZ 载波
推荐阅读最新更新时间:2024-03-16 16:10