【STM8S】STM8S之定时器1的精确延时

原创 2016年08月30日 10:18:43

本篇博文最后修改时间:2016年11月30日,14:54。


一、简介

本文介绍STM8S系列如何使用定时器1进行精确定时1S


二、实验平台

编译软件:IAR for STM8 1.42.2

硬件平台:stm8s003f3p6开发板

仿真器:ST-LINK

库函数版本:STM8Sx_AN3298_FW_V4.0.0


版权声明

博主:甜甜的大香瓜

声明:喝水不忘挖井人,转载请注明出处。

原文地址:http://blog.csdn.NET/feilusia

联系方式:897503845@qq.com

香瓜BLE之CC2541群:127442605

香瓜BLE之CC2640群:557278427

香瓜BLE之Android群:541462902

香瓜单片机之STM8/STM32群:164311667
甜甜的大香瓜的小店(淘宝店):https://shop217632629.taobao.com/?spm=2013.1.1000126.d21.hd2o8i

四、实验前提
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。或者用示波器观察更为准确。

因此,实验成功。


版权声明:喝水不忘挖井人,转载请注明出处,897503845@qq.com。

stm8s开发(五) TIMER的使用:定时!

STM8S提供三种类型的TIM 定时器:高级控制型(TIM1)、通用型(TIM2/TIM3/TIM5)和基本型定时器(TIM4/TIM6)。它们虽有不同功能但都基于共同的架构。此共同的架构使得采用各个...
  • DevinTT
  • DevinTT
  • 2016年09月14日 13:02
  • 4421

STM8的TIM1定时器简单使用

STM8的TIM1定时器简单使用 STM8的TIM1是16位高级控制定时器,简单的定时溢出中断。功能实现LED1亮500ms,灭500ms,循环往复。 #i nclude ...
  • king110108
  • king110108
  • 2015年04月28日 21:17
  • 7695

STM8S103之tim4普通定时器

本篇博文最后修改时间:2017年08月14日 22:00。 一、简介 本文以STM8S103F3P6编程为例,介绍STM8S103F3P6定时器4计时驱动PB5脚 二、...
  • qq_18842031
  • qq_18842031
  • 2017年08月14日 21:33
  • 622

STM8S定时器基本中断定时

STM8S的定时器分三类; 高级定时器TIM1 通用定时器TIM2,TIM3,TIM5 基本定时器TIM4,TIM6其中除TIM4和TIM6是8位定时器外,其他的定时器都是16位计数的。 ...
  • LHChandsome
  • LHChandsome
  • 2017年09月26日 16:44
  • 979

STM8S 定时器的使用

转自: 船过水无痕 http://blog.csdn.net/liuyu60305002/article/details/6951916 看了网上的资源,都不怎么好用,于是决定总...
  • century99
  • century99
  • 2013年05月22日 11:03
  • 1802

stm8定时器配置工具 51定时转stm8配置工具

  • 2010年04月01日 15:20
  • 204KB
  • 下载

STM8 定时器TIM1 计时

ST公司的STM8单片机的TIM1定时器,是一个16位高级控制定时器,可用于实现基本的定时,PWM波的产生,这里主要分析下基本的计时功能。        我们先看ST提供的库函数中TIM1定时器的初...
  • menglishuigui
  • menglishuigui
  • 2018年01月29日 11:34
  • 16

【STM8L】STM8L之定时器3的精确延时

本文介绍STM8L系列如何使用定时器3进行精确定时1S
  • feilusia
  • feilusia
  • 2016年11月30日 14:48
  • 2578

STM8S003xx学习笔记(2):16位高级控制定时器(TIM1)

在单片机中定时器是一个非常重要的概念,这篇文章主要是对定时器TIM1做一个学习笔记。 1 综述 STM8S003xx只含有TIM1、TIM2、TIM4,其中TIM1是高级控制寄存器,TIM2和TIM4...
  • L20130316
  • L20130316
  • 2015年11月10日 20:26
  • 4571

STM8S 定时器的使用

看了网上的资源,都不怎么好用,于是决定总结总结,记录下定时器的简单实用方法。 环境: STM8SF103 ,仿真器为:STLINK TIM4 属于8位定时器,最大128分频。 这个定时器的时钟源...
  • liuyu60305002
  • liuyu60305002
  • 2011年11月09日 12:57
  • 18396
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:【STM8S】STM8S之定时器1的精确延时
举报原因:
原因补充:

(最多只允许输入30个字)