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

140 lines
2.9 KiB
C
Raw Normal View History

2025-06-27 00:32:57 +08:00
#include "main.h"
#include "core_delay.h"
2025-07-05 19:47:28 +08:00
//<2F><>ȡϵͳ<CFB5><CDB3>Ƶ
2025-06-27 00:32:57 +08:00
uint32_t GetSysClocksFreq (void)
{
RCC_ClocksTypeDef t={0};
RCC_GetClocksFreq (&t);
return t.SYSCLK_Frequency;
}
/*
**********************************************************************
2025-07-05 19:47:28 +08:00
* ʱ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ؼĴ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
2025-06-27 00:32:57 +08:00
**********************************************************************
*/
/*
2025-07-05 19:47:28 +08:00
<EFBFBD><EFBFBD>Cortex-M <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>DWT(Data Watchpoint and Trace)<EFBFBD><EFBFBD>
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD><EFBFBD>32 λ<EFBFBD>ļĴ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>CYCCNT<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ϵļ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
<EFBFBD><EFBFBD>¼<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ں<EFBFBD>ʱ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>еĸ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ܼ<EFBFBD>¼<EFBFBD><EFBFBD>ʱ<EFBFBD><EFBFBD>Ϊ<EFBFBD><EFBFBD>
10.74s=2 <EFBFBD><EFBFBD>32 <EFBFBD>η<EFBFBD>/400000000
(<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ں<EFBFBD>Ƶ<EFBFBD><EFBFBD>Ϊ400M<EFBFBD><EFBFBD><EFBFBD>ں<EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD>ε<EFBFBD>ʱ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϊ1/400M=2.5ns)
<EFBFBD><EFBFBD>CYCCNT <EFBFBD><EFBFBD><EFBFBD><EFBFBD>֮<EFBFBD>󣬻<EFBFBD><EFBFBD><EFBFBD>0 <EFBFBD><EFBFBD><EFBFBD>¿<EFBFBD>ʼ<EFBFBD><EFBFBD><EFBFBD>ϼ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
ʹ<EFBFBD><EFBFBD>CYCCNT <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>IJ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
1<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʹ<EFBFBD><EFBFBD>DWT <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ں˵<EFBFBD><EFBFBD>ԼĴ<EFBFBD><EFBFBD><EFBFBD>DEMCR <EFBFBD><EFBFBD>λ24 <EFBFBD><EFBFBD><EFBFBD>ƣ<EFBFBD>д1 ʹ<EFBFBD><EFBFBD>
2<EFBFBD><EFBFBD>ʹ<EFBFBD><EFBFBD>CYCCNT <EFBFBD>Ĵ<EFBFBD><EFBFBD><EFBFBD>֮ǰ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>0
3<EFBFBD><EFBFBD>ʹ<EFBFBD><EFBFBD>CYCCNT <EFBFBD>Ĵ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>DWT_CTRL(<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϻ<EFBFBD><EFBFBD>ΪDWT_CR)<EFBFBD><EFBFBD>λ0 <EFBFBD><EFBFBD><EFBFBD>ƣ<EFBFBD>д1 ʹ<EFBFBD><EFBFBD>
2025-06-27 00:32:57 +08:00
*/
#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)
/**
2025-07-05 19:47:28 +08:00
* @brief <EFBFBD><EFBFBD>ʼ<EFBFBD><EFBFBD>ʱ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
* @param <EFBFBD><EFBFBD>
* @retval <EFBFBD><EFBFBD>
* @note ʹ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ǰ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ñ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
2025-06-27 00:32:57 +08:00
*/
HAL_StatusTypeDef HAL_InitTick(uint32_t TickPriority)
{
2025-07-05 19:47:28 +08:00
/* ʹ<><CAB9>DWT <20><><EFBFBD><EFBFBD> */
2025-06-27 00:32:57 +08:00
DEM_CR |= (uint32_t)DEM_CR_TRCENA;
2025-07-05 19:47:28 +08:00
/* DWT CYCCNT <20>Ĵ<EFBFBD><C4B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>0 */
2025-06-27 00:32:57 +08:00
DWT_CYCCNT = (uint32_t)0u;
2025-07-05 19:47:28 +08:00
/* ʹ<><CAB9>Cortex-M DWT CYCCNT <20>Ĵ<EFBFBD><C4B4><EFBFBD> */
2025-06-27 00:32:57 +08:00
DWT_CR |= (uint32_t)DWT_CR_CYCCNTENA;
return HAL_OK;
}
/**
2025-07-05 19:47:28 +08:00
* @brief <EFBFBD><EFBFBD>ȡ<EFBFBD><EFBFBD>ǰʱ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
* @param <EFBFBD><EFBFBD>
* @retval <EFBFBD><EFBFBD>ǰʱ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>DWT_CYCCNT <EFBFBD>Ĵ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵ
2025-06-27 00:32:57 +08:00
*/
uint32_t CPU_TS_TmrRd(void)
{
return ((uint32_t)DWT_CYCCNT);
}
/**
2025-07-05 19:47:28 +08:00
* @brief <EFBFBD><EFBFBD>ȡ<EFBFBD><EFBFBD>ǰʱ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
* @param <EFBFBD><EFBFBD>
* @retval <EFBFBD><EFBFBD>ǰʱ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>DWT_CYCCNT <EFBFBD>Ĵ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵ
2025-06-27 00:32:57 +08:00
*/
uint32_t HAL_GetTick(void)
{
return ((uint32_t)DWT_CYCCNT*1000/SysClockFreq);
}
/**
2025-07-05 19:47:28 +08:00
* @brief <EFBFBD><EFBFBD><EFBFBD><EFBFBD>CPU <EFBFBD><EFBFBD><EFBFBD>ڲ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʵ<EFBFBD>־<EFBFBD>ȷ<EFBFBD><EFBFBD>ʱ<EFBFBD><EFBFBD>32 λ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
* @param us : <EFBFBD>ӳٳ<EFBFBD><EFBFBD>ȣ<EFBFBD><EFBFBD><EFBFBD>λ1 us
* @retval <EFBFBD><EFBFBD>
* @note ʹ<EFBFBD>ñ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ǰ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ȵ<EFBFBD><EFBFBD><EFBFBD>CPU_TS_TmrInit <EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʹ<EFBFBD>ܼ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
* <EFBFBD><EFBFBD>ʹ<EFBFBD>ܺ<EFBFBD>CPU_TS_INIT_IN_DELAY_FUNCTION
*<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱֵΪ8 <EFBFBD><EFBFBD><EFBFBD>8*1000*1000
2025-06-27 00:32:57 +08:00
*/
void CPU_TS_Tmr_Delay_US(uint32_t us)
{
uint32_t ticks;
uint32_t told, tnow, tcnt=0;
2025-07-05 19:47:28 +08:00
/* <20>ں<EFBFBD><DABA><EFBFBD><EFBFBD>ڲ<EFBFBD><DAB2><EFBFBD>ʼ<EFBFBD><CABC>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD><EFBFBD>Ĵ<EFBFBD><C4B4><EFBFBD><EFBFBD><EFBFBD> */
2025-06-27 00:32:57 +08:00
#if (CPU_TS_INIT_IN_DELAY_FUNCTION)
2025-07-05 19:47:28 +08:00
/* <20><>ʼ<EFBFBD><CABC>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> */
2025-06-27 00:32:57 +08:00
HAL_InitTick(5);
#endif
2025-07-05 19:47:28 +08:00
ticks = us * (GET_CPU_ClkFreq() / 1000000); /* <20><>Ҫ<EFBFBD>Ľ<EFBFBD><C4BD><EFBFBD><EFBFBD><EFBFBD> */
2025-06-27 00:32:57 +08:00
tcnt = 0;
2025-07-05 19:47:28 +08:00
told = (uint32_t)CPU_TS_TmrRd(); /* <20>ս<EFBFBD><D5BD><EFBFBD>ʱ<EFBFBD>ļ<EFBFBD><C4BC><EFBFBD><EFBFBD><EFBFBD>ֵ */
2025-06-27 00:32:57 +08:00
while (1)
{
tnow = (uint32_t)CPU_TS_TmrRd();
if (tnow != told)
{
2025-07-05 19:47:28 +08:00
/* 32 λ<><CEBB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ǵ<EFBFBD><C7B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> */
2025-06-27 00:32:57 +08:00
if (tnow > told)
{
tcnt += tnow - told;
}
2025-07-05 19:47:28 +08:00
/* <20><><EFBFBD><EFBFBD>װ<EFBFBD><D7B0> */
2025-06-27 00:32:57 +08:00
else
{
tcnt += UINT32_MAX - told + tnow;
}
told = tnow;
2025-07-05 19:47:28 +08:00
/*ʱ<><EFBFBD><E4B3AC>/<2F><><EFBFBD><EFBFBD>Ҫ<EFBFBD>ӳٵ<D3B3>ʱ<EFBFBD><CAB1>,<2C><><EFBFBD>˳<EFBFBD> */
2025-06-27 00:32:57 +08:00
if (tcnt >= ticks)break;
}
}
}
/*****************************END OF FILE**********************/