Files
player/Project/Src/rt-thread/core_delay.c

140 lines
3.3 KiB
C
Raw Normal View History

2025-06-27 00:32:57 +08:00
#include "main.h"
#include "core_delay.h"
//获取系统主频
uint32_t GetSysClocksFreq (void)
{
RCC_ClocksTypeDef t={0};
RCC_GetClocksFreq (&t);
return t.SYSCLK_Frequency;
}
/*
**********************************************************************
*
**********************************************************************
*/
/*
Cortex-M DWT(Data Watchpoint and Trace)
32 CYCCNT
10.74s=2 32 /400000000
(400M1/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)
/**
* @brief
* @param
* @retval
* @note 使
*/
HAL_StatusTypeDef HAL_InitTick(uint32_t TickPriority)
{
/* 使能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;
return HAL_OK;
}
/**
* @brief
* @param
* @retval DWT_CYCCNT
*/
uint32_t CPU_TS_TmrRd(void)
{
return ((uint32_t)DWT_CYCCNT);
}
/**
* @brief
* @param
* @retval DWT_CYCCNT
*/
uint32_t HAL_GetTick(void)
{
return ((uint32_t)DWT_CYCCNT*1000/SysClockFreq);
}
/**
* @brief CPU 32
* @param us : 1 us
* @retval
* @note 使CPU_TS_TmrInit 使
* 使CPU_TS_INIT_IN_DELAY_FUNCTION
*8 8*1000*1000
*/
void CPU_TS_Tmr_Delay_US(uint32_t us)
{
uint32_t ticks;
uint32_t told, tnow, tcnt=0;
/* 在函数内部初始化时间戳寄存器, */
#if (CPU_TS_INIT_IN_DELAY_FUNCTION)
/* 初始化时间戳并清零 */
HAL_InitTick(5);
#endif
ticks = us * (GET_CPU_ClkFreq() / 1000000); /* 需要的节拍数 */
tcnt = 0;
told = (uint32_t)CPU_TS_TmrRd(); /* 刚进入时的计数器值 */
while (1)
{
tnow = (uint32_t)CPU_TS_TmrRd();
if (tnow != told)
{
/* 32 位计数器是递增计数器 */
if (tnow > told)
{
tcnt += tnow - told;
}
/* 重新装载 */
else
{
tcnt += UINT32_MAX - told + tnow;
}
told = tnow;
/*时间超过/等于要延迟的时间,则退出 */
if (tcnt >= ticks)break;
}
}
}
/*****************************END OF FILE**********************/