STM8S之定时器1的精确延时

发布者:朝霞暮雨最新更新时间:2018-07-24 来源: eefocus关键字:STM8S  定时器1  精确延时 手机看文章 扫描二维码
随时随地手机看文章

一、简介


本文介绍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。或者用示波器观察更为准确。


因此,实验成功。


关键字:STM8S  定时器1  精确延时 引用地址:STM8S之定时器1的精确延时

上一篇:STM8 中关于PWM1 和 PWM2的区别
下一篇:STM8S PWM应用 用于设置红外38KHZ 载波

推荐阅读最新更新时间:2024-03-16 16:10

STM8S 模拟I2C程序
STM8S的硬件I2C还是存在问题,不敢贸然使用. #define SCL PE_ODR_ODR1 #define SDA PE_ODR_ODR2 #define SDAM PE_IDR_IDR2 #define SET_SCL_OUT() {PE_DDR_DDR1=1; PE_CR1_C11 = 1; PE_CR2_C21 = 0;} #define SET_SDA_OUT() {PE_DDR_DDR2=1; PE_CR1_C12 = 1; PE_CR2_C22 = 0;} #define SET_SDA_IN() {PE_DDR_DDR2=0; PE_CR1_C12 = 0; PE_CR2_C22 = 0;} //------
[单片机]
stm8s开发(三) UART的使用:串口通信!
串口通信是单片机学习的一个最基本、最重要的功能之一。串口通信可以间接的当做调试接口使用,实现单片机与电脑之间的通信。当然可以与一些模块(比如蓝牙、wifi)通信,也可以作为和其他单片机通信的工具。 STM8S的通用异步收发器(UART)主要特性: ● 全双工的,异步通信 ● 可编程数据字长度(8位或9位) ● 可配置的停止位-支持1或2个停止位 一般的,我们使用串口通信主要是关心几点参数:波特率、停止位、奇偶校验位。 其次就是如何发送、如何接收数据,这里介绍的使用阻塞式发送数据、中断方式接收数据。 以下代码是初始化串口,参数为:115200 1停止位 无校验位 void Init_UART1(void)
[单片机]
<font color='red'>stm8s</font>开发(三) UART的使用:串口通信!
对MSP430单片机__delay_cycles精确延时的说明及改正
在这里, 我来讨论一下关于MSP430单片机使用__delay_cycles延时的问题. IAR for MSP430编译器提供了一个编译器内联的精确延时函数(并非真正的 函数)以提供用户精确延时使用, 该函数原型是: __intrinsic void __delay_cycles(unsigned long __cycles); 该内部函数实现__cycles个CPU周期的延时,但对于该参数的设置,我要陈述一下: __cycles需要我们传递的是CPU运行的周期个数 网上普遍的用法是: #define CPU_CLOCK 8000000 #define delay_us(us)
[单片机]
STM8S:Debug调试正常,烧录程序运行不正常
最近有一个项目需要用到STM8S103F3单片机。在开始之前以为会很容易,可是实际操作起来,却遇到不少问题 。其中最令我感到困惑的一个问题是:我在调试程序的时候程序可以运行正常,但当我把程序烧录进去断电重启后却运行不正常。 试了很多方法,都没有找到问题所在。最后,我把Start-up file 选择默认的就可以。之前不知道在哪里看到过可以不使用系统的默认启动文件,可以直接在stm8_interrupt_vector.c中将_stext()改为main();现在看来真的是害死个让人。 关于STM8S的启动过程: 1)首先bootloader(ROM中)从0x6000地址启动。 2)从bootloader跳转到0x8000(内
[单片机]
keil c51程序设计中集中精确延时方法
1使用定时器/计数器实现精确延时 单片机系统一般常选用11.059 2 MHz、12 MHz或6 MHz晶振。第一种更容易产生各种标准的波特率,后两种的一个机器周期分别为1 μs和2 μs,便于精确延时。本程序中假设使用频率为12 MHz的晶振。最长的延时时间可达216=65 536 μs。若定时器工作在方式2,则可实现极短时间的精确延时;如使用其他定时方式,则要考虑重装定时初值的时间(重装定时器初值占用2个机器周期)。 在实际应用中,定时常采用中断方式,如进行适当的循环可实现几秒甚至更长时间的延时。使用定时器/计数器延时从程序的执行效率和稳定性两方面考虑都是最佳的方案。但应该注意,C51编写的中断服务程序编译后会自动加上
[单片机]
STM8红外捕获解析 使用TIM1 16位高级控制定时器
TIM1 16位高级控制定时器 高级控制定时器具有不同的用途: 1、基本的定时。 2、测量输入信号的脉冲宽度(输入捕获) 3、产生输出波形(输出比较,PWM和单脉冲模式) 4、对应不同的事件(捕获、比较、溢出、刹车、触发)的中断。 高级控制定时器的时钟源可以是内部时钟,也可以是外部的信号,可以通过配置寄存器来进行选择。 多达4个独立通道可以配置 1、输入捕获 2、输出比较 3、PWM生成 4、单脉冲模式输出 static void TIM1_Init(void) { /* Set the Prescaler value */ TIM1- PSCRH = (u8)(Prescaler_t
[单片机]
STM8S TIM1/TIM2 初始化函数
/* TIM2初始化函数 返回值:无 参数:定时时间 us */ #define CPU_CLK 16027 //主频 KHz void timer2_Init(ulong us) { uchar PSCR = 0; //分频 uint pow; ulong ARR; start: pow=1; for(uchar i=0;i PSCR;i++) //算2的n次方 { pow *= 2; } if(us 250000) ARR = (((((us-1)/ 1000) * CPU_CLK) )/pow); else ARR = ((((us-1) * CPU_CLK+
[单片机]
音频精确延时系统及其实现
摘要:使用CPLD与音频专用数模/模数集成电路实现音频精确延时系统,详细阐述了设计思路并给出了系统自顶向下的设计过程。 关键词:CPLD;音频A/D、D/A;延时 引言 音频的时间延迟传统上使用延迟线或电荷耦合器件实现,这在民用设备中有着广泛的应用。最常见的是卡拉OK机的混响系统,它使用延迟一定时间的信号产生回声的效果。某些专用的BBE器件,如三菱的M58000系列,内部采用了数模和模数转换技术,内置动态RAM存储数据,某些芯片可以通过调整其时钟频率或有专用引脚调整延时量。可调范围在数百毫秒量级,误差在毫秒量级。这些芯片普遍采用较低的采样速率,仅对输入信号的低频分量进行处理,采样位数也多为8位以下。这在一般应用中,特别是卡拉
[模拟电子]
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
随便看看
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved