本篇博文最后修改时间: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
五、基础知识
暂无六、实验步骤
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);
}
//******************************************************************************
//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
4)在MDK设置中添加驱动源文件路径
2、添加库的驱动
1)添加库的驱动文件
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"
//******************************************************************************
//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);
}
1)添加驱动头文件(main.c中)
#include "GUA_Timer2.h"
//定时器2初始化
GUA_Timer2_Init();
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时间到
}
}
2、香瓜使用的延时函数参数是64bit的,也就是最大时间为4294967295ms=4294967秒=71582分钟=1193小时=49天。如果不够用需要修改驱动的存储延时变量方式。
八、实验结果