这个程序利用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