获取STM32代码运行时间的技巧

发布时间:2023-01-09  

前言

测试代码的运行时间的两种方法:

1、使用单片机内部定时器,在待测程序段的开始启动定时器,在待测程序段的结尾关闭定时器。为了测量的准确性,要进行多次测量,并进行平均取值。

2、借助示波器的方法是:在待测程序段的开始阶段使单片机的一个GPIO输出高电平,在待测程序段的结尾阶段再令这个GPIO输出低电平。用示波器通过检查高电平的时间长度,就知道了这段代码的运行时间。显然,借助于示波器的方法更为简便。

借助示波器方法的实例

Delay_us函数使用STM32系统滴答定时器实现:

#include "systick.h"


/* SystemFrequency / 1000 1ms中断一次

* SystemFrequency / 100000 10us中断一次

* SystemFrequency / 1000000 1us中断一次

*/


#define SYSTICKPERIOD 0.000001

#define SYSTICKFREQUENCY (1/SYSTICKPERIOD)


/**

* @brief 读取SysTick的状态位COUNTFLAG

* @param 无

* @retval The new state of USART_FLAG (SET or RESET).

*/

static FlagStatus SysTick_GetFlagStatus(void)

{

if(SysTick->CTRL&SysTick_CTRL_COUNTFLAG_Msk)

{

return SET;

}

else

{

return RESET;

}

}


/**

* @brief 配置系统滴答定时器 SysTick

* @param 无

* @retval 1 = failed, 0 = successful

*/

uint32_t SysTick_Init(void)

{

/* 设置定时周期为1us */

if (SysTick_Config(SystemCoreClock / SYSTICKFREQUENCY))

{

/* Capture error */

return (1);

}


/* 关闭滴答定时器且禁止中断 */

SysTick->CTRL &= ~ (SysTick_CTRL_ENABLE_Msk | SysTick_CTRL_TICKINT_Msk);

return (0);

}


/**

* @brief us延时程序,10us为一个单位

* @param

* @arg nTime: Delay_us( 10 ) 则实现的延时为 10 * 1us = 10us

* @retval 无

*/

void Delay_us(__IO uint32_t nTime)

{

/* 清零计数器并使能滴答定时器 */

SysTick->VAL = 0;

SysTick->CTRL |= SysTick_CTRL_ENABLE_Msk;


for( ; nTime > 0 ; nTime--)

{

/* 等待一个延时单位的结束 */

while(SysTick_GetFlagStatus() != SET);

}


/* 关闭滴答定时器 */

SysTick->CTRL &= ~ SysTick_CTRL_ENABLE_Msk;

}

检验Delay_us执行时间中用到的GPIO(gpio.h、gpio.c)的配置:

#ifndef __GPIO_H

#define __GPIO_H


#include "stm32f10x.h"


#define LOW 0

#define HIGH 1


/* 带参宏,可以像内联函数一样使用 */

#define TX(a) if (a)

GPIO_SetBits(GPIOB,GPIO_Pin_0);

else

GPIO_ResetBits(GPIOB,GPIO_Pin_0)

void GPIO_Config(void);


#endif


#include "gpio.h"


/**

* @brief 初始化GPIO

* @param 无

* @retval 无

*/

void GPIO_Config(void)

{

/*定义一个GPIO_InitTypeDef类型的结构体*/

GPIO_InitTypeDef GPIO_InitStructure;


/*开启LED的外设时钟*/

RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOB, ENABLE);

GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;

GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;

GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;

GPIO_Init(GPIOB, &GPIO_InitStructure);

}

在main函数中检验Delay_us的执行时间:


#include "systick.h"

#include "gpio.h"


/**

* @brief 主函数

* @param 无

* @retval 无

*/

int main(void)

{

GPIO_Config();


/* 配置SysTick定时周期为1us */

SysTick_Init();


for(;;)

{

TX(HIGH);

Delay_us(1);

TX(LOW);

Delay_us(100);

}

}

示波器的观察结果:



可见Delay_us(100),执行了大概102us,而Delay_us(1)执行了2.2us。

更改一下main函数的延时参数:


int main(void)

{

/* LED 端口初始化 */

GPIO_Config();


/* 配置SysTick定时周期为1us */

SysTick_Init();


for(;;)

{

TX(HIGH);

Delay_us(10);

TX(LOW);

Delay_us(100);

}

}

示波器的观察结果:



可见Delay_us(100),执行了大概101us,而Delay_us(10)执行了11.4us。

结论:此延时函数基本上还是可靠的。

使用定时器方法的实例

Delay_us函数使用STM32定时器2实现:


#include "timer.h"


/* SystemFrequency / 1000 1ms中断一次

* SystemFrequency / 100000 10us中断一次

* SystemFrequency / 1000000 1us中断一次

*/


#define SYSTICKPERIOD 0.000001

#define SYSTICKFREQUENCY (1/SYSTICKPERIOD)


/**

* @brief 定时器2的初始化,,定时周期1uS

* @param 无

* @retval 无

*/

void TIM2_Init(void)

{

TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;


/*AHB = 72MHz,RCC_CFGR的PPRE1 = 2,所以APB1 = 36MHz,TIM2CLK = APB1*2 = 72MHz */

RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);

/* Time base configuration */

TIM_TimeBaseStructure.TIM_Period = SystemCoreClock/SYSTICKFREQUENCY -1;

TIM_TimeBaseStructure.TIM_Prescaler = 0;

TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;

TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure);

TIM_ARRPreloadConfig(TIM2, ENABLE);

/* 设置更新请求源只在计数器上溢或下溢时产生中断 */

