IAR\ST-Link调试程序查看STM32单片机某段代码运行时间

本文详细介绍使用STM32微控制器进行精确时间测量的三种方法:利用DWT->CYCCNT寄存器进行软件计时,通过硬件电平变化配合示波器观测,以及借助IAR环境和ST-Link调试器记录运行时间。深入解析DWT->CYCCNT寄存器的使用,包括其在STM32F103系列上的具体应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

本文介绍三种方法查看代码运行时间,一种是使用单片机内部的数据观察器和Trace (Data Watchpoint and Trace)。通过引脚跳变,用示波器观察。另一种是通过stlink调试器。我觉得最精确的是第一种。操作方法如下

一、数据观察器和Trace

        

DWT->CYCCNT是在ARM Cortex-M微控制器中的一个寄存器,用于测量程序执行的周期数。DWT代表数据观察器和Trace (Data Watchpoint and Trace),CYCCNT表示Cycle Count(周期计数)。

DWT->CYCCNT寄存器可以用于实现精确的程序执行时间测量、性能分析和调试。通过读取CYCCNT寄存器的值,可以确定程序在不同部分花费的CPU周期数。这对于优化性能、检测瓶颈和调试时间相关问题都非常有用。

使用DWT->CYCCNT寄存器进行精确的时间测量通常需要以下步骤:

  1. 启用DWT单元:在使用DWT之前,需要先启用DWT单元。可以通过写入特定值到DEMCR寄存器的相应位来实现。

  2. 启用CYCCNT计数器:需要将DWT->CYCCNT寄存器清零,并启用CYCCNT计数器。可以通过将特定值加载到DWT->CTRL寄存器来实现。

  3. 计数器读取:通过读取DWT->CYCCNT寄存器的值,可以获取当前的周期计数。、

以下是使用DWT->CYCCNT寄存器进行时间测量的伪代码示例:

// 启用DWT单元
CoreDebug->DEMCR |= CoreDebug_DEMCR_TRCENA_Msk;

// 启用CYCCNT计数器
DWT->CYCCNT = 0;
DWT->CTRL |= DWT_CTRL_CYCCNTENA_Msk;

// 测量开始时间
uint32_t start = DWT->CYCCNT;

// 执行需要测量时间的代码

// 测量结束时间
uint32_t end = DWT->CYCCNT;

// 计算执行时间
uint32_t cycles = end - start;

对于STM32F103系列微控制器,系统时钟配置为72 MHz。在这种情况下,DWT->CYCCNT寄存器的数值对应的时间计算如下:

计算CPU时钟周期的时间:
CPU时钟周期 = 1 / CPU时钟频率
= 1 / 72 MHz
≈ 13.89 纳秒

转换CYCCNT数值为时间:
假设CYCCNT的数值为5000:
时间(秒) = CYCCNT数值 * CPU时钟周期
= 5000 * 13.89 纳秒
≈ 69.45 微秒

因此,在STM32F103上,当CYCCNT寄存器的数值为5000时,大约对应69.45微秒的时间。

请注意,这是一个近似计算,实际的结果可能会受微控制器的精度和浮点数运算误差的影响。如果需要更精确的时间测量,建议使用定时器来测量较长的时间间隔,或者结合其他外部时钟源进行更精确的时间测量。

二、硬件方法:

1:在测量起始点,反转电平
2:在测量结束点,再次反转电平

使用示波器查看间隔时间。如果时间过短只有几微秒的情况下不建议使用。ms级别应该没问题。

三、软件方法:

这里用到的开发环境是IAR

1、在测量起始点和测量结束点设置断点

2、进入调试模式,点击工具栏ST-Link→Data Log Summary→弹出的窗口右键Enable。

3、运行程序到达测量起始点,会显示运行时间,再全速运行至结束点,时间差即为测量出的运行时间。

没有验证过精度,要求不高的可以使用这种方法。

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值