STM32F4 DWT功能 实现程序运行时间精确测试

文章介绍了如何在Cortex-M微控制器中使用DWT的数据观察点和跟踪功能,特别是CYCCNT寄存器来获取内核时钟周期数,从而实现高精度的时间戳和延迟测量。通过对DEM_CR和DWT_CR寄存器的配置,可以启用CYCCNT并进行计数。测试结果显示,这种方法可以用于测量毫秒和微秒级别的延迟。

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

时间戳相关寄存器定义
/*
在Cortex-M里面有一个外设叫DWT(Data Watchpoint and Trace),
该外设有一个32位的寄存器叫CYCCNT,它是一个向上的计数器,
记录的是内核时钟运行的个数,最长能记录的时间为:
10.74s=2的32次方/400000000
(假设内核频率为400M,内核跳一次的时间大概为1/400M=2.5ns)
当CYCCNT溢出之后,会清0重新开始向上计数。
使能CYCCNT计数的操作步骤:
1、先使能DWT外设,这个由另外内核调试寄存器DEMCR的位24控制,写1使能
2、使能CYCCNT寄存器之前,先清0
3、使能CYCCNT寄存器,这个由DWT_CTRL(代码上宏定义为DWT_CR)的位0控制,写1使能
*/

#define  DWT_CR      *(__IO uint32_t *)0xE0001000
#define  DWT_CYCCNT  *(__IO uint32_t *)0xE0001004
#define  DEM_CR      *(__IO uint32_t *)0xE000EDFC


#define  DEM_CR_TRCENA                   (1 << 24)
#define  DWT_CR_CYCCNTENA                (1 <<  0)

//初始化时间戳
void HAL_InitTick()
{
    /* 使能DWT外设 */
    DEM_CR |= (uint32_t)DEM_CR_TRCENA;                

    /* DWT CYCCNT寄存器计数清0 */
    DWT_CYCCNT = (uint32_t)0u;

    /* 使能Cortex-M DWT CYCCNT寄存器 */
    DWT_CR |= (uint32_t)DWT_CR_CYCCNTENA;
}

/**
  * @brief  读取当前时间戳
  * @param  无
  * @retval 当前时间戳,即DWT_CYCCNT寄存器的值
  */
uint32_t CPU_TS_TmrRd(void)
{        
  return ((uint32_t)DWT_CYCCNT);
}

测试:

STM32F407 168M

HAL_InitTick();
delay_ms(1);
uint32_t time_= CPU_TS_TmrRd();//168260

HAL_InitTick();
delay_ms(2);
time_= CPU_TS_TmrRd();//336258

HAL_InitTick();
delay_us(100);
time_= CPU_TS_TmrRd();//16964

HAL_InitTick();
delay_us(200);
time_= CPU_TS_TmrRd();//33816

HAL_InitTick();
delay_us(300);
time_= CPU_TS_TmrRd();//50576

//延时100us 计数值大概16800

参考链接:
https://segmentfault.com/a/1190000020712516

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值