【STM32】STM32之timer2的精准延时

本篇博文最后修改时间:2017年01月22日,15:37。


一、简介

本文介绍STM32系列如何使用timer2进行精确定时


二、实验平台

库版本:STM32F10x_StdPeriph_Lib_V3.5.0

编译软件:MDK4.53

硬件平台:STM32开发板(主芯片stm32f103c8t6)

仿真器:JLINK


版权声明

博主:甜甜的大香瓜

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

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

联系方式:[email protected]

香瓜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、编写并添加定时器2驱动

1)编写驱动GUA_Timer2.c(存放在“……\HARDWARE”)

//******************************************************************************            
//name:             GUA_Timer2.c            
//introduce:        定时器2驱动     
//author:           甜甜的大香瓜                   
//email:            [email protected]       
//QQ group          香瓜单片机之STM8/STM32(164311667)                    
//changetime:       2017.01.15     
//******************************************************************************    
#include "stm32f10x.h"  
#include "GUA_Timer2.h"  

/*********************宏定义************************/    
//时钟宏  
#define GUA_TIMER2_PERIPH_CLOCK			RCC_APB1Periph_TIM2 

/*********************内部变量************************/                            
static GUA_U64 sGUA_Timer2_TimingDelay_1 = 0;    
static GUA_U64 sGUA_Timer2_TimingDelay_2 = 0; 

//******************************************************************************                
//name:             GUA_Timer2_TimingDelay_Decrement               
//introduce:        定时器2数值减1的处理操作            
//parameter:        none                     
//return:           none             
//author:           甜甜的大香瓜                     
//email:            [email protected]         
//QQ group          香瓜单片机之STM8/STM32(164311667)                      
//changetime:       2017.01.15                         
//******************************************************************************    
void GUA_Timer2_TimingDelay_Decrement(void)    
{    
	//变量1做递减
	if(sGUA_Timer2_TimingDelay_1 != 0x00)    
	{    
		sGUA_Timer2_TimingDelay_1--;    
	}   

	//变量2做递减
	if(sGUA_Timer2_TimingDelay_2 != 0x00)    
	{    
		sGUA_Timer2_TimingDelay_2--;    
	}	
} 

//******************************************************************************                
//name:             GUA_Timer2_StartDelayMs_1               
//introduce:        启动延时         
//parameter:        nGUA_Timer2_Time:需要延时的ms数                     
//return:           none             
//author:           甜甜的大香瓜                     
//email:            [email protected]         
//QQ group          香瓜单片机之STM8/STM32(164311667)                      
//changetime:       2017.01.15                         
//******************************************************************************    
void GUA_Timer2_StartDelayMs_1(GUA_U64 nGUA_Timer2_Time)    
{    
	sGUA_Timer2_TimingDelay_1 = nGUA_Timer2_Time;            
}

//******************************************************************************                
//name:             GUA_Timer2_CheckDelayMs_1               
//introduce:        检查延时         
//parameter:        none                    
//return:           剩余的延时ms数             
//author:           甜甜的大香瓜                     
//email:            [email protected]         
//QQ group          香瓜单片机之STM8/STM32(164311667)                      
//changetime:       2017.01.15                         
//******************************************************************************    
GUA_U64 GUA_Timer2_CheckDelayMs_1(void)    
{    
	return sGUA_Timer2_TimingDelay_1;            
}

//******************************************************************************                
//name:             GUA_Timer2_StartDelayMs_2               
//introduce:        启动延时         
//parameter:        nGUA_Timer2_Time:需要延时的ms数                     
//return:           none             
//author:           甜甜的大香瓜                     
//email:            [email protected]         
//QQ group          香瓜单片机之STM8/STM32(164311667)                      
//changetime:       2017.01.15                         
//******************************************************************************    
void GUA_Timer2_StartDelayMs_2(GUA_U64 nGUA_Timer2_Time)    
{    
	sGUA_Timer2_TimingDelay_2 = nGUA_Timer2_Time;            
}

//******************************************************************************                
//name:             GUA_Timer2_CheckDelayMs_2               
//introduce:        检查延时         
//parameter:        none                    
//return:           剩余的延时ms数             
//author:           甜甜的大香瓜                     
//email:            [email protected]         
//QQ group          香瓜单片机之STM8/STM32(164311667)                      
//changetime:       2017.01.15                         
//******************************************************************************    
GUA_U64 GUA_Timer2_CheckDelayMs_2(void)    
{    
	return sGUA_Timer2_TimingDelay_2;            
}

//******************************************************************************              
//name:             GUA_Timer2_Init             
//introduce:        定时器2初始化           
//parameter:        none                  
//return:           none           
//author:           甜甜的大香瓜                   
//email:            [email protected]       
//QQ group          香瓜单片机之STM8/STM32(164311667)                    
//changetime:       2017.01.15                      
//******************************************************************************  
void GUA_Timer2_Init(void)  
{  
	TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;  
  
	//时钟配置
	RCC_APB1PeriphClockCmd(GUA_TIMER2_PERIPH_CLOCK, ENABLE);  
	
	//定时器配置
	TIM_DeInit(TIM2);																							//复位寄存器配置
	TIM_TimeBaseStructure.TIM_Period = 72 - 1;										//设置计数值  
	TIM_TimeBaseStructure.TIM_Prescaler = 1000 - 1;								//设置预分频 
	TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1;				//设置时钟分频系数:不分频  
	TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;		//向上计数溢出模式  
	TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure);    

	//开中断
	TIM_ClearFlag(TIM2, TIM_FLAG_Update);
	TIM_ITConfig(TIM2, TIM_IT_Update, ENABLE);	
	
	//使能		  	
	TIM_Cmd(TIM2, ENABLE);
}

2) 编写驱动头文件 GUA_Timer2.h (存放在“ …… \HARDWARE ”)

//******************************************************************************          
//name:             GUA_Timer2.h          
//introduce:        定时器2驱动的头文件   
//author:           甜甜的大香瓜                 
//email:            [email protected]     
//QQ group          香瓜单片机之STM8/STM32(164311667)                  
//changetime:       2017.01.15    
//****************************************************************************** 
#ifndef _GUA_TIMER2_H_
#define _GUA_TIMER2_H_

/*********************宏定义************************/       
//类型宏
#ifndef GUA_U8        
typedef unsigned char GUA_U8;        
#endif    

#ifndef GUA_8        
typedef signed char GUA_8;        
#endif      
      
#ifndef GUA_U16        
typedef unsigned short GUA_U16;        
#endif 

#ifndef GUA_16        
typedef signed short GUA_16;        
#endif         
      
#ifndef GUA_U32        
typedef unsigned long GUA_U32;        
#endif 

#ifndef GUA_32        
typedef signed long GUA_32;       
#endif

#ifndef GUA_U64    
typedef unsigned long long GUA_U64;  
#endif

#ifndef GUA_64    
typedef signed long long GUA_64;  
#endif

/*********************外部函数************************/
extern void GUA_Timer2_TimingDelay_Decrement(void);
extern void GUA_Timer2_StartDelayMs_1(GUA_U64 nGUA_Timer2_Time);
extern GUA_U64 GUA_Timer2_CheckDelayMs_1(void);
extern void GUA_Timer2_StartDelayMs_2(GUA_U64 nGUA_Timer2_Time);
extern GUA_U64 GUA_Timer2_CheckDelayMs_2(void);
extern void GUA_Timer2_Init(void);

#endif


3) 工程中添加GUA_Timer2.c

【STM32】STM32之timer2的精准延时_第1张图片


4)在MDK设置中添加驱动源文件路径

【STM32】STM32之timer2的精准延时_第2张图片

2、添加库的驱动

1)添加库的驱动文件

【STM32】STM32之timer2的精准延时_第3张图片


3、设置NVIC中断优先级(GUA_NVIC.c的GUA_NVIC_Init中

	//定时器2
	GUA_NVIC_Config(NVIC_PriorityGroup_2, TIM2_IRQn, 2, 0, ENABLE);	

4、写中断服务函数(stm32f10x_it.c中)

1)添加头文件

#include "GUA_Timer2.h"

2)写中断服务函数

//******************************************************************************            
//name:             TIM2_IRQHandler           
//introduce:        定时器2中断服务函数         
//parameter:        none                 
//return:           none         
//author:           甜甜的大香瓜                 
//email:            [email protected]     
//QQ group          香瓜单片机之STM8/STM32(164311667)                  
//changetime:       2017.01.15                    
//******************************************************************************
void TIM2_IRQHandler(void)
{
	//检查TIM2是否更新
	if(TIM_GetITStatus(TIM2, TIM_IT_Update) != RESET) 
	{	
		//递减定时器的变量
		GUA_Timer2_TimingDelay_Decrement();			
	}	
	
	//清除中断标志位
	TIM_ClearITPendingBit(TIM2, TIM_IT_Update);	
}

5、在应用层中调用

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

#include "GUA_Timer2.h" 

2) 添加初始化代码(main.c的main函数中)

	//定时器2初始化
	GUA_Timer2_Init();

3) 添加测试代码(main.c的main函数中)

	GUA_Timer2_StartDelayMs_1(1000);			//定时1秒	
	GUA_Timer2_StartDelayMs_2(3000);			//定时3秒
	
	while(1)
	{
		if(GUA_Timer2_CheckDelayMs_1() == 0)
		{
			//1S时间到
		}	

		if(GUA_Timer2_CheckDelayMs_2() == 0)
		{
			//3S时间到
		}		
	}	


七、注意事项
1、香瓜延时使用的是查询的方法,会受中断的影响导致延时时间有些许误差。

2、香瓜使用的延时函数参数是64bit的,也就是最大时间为‭4294967295‬ms=4294967秒=71582分钟=1193小时=49天。如果不够用需要修改驱动的存储延时变量方式。


八、实验结果

设置仿真断点在测试代码中的两个if函数内,仿真并全速运行。
可粗略感受到分别进两个if内部为1S和3S,具体时间大家自行用仪器测试。

因此,实验成功。




你可能感兴趣的:(STM32)