历史上的今天
今天是:2024年12月28日(星期六)
2018年12月28日 | stm32 运行时间测量与间隔执行
2018-12-28 来源:eefocus
这个程序利用stm32普通定时器构成了执行时间测量功能和间隔执行函数功能,使用如下,两种功能复用,通过#define选择
//执行时间测试模式下 #define StopWatch
//使用:
#include "Runtime.h"
Runtime_init();
while(1){
Runtime_start();
delay_ms(1);
Runtime_stop();
delay_ms(1000);
}
//setInterval模式 #define setInterval
setInterval(fun,1000);//传入回调,周期1.024*1000ms
c文件
#include "Runtime.h"
unsigned int nTime = 0;
void Runtime_init(void) {
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
NVIC_InitTypeDef NVIC_InitStu;
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM6, ENABLE); //使能TIM6时钟
#if defined(StopWatch)
/*基础设置,最大可测时间定为8.192ms*/
TIM_TimeBaseStructure.TIM_Period =
65536 - 1; // arr放最大,以实现最大测量范围
#endif
#if defined(setIntervalMODE)
/*1.024ms溢出*/
TIM_TimeBaseStructure.TIM_Period =
8192 - 1; // arr放最大,以实现最大测量范围
#endif
TIM_TimeBaseStructure.TIM_Prescaler = 9 - 1; //预分频
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; //向上计数
TIM_TimeBaseInit(TIM6, &TIM_TimeBaseStructure);
TIM_ITConfig(TIM6, TIM_IT_Update, ENABLE); //使能TIM6中断
TIM_Cmd(TIM6, ENABLE); //使能定时器6
NVIC_InitStu.NVIC_IRQChannel = TIM6_IRQn; //外部中断线,定时器6
NVIC_InitStu.NVIC_IRQChannelCmd = ENABLE;
NVIC_InitStu.NVIC_IRQChannelPreemptionPriority = 1; //抢占优先级
NVIC_InitStu.NVIC_IRQChannelSubPriority = 1; //子优先级
NVIC_Init(&NVIC_InitStu);
}
#if defined(StopWatch)
void TIM6_IRQHandler(void) {
//判断是否为定时器6的更新中断
if (TIM_GetITStatus(TIM6, TIM_IT_Update) != RESET) {
nTime++;
//注意要清除中断标志
TIM_ClearITPendingBit(TIM6, TIM_IT_Update);
}
}
void Runtime_start(void) {
nTime = 0; //清次数
TIM_SetCounter(TIM6, 0); //清空定时器的CNT
}
void Runtime_stop(void) {
unsigned int count = TIM6->CNT; // TIM_GetCounter(TIM6);
TIM_ITConfig(TIM6, TIM_IT_Update, DISABLE); //关TIM6中断
printf("run time:%f us %f ms\n", (float)count / 8 + 8192 * nTime,
(float)count / 8000 + 8.192 * nTime);
TIM_ITConfig(TIM6, TIM_IT_Update, ENABLE); //使能TIM6中断
}
#endif
#if defined(setIntervalMODE)
callbackType callback = NULL;
unsigned int intervalTime=0;
//初始化和设置setInterval
void setInterval(callbackType cb,unsigned int time){
callback=cb;
intervalTime=time;
Runtime_init();
}
void TIM6_IRQHandler(void) {
//判断是否为定时器6的更新中断
if (TIM_GetITStatus(TIM6, TIM_IT_Update) != RESET) {
nTime++;
if(nTime>=intervalTime){
TIM_ITConfig(TIM6, TIM_IT_Update, DISABLE); //关TIM6中断
nTime=0;
//需要定时执行的逻辑
if(callback){
callback();
}
TIM_SetCounter(TIM6, 0); //清空定时器的CNT
TIM_ITConfig(TIM6, TIM_IT_Update, ENABLE); //使能TIM6中断
}
//注意要清除中断标志
TIM_ClearITPendingBit(TIM6, TIM_IT_Update);
}
}
#endif
h文件
#ifndef __RUNTIME__
#define __RUNTIME__
////////MODE SET/////////
//#define StopWatch
#define setIntervalMODE
/////////////////////////
#include "sys.h"
#include "usart.h"
typedef void (*callbackType)(void);
void Runtime_init(void); //初始化
#if defined(StopWatch)
void Runtime_start(void); //开始执行时间测试
void Runtime_stop(void); //结束执行时间测试,打印结果到串口
#endif
#if defined(setIntervalMODE)
void setInterval(callbackType cb,unsigned int time);//初始化和设置setInterval
#endif
#endif
下一篇:STM32:基本定时器详解
史海拾趣
|
现在看设计的产品,无论是手机还是车载DVD还有导航等。都是注重了产品设计。强调了外观、功能、接口等。这样的产品设计是电脑、手机等消费电子的设计观念。用在车载产品上是不合适的。一个车的使用平均无故障时间是2年左右。现在用设计手机的概念去 ...… 查看全部问答> |
|
小弟在网上下了好多DXP2004都有些问题,这两天搞得焦头烂额的,希望那位有的能传给我,不胜感激! wanglei198661@163.com 有sp3的最好,sp2的也行 可以用的话给100分!!!… 查看全部问答> |
|
用什么代码能开启pda的无线功能? wince高手们,小弟现在用的是华硕的626的一款pda,操作系统是windows mobile6.0,支持无线Wi-Fi; 小弟现有一个问题,我在程序中用什么函数能够自动启用无线功能?… 查看全部问答> |
|
我使用的2812系列DSP,进行逆变器的控制。在读程序时遇到下面的一段代码不知道是什么意思?在很多论坛提问也没人回答。还请个位给我指点迷津!程序代码是这样的: /****************************数模转换的地址定************************ ...… 查看全部问答> |
|
小弟最近在学习zigbee算法,看到路由发现时很是疑惑,这个过程中要用到路由发现表,但看了半天,都没搞明白路由发现表有什么用,有没有高手可以帮我解答一下,谢谢。… 查看全部问答> |