TIM_UpdateRequestConfig(TIM2,TIM_UpdateSource_Global);

TIM_ClearFlag(TIM2, TIM_FLAG_Update);

}


/**

* @brief us延时程序,10us为一个单位

* @param

* @arg nTime: Delay_us( 10 ) 则实现的延时为 10 * 1us = 10us

* @retval 无

*/

void Delay_us(__IO uint32_t nTime)

{

/* 清零计数器并使能滴答定时器 */

TIM2->CNT = 0;

TIM_Cmd(TIM2, ENABLE);


for( ; nTime > 0 ; nTime--)

{

/* 等待一个延时单位的结束 */

while(TIM_GetFlagStatus(TIM2, TIM_FLAG_Update) != SET);

TIM_ClearFlag(TIM2, TIM_FLAG_Update);

}


TIM_Cmd(TIM2, DISABLE);

}

在main函数中检验Delay_us的执行时间:

#include "stm32f10x.h"

#include "Timer_Drive.h"

#include "gpio.h"

#include "systick.h"


TimingVarTypeDef Time;


int main(void)

{

文章来源于:电子工程世界    原文链接
本站所有转载文章系出于传递更多信息之目的,且明确注明来源,不希望被转载的媒体或个人可与我们联系,我们将立即进行删除处理。

相关文章

    引用一下MathWorks在Managing Model-Based Design一文中的一张图片来说明MBD是怎么运作的: MBD是怎么运作的 如果有了解过的人,可能更多看到的是V型开发流程,关于V......
    在串口通信实验中出现通信乱码怎么办;在串口通信实验中,如果出现了通信乱码问题,如图 串口通信成功了,但是接收的数据是乱码,可以从以下几个方面解决: 1,PC端和MCU的波特率是否一致 2,MCU......
    单片机。 二、C51与C52   ATMEL生产了很多型号的51单片机,最经典的自然就是AT89C51了,但是其的ROM只有4K、RAM只有128Byte,想多写几行代码怎么办?自然......
    马上将设备置于功能安全状态,以避免造成经济损失或者带来人身伤害。还比如一个电机转速控制系统,如果电流传感器值超限,需要马上让电机停机等。 其实,需要做模拟监测的场合还很多,这里不多做列举。 代码怎么写呢? 下面......
    说公司比较资深的工程师,有事没事多请他们吃吃饭,喝喝水搞好点关系。 一般来说都愿意把自己的代码分享给你,然后你再看他们写的代码,有哪些是值得学习的,最重要的是他们实现功能的思维,然后用代码怎么去实现? 如果......
    app是可以用的,即使是使用第三方服务区。出于好奇,他尝试学习Speedtest是怎么运作的。 Jacob说:“我决定把手机连到在Mac上运行的Mitmproxy,做了一些试验,让我......
    说ASW的软件代码怎么能放在规定的内存空间,更准确第地说,ASW代码编译完成后的地址怎么会在0x8040 0000 - 0x805F FFFF范围。需要使用#pragma用法来实现,以一个ASW函数......
    电机必须经常进行维护更换电刷。   那么,把有刷电机的电刷去掉会不会寿命长了呢,这样就产生了一种新的电机,也就是无刷电机。但是把有刷电机的电刷去掉后,电机怎么运行呢?   无刷电机结构与有刷电机正好相反,无刷电机中,换相......
    彻底颠覆认知:这么锻炼3分钟等于健身房3小时;工作压力大、没有时间锻炼,运动健康成为现代人最关心的话题之一。但有人发现,无论自己怎么运动都无法瘦下来,这到底是为什么呢? 最近,BBC于2014年拍......
    令脉冲数≥编码器反馈脉冲数,电机减速到停车; 2)停车时,指令脉冲数=编码器反馈脉冲数; 11、由于“伺服”这种控制模式,所以不能进行伺服电机的单脉冲步进控制,不信你输入一个指令脉冲,看看电机会怎么运......

我们与500+贴片厂合作,完美满足客户的定制需求。为品牌提供定制化的推广方案、专属产品特色页,多渠道推广,SEM/SEO精准营销以及与公众号的联合推广...详细>>

利用葫芦芯平台的卓越技术服务和新产品推广能力,原厂代理能轻松打入消费物联网(IOT)、信息与通信(ICT)、汽车及新能源汽车、工业自动化及工业物联网、装备及功率电子...详细>>

充分利用其强大的电子元器件采购流量,创新性地为这些物料提供了一个全新的窗口。我们的高效数字营销技术,不仅可以助你轻松识别与连接到需求方,更能够极大地提高“闲置物料”的处理能力,通过葫芦芯平台...详细>>

我们的目标很明确:构建一个全方位的半导体产业生态系统。成为一家全球领先的半导体互联网生态公司。目前,我们已成功打造了智能汽车、智能家居、大健康医疗、机器人和材料等五大生态领域。更为重要的是...详细>>

我们深知加工与定制类服务商的价值和重要性,因此,我们倾力为您提供最顶尖的营销资源。在我们的平台上,您可以直接接触到100万的研发工程师和采购工程师,以及10万的活跃客户群体...详细>>

凭借我们强大的专业流量和尖端的互联网数字营销技术,我们承诺为原厂提供免费的产品资料推广服务。无论是最新的资讯、技术动态还是创新产品,都可以通过我们的平台迅速传达给目标客户...详细>>

我们不止于将线索转化为潜在客户。葫芦芯平台致力于形成业务闭环,从引流、宣传到最终销售,全程跟进,确保每一个potential lead都得到妥善处理,从而大幅提高转化率。不仅如此...详细>>