×
嵌入式 > 技术百科 > 详情

STM8S之定时器1的精确延时

发布时间:2020-06-17 发布时间:
|

一、简介


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


因此,实验成功。



『本文转载自网络,版权归原作者所有,如有侵权请联系删除』

热门文章 更多
分拣机器人的工作原理是什么