1. 程式人生 > >STM32 -> DWT時間計算

STM32 -> DWT時間計算

基於ARM-M3核心的DWT 資料監測暫存器:

dwt.c檔案

#include "dwt.h"

#define DWT_CR *(uint32_t *)0xE0001000
#define DWT_CYCCNT *(uint32_t *)0xE0001004
#define DEM_CR *(uint32_t *)0xE000EDFC
#define DEM_CR_TRCENA (1 << 24)
#define DWT_CR_CYCCNTENA (1 << 0)

/* 初始化時間戳 */

void CPU_TS_TmrInit(void)

{

/* 使能DWT外設 */

DEM_CR |= (uint32_t)DEM_CR_TRCENA;

/* DWT CYCCNT暫存器計數清0 */

DWT_CYCCNT = (uint32_t)0u;

/* 使能Cortex-M3 DWT CYCCNT暫存器 */

DWT_CR |= (uint32_t)DWT_CR_CYCCNTENA;

} 

uint32_t OS_TS_GET(void)

{
	uint32_t _get_ts;
	
	uint32_t _ts;
	
	static uint32_t _ts_bak;    /* 時間戳備份 */

	_get_ts = DWT_CYCCNT;

	if(_get_ts < _ts_bak)
		{
			/* 做溢位修正 */
			_ts = 0XFFFFFFFF - _ts_bak + _get_ts;
			
			/* 加上上次資料 即可求出本次時間差*/
			_ts = _ts+_ts_bak;
		}
	else
		{
			/* 正常情況 */
			_ts = _get_ts;
		}
		
		_ts_bak = _ts;
		
		return _ts;
} 

dwt.h檔案

#ifndef _DWT_H
#define _DWT_H
#include "stm32f10x.h"

void CPU_TS_TmrInit(void);
uint32_t OS_TS_GET(void);

#endif