历史上的今天
返回首页

历史上的今天

今天是: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

推荐阅读

史海拾趣

CHIMEI(奇美)公司的发展小趣事

奇美公司的创业历程始于XXXX年,当时电子产业正处于蓬勃发展的初期。公司创始人凭借对电子行业的敏锐洞察力和坚定的创业决心,带领一支充满激情和创造力的团队,开始了奇美的创业之路。在创业初期,奇美专注于电子产品的研发和生产,通过不断的技术创新和市场拓展,逐渐在行业内崭露头角。

EWC Controls公司的发展小趣事

EWC Controls公司自成立以来,一直专注于工业自动化控制技术的研发与应用。在早期,公司凭借其独特的PID控制算法,成功开发了一系列高性能的控制器产品,赢得了市场的初步认可。随着技术的不断进步,EWC Controls公司不断投入研发资源,推出了基于物联网和大数据的智能控制系统,实现了从单一控制到智能化管理的跨越。这一创新技术不仅提升了公司的核心竞争力,也为工业自动化控制领域带来了革命性的变化。

Gemmy Electronics Co Ltd公司的发展小趣事
电子捕鼠器首先通过电源电路将家用交流电(如220V)转换为适合捕鼠器工作的低压直流电(如6V)。
Discrete Semiconductor Industries公司的发展小趣事

“创新动力”是Discrete Semiconductor Industries公司中一家以创新驱动发展的典范。该公司注重研发投入,积极引进和培养科技人才,建立了完善的研发体系。通过不断的技术创新和产品升级,创新动力不断推出具有市场竞争力的新产品。同时,公司还积极探索新的应用领域和市场机会,不断拓展业务范围。这种创新驱动的发展战略使得创新动力在激烈的市场竞争中保持了强劲的发展势头。

Advanced Semiconductor, Inc.公司的发展小趣事

在半导体市场竞争日益激烈的背景下,ASI也面临着巨大的市场压力和挑战。为了应对市场波动和竞争压力,ASI不断调整战略方向,加大在研发和创新方面的投入。公司不断推出新产品、新技术,以满足市场的不断变化和客户需求。同时,ASI也注重提升产品质量和服务水平,赢得了客户的信任和好评。

BOWEI公司的发展小趣事

随着全球对环保和可持续发展的重视,ASI也积极响应这一趋势,致力于研发更加环保、节能的半导体产品。公司不断投入资源研发低功耗、高性能的芯片技术,为推动绿色电子产业的发展贡献力量。同时,ASI也对未来充满信心,将继续加大在新技术、新应用领域的投入,为半导体行业的未来发展贡献更多的智慧和力量。

这五个故事展示了Advanced Semiconductor, Inc.在电子行业中的发展历程和取得的成就。从创立初期的艰难探索到如今的行业领先地位,ASI凭借其独特的技术、创新的精神和敏锐的市场洞察力,不断突破自我、超越自我,成为了半导体行业的一颗璀璨明星。

问答坊 | AI 解惑

可靠性设计-车载电子十分需要

现在看设计的产品,无论是手机还是车载DVD还有导航等。都是注重了产品设计。强调了外观、功能、接口等。这样的产品设计是电脑、手机等消费电子的设计观念。用在车载产品上是不合适的。一个车的使用平均无故障时间是2年左右。现在用设计手机的概念去 ...…

查看全部问答>

有人用过CYPRESS的PSOC嘛?

如题,最近来了个销售,一顿讲,不能听一面之词啊,来坛子问问。…

查看全部问答>

IAR环境下,如果要往RF-CC2430下载协议栈,要怎样设置?

总是下载不成功,不知道option里的参数该怎样设置?求大牛指教,不胜感激!…

查看全部问答>

急求一个可用的DXP2004

小弟在网上下了好多DXP2004都有些问题,这两天搞得焦头烂额的,希望那位有的能传给我,不胜感激! wanglei198661@163.com  有sp3的最好,sp2的也行 可以用的话给100分!!!…

查看全部问答>

WCE基本问题!急!!!!!

我最近期购买了一套ARM开发板子,后来发现我的笔记本上没有串口,请问下用USB转串口线能现实学习板的下载,调试等功能吗,急!…

查看全部问答>

用什么代码能开启pda的无线功能?

用什么代码能开启pda的无线功能? wince高手们,小弟现在用的是华硕的626的一款pda,操作系统是windows   mobile6.0,支持无线Wi-Fi; 小弟现有一个问题,我在程序中用什么函数能够自动启用无线功能?…

查看全部问答>

论坛级别建议

我们论坛级别全部来自威望,这有点不合理啊。我建议可以结合发贴量和威望以及芯币综合考虑。这样才能溵发大家的发贴热情。要不然论坛除了管理员,版主就是金砂了。…

查看全部问答>

这个UCos啊

这个uCOS  让我倍受打击   之前还能勉强用  到现在  却越到后面越让人伤神  移植一个GUI  却让我哭笑不得~~~ 得加吧劲啊 ~~~…

查看全部问答>

关于程序中DA转换的问题!求大侠指教!

我使用的2812系列DSP,进行逆变器的控制。在读程序时遇到下面的一段代码不知道是什么意思?在很多论坛提问也没人回答。还请个位给我指点迷津!程序代码是这样的:   /****************************数模转换的地址定************************ ...…

查看全部问答>

zigbee路由发现表

小弟最近在学习zigbee算法,看到路由发现时很是疑惑,这个过程中要用到路由发现表,但看了半天,都没搞明白路由发现表有什么用,有没有高手可以帮我解答一下,谢谢。…

查看全部问答>