本篇博文最后修改时间: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函数中)

    //延时1STIMER1_Delay50Us(20000);

七、实验结果

仿真,在“TIMER1_Delay50Us”函数前后设置断点,可发现执行时长为1S。或者用示波器观察更为准确。

因此,实验成功。

【STM8S】STM8S之定时器1的精确延时相关推荐

  1. 单片机定时器精准定时_通过51单片机定时器/计数器实现精确延时

    MCS-51单片机内部共有两个16位可编程定时器,计数器,即TO.Tl.既有定时功能,又有计数的功能.每个定时器都是由两个8位的特殊功能寄存器THi和TLi组成(i=0.1).TMOD是TO和Tl的工 ...

  2. keil c语言 延迟程序,Keil C51程序设计中几种精确延时方法

    前几天时间在做一个基于51单片机开发板的等精度频率计,用LCD1602液晶显示的,晶振是22.1184MHZ,用得是测频率法,目的是想做到能够测试0--900KHZ的信号. 液晶显示部分花了我好几天才 ...

  3. c51语言1秒延时程序,KeilC51程序设计中几种精确延时方法

    实现延时通常有两种方法: 一种是硬件延时,要用到定时器/计数器,这种方法可以提高CPU的工作效率,也能做到精确延时:另一种是软件延时,这种方法主要采用循环体进行. 1 使用定时器/计数器实现精确延时 ...

  4. keil延时c语言程序设计,Keil C51程序设计中几种精确延时方法

    引言 单片机因具有体积小.功能强.成本低以及便于实现分布式控制而有非常广泛的应用领域[1].单片机开发者在编制各种应用程序时经常会遇到实现精确延时的问题,比如按键去抖.数据传输等操作都要在程序中插入一 ...

  5. STM8S系列基于STVD开发,自定义printf函数+TIM5精确延时函数模块化工程示例

    STM8S系列基于STVD开发,自定义printf函数+TIM5精确延时函数模块化工程示例

  6. 实现流水灯以间隔500ms的时间闪烁(系统定时器SysTick实现的精确延时)

    /** ****************************************************************************** * @file main.c * ...

  7. 89C52单片机定时器精确延时

    16位寄存器分为高八位(TH0)和低八位(TLO),取值范围0-65535 也就是低八位255,高八位255(255*255=65535) 问题:89C52开发板 晶振11.0592MHZ    用定 ...

  8. c语言流水灯定时器延时,实现流水灯以间隔500ms的时间闪烁(系统定时器SysTick实现的精确延时)...

    /** ****************************************************************************** * @file main.c * ...

  9. 51单片机几种精确延时(包含自动适应主时钟)

    实现延时通常有两种方法:一种是硬件延时,要用到定时器/计数器,这种方法可以提高CPU的工作效率,也能做到精确延时:另一种是软件延时,这种方法主要采用循环体进行. 今天主要介绍软件延时,关于硬件延时,之 ...

最新文章

  1. word2vec模型评估_干货 | NLP中的十个预训练模型
  2. c语言零基础快速入门,C语言几种循环结构—零基础小白快速入门必学
  3. python美化输出模块_Python 格式化输出 ( 颜色 )
  4. PHP源码之数组的内部实现
  5. BZOJ2705 [SDOI2012]Longge的问题 欧拉函数
  6. 清华大学团队与腾讯AI Lab专项合作夺冠FPS游戏AI竞赛VizDoom
  7. firedebug调试Jquery
  8. Codeforces Round #715 (Div. 1) B. Almost Sorted 找规律
  9. 从零开始学JavaWeb
  10. Eclipse断点调试出现Source not found
  11. ABP框架系列之六:(Value-Objects-值对象)
  12. DELPHI存储过程调用
  13. ZF环境要求及如何配置
  14. 使用了无效的sql语句_使用SQL语句创建数据库
  15. Ubuntu Linux下通过TPM1.2芯片保护SSH私钥的安全
  16. 一个按钮控制暂停和开始java_《第一炉香》|一个女人的自甘堕落,从控制不住欲望开始...
  17. java中arraylist扩容问题_Arraylist扩容机制
  18. 怎么把java文件编译为class文件
  19. CPU 工作原理(附详细图解)
  20. 架构漫谈专栏系列文章

热门文章

  1. 完美安装 Win10 + Ubantu 双系统启动
  2. 【网络经济与企业管理】主观题汇总
  3. Ubuntu无法找到WiFi适配器
  4. Win10下使用WampServer搭建PHP开发环境
  5. jinja2简单介绍
  6. 开启我的Python之旅
  7. 浅谈模式 - 适配器模式
  8. Linux 10:生产者消费者问题
  9. Sql Server 2008日志满的解决办法
  10. 先有鸡还是先有蛋?第一个编译器是怎么来的~