微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > STM32之系统滴答定时器

STM32之系统滴答定时器

时间:11-19 来源:互联网 点击:

,假设其他的中断的服务时间有很长,使得“在下一次计数结束(为0)之前,没有将节拍计数变量nTime更新”,那么延时的时间将要增长。

4、注意

此延时函数的最小分辨率不能设置为1us,最好设置为>=10us,这是因为轮训的周期和1us相比具有可比性,时间误差太大。

四、滴答定时器应用之程序段计时

1、函数实现思路

首先对滴答定时器初始化,计时节拍数是计数器的最大值。在感兴趣的程序段开始处,启动定时器,在程序段的结束处关闭定时器。倘若这段时间很长,超过了计数器的计数最大值,就会在中断函数中对溢出次数进行计数。最终的程序段时间决定于计数器的数据寄存器SysTick->VAL中的剩余值和中断溢出次数。

另外为了使程序能够对不同的程序段或者不同情况下的程序段进行计时,使用了一个结构体定义保存计时数据的结构体类型。在对程序段进行计时的时候,通过一个运行指针指向所要保存的变量中。  

2、函数代码  

① User_SysTick.c



/*********************************************************************************计时最小单位:1/72M s*计时最大长度:2^32/72M = 59.65 s*使用方法:*(1) 定义一个保存计时数据的TimingVarTypeDef类型变量Time*(2) 初始化*       SysTick_Time_Init(&Time);*(3) 在while循环中放置启动/停止函数*     while(1){*            SysTick_Time_Start();*         测试运行时间的代码*            SysTick_Time_Stop();*        }*******************************************************************************//* 定义保存未使用DMA时测试程序段运行时间的变量 */TimingVarTypeDef Time;/* 指针指向当前保存时间的变量 */TimingVarTypeDef * CurrentTimingVar; /* 系统滴答定时器的中断次数 */uint32_t TimeupTimes;/*** @brief  配置系统滴答定时器 SysTick* @param  无* @retval 1 = failed, 0 = successful*/uint32_t SysTick_Init(void){/* 设置定时周期为最大定时数SysTick_LOAD_RELOAD_Msk  */if (SysTick_Config(SysTick_LOAD_RELOAD_Msk)) { /* Capture error */ return (1);}/* 关闭滴答定时器且禁止中断  */SysTick->CTRL &= ~ SysTick_CTRL_ENABLE_Msk;                                                  return (0);} /*** @brief  滴答定时器 SysTick 计时初始化* @param  初始化计时变量的成员--计时次数* @retval 无*/void SysTick_Time_Init(TimingVarTypeDef * TimingVar){/* 指针指向当前保存时间的变量 */CurrentTimingVar = TimingVar;/* 计时次数初始化 */    CurrentTimingVar->SetSaveTimesNum = SaveTimesBufNum - 2;}/*** @brief  滴答定时器 SysTick 计时启动* @param  无* @retval 无*/void SysTick_Time_Start(void){/* 判断已经计时次数是否达到设置的计时次数 */if(CurrentTimingVar->SaveTimesTemp < CurrentTimingVar->SetSaveTimesNum){/* 滴答定时器的数据寄存器清零 */SysTick->VAL = 0;/* 滴答定时器中断次数清零 */TimeupTimes = 0;/* 启动滴答定时器 */SysTick->CTRL =  SysTick_CTRL_ENABLE_Msk; }}/*** @brief  滴答定时器 SysTick 计时停止并保存处理数据* @param  无* @retval 无*/void SysTick_Time_Stop(void){/* 保存已经计时次数 */    uint32_t TimesTemp = CurrentTimingVar->SaveTimesTemp;/* 保存设置计时总次数 */uint32_t SetSaveTimesNum = CurrentTimingVar->SetSaveTimesNum;uint32_t i,TimeWidthAverageTemp = 0; /* 保存设置计时总次数 */  if(SysTick->CTRL & SysTick_CTRL_ENABLE_Msk){/* 关闭滴答定时器 */SysTick->CTRL &= ~ SysTick_CTRL_ENABLE_Msk;/* 计算计时总时间 */CurrentTimingVar->TimeWidth[TimesTemp] =  SysTick_LOAD_RELOAD_Msk * TimeupTimes \+ (SysTick_LOAD_RELOAD_Msk - SysTick->VAL + 1);/* 判断计时次数是否满 */if((++TimesTemp) == SetSaveTimesNum){/* 计算平均值 */for(i = 0;i < SetSaveTimesNum; i++){TimeWidthAverageTemp += CurrentTimingVar->TimeWidth[i];}CurrentTimingVar->TimeWidthAvrage = TimeWidthAverageTemp/SetSaveTimesNum;    }/* 已经计时次数变量加1 */CurrentTimingVar->SaveTimesTemp++;    }}

View Code

② User_SysTick.h



#define SaveTimesBufNum 4                           /* 计时存储区的大小 */typedef struct {uint32_t SetSaveTimesNum;                     /* 设置计时总次数 */uint32_t SaveTimesTemp;                        /* 已经计时的次数 */uint32_t TimeWidth[SaveTimesBufNum];        /* 计时存储区 */uint32_t TimeWidthAvrage;                     /* 平均计时长度 */} TimingVarTypeDef;                                /*  计时变量类型 */extern TimingVarTypeDef Time;extern uint32_t TimeupTimes;extern uint32_t SysTick_Init(void);extern void SysTick_Time_Init(TimingVarTypeDef * TimingVar);extern void SysTick_Time_Start(void);extern void SysTick_Time_Stop(void);

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top