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

STM8L之定时器3的精确延时

发布时间:2021-04-19 发布时间:
|

简介

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

注:驱动外默认已启动16M晶振。


实验平台

编译软件:IAR for STM8 1.42.2

硬件平台:stm8l101f3p6开发板

仿真器:ST-LINK

库函数版本:STM8L_STMTouch_Lib_V1.1.0


实验步骤

1、工程中添加自己写的定时器3的驱动

1)写一个驱动GUA_Timer3.c (存放在工程的USER文件夹中)


//******************************************************************************                            

//name:             GUA_Timer3.c               

//introduce:        定时器3驱动        

//author:           甜甜的大香瓜                     

//email:            897503845@qq.com         

//QQ group          香瓜单片机之STM8/STM32(164311667)                      

//changetime:       2016.11.30      

//******************************************************************************    

#include "stm8l10x.h"  

#include "GUA_Timer3.h"  

  

/*********************内部变量************************/   

static u32 gGUA_Timer3_Delay; 

 

//******************************************************************************          

//name:             GUA_Timer3_Decrement          

//introduce:        定时器减1       

//parameter:        none         

//return:           none        

//author:           甜甜的大香瓜               

//email:            897503845@qq.com                  

//QQ group          香瓜单片机之STM8/STM32(164311667)                      

//changetime:       2016.11.30                        

//******************************************************************************    

void GUA_Timer3_Decrement(void)  

{  

  if(gGUA_Timer3_Delay != 0x00)  

  {   

    gGUA_Timer3_Delay--;  

  }  

}  

  

//******************************************************************************          

//name:             GUA_Timer3_Delay50Us          

//introduce:        定时器延时50微秒       

//parameter:        none         

//return:           none        

//author:           甜甜的大香瓜               

//email:            897503845@qq.com                  

//QQ group          香瓜单片机之STM8/STM32(164311667)                      

//changetime:       2016.11.30                        

//******************************************************************************    

void GUA_Timer3_Delay50Us(u32 nGUA_Time)  

{  

  gGUA_Timer3_Delay = nGUA_Time;  

  

  while(gGUA_Timer3_Delay != 0);  

}  

 

//******************************************************************************          

//name:             GUA_Timer3_Init          

//introduce:        定时器3初始化       

//parameter:        none         

//return:           none        

//author:           甜甜的大香瓜               

//email:            897503845@qq.com                  

//QQ group          香瓜单片机之STM8/STM32(164311667)                      

//changetime:       2016.11.30                        

//******************************************************************************    

void GUA_Timer3_Init(void)  

{  

  //时钟配置  

  CLK_PeripheralClockConfig(CLK_Peripheral_TIM3,ENABLE);    

  

  //1分频,向上计数,每50us定时中断一次   

  TIM3_DeInit();  

  TIM3_TimeBaseInit(TIM3_Prescaler_1, TIM3_CounterMode_Up, 16*50);       

  TIM3_ARRPreloadConfig(ENABLE);  

  TIM3_ITConfig(TIM3_IT_Update, ENABLE);  

  TIM3_Cmd(ENABLE);  

}  


2)写一个定时器驱动头文件GUA_Timer3.h(存放在工程的USER文件夹中)

//******************************************************************************                            

//name:             GUA_Timer3.h            

//introduce:        定时器3驱动的头文件        

//author:           甜甜的大香瓜                     

//email:            897503845@qq.com         

//QQ group          香瓜单片机之STM8/STM32(164311667)                      

//changetime:       2016.11.30      

//******************************************************************************   

#ifndef _GUA_TIMER3_H_  

#define _GUA_TIMER3_H_  

   

/*********************外部函数声明************************/   

void GUA_Timer3_Decrement(void);

void GUA_Timer3_Delay50Us(u32 nGUA_Time);  

void GUA_Timer3_Init(void);  

  

#endif  


3)工程中添加GUA_Timer3.c

4)添加定时器驱动的路径


$PROJ_DIR$..USER  

注意USER文件夹是与“Project”、“FWlib”文件夹同级的自定义文件,用于存放香瓜写的代码。


2、添加库的驱动


1)添加库的驱动文件

3、写中断服务函数(stm8l10x_it.c中)

1)添加头文件

#include "GUA_Timer3.h" 


2)修改定时器3中断服务函数

//******************************************************************************          

//name:             GUA_Timer3_Decrement          

//introduce:        定时器3的Update/Overflow/Trigger/Break中断服务函数,定时器减1       

//parameter:        none         

//return:           none        

//author:           甜甜的大香瓜               

//email:            897503845@qq.com                  

//QQ group          香瓜单片机之STM8/STM32(164311667)                      

//changetime:       2016.11.30                        

//****************************************************************************** 

INTERRUPT_HANDLER(TIM3_UPD_OVF_TRG_BRK_IRQHandler, 21)

{

  GUA_Timer3_Decrement();

  TIM3_ClearITPendingBit(TIM3_IT_Update);   

}

进一次中断减一次静态变量的数值。


4、应用层中调用


1)添加头文件(main.c中)


#include "GUA_Timer3.h"


2)初始化(main.c的main函数中)

  //定时器3的初始化

  GUA_Timer3_Init(); 


3)测试延时1S(main.c的main函数中)

  //延时1S  

  GUA_Timer3_Delay50Us(20000);  


五、实验结果

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


因此实验成功。




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

热门文章 更多
ZigBee技术语音图像无线监控系统的设计与实现