ת»»Ϊgb2312±àÂë
This commit is contained in:
@@ -6,7 +6,7 @@
|
||||
|
||||
|
||||
|
||||
//获取系统主频
|
||||
//<EFBFBD><EFBFBD>ȡϵͳ<EFBFBD><EFBFBD>Ƶ
|
||||
uint32_t GetSysClocksFreq (void)
|
||||
{
|
||||
RCC_ClocksTypeDef t={0};
|
||||
@@ -26,20 +26,20 @@ uint32_t GetSysClocksFreq (void)
|
||||
|
||||
/*
|
||||
**********************************************************************
|
||||
* 时间戳相关寄存器定义
|
||||
* ʱ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ؼĴ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
**********************************************************************
|
||||
*/
|
||||
/*
|
||||
在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 使能
|
||||
<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 λ<>ļĴ<C4BC><C4B4><EFBFBD><EFBFBD><EFBFBD>CYCCNT<4E><54><EFBFBD><EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD><D2BB><EFBFBD><EFBFBD><EFBFBD>ϵļ<CFB5><C4BC><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 <20><><EFBFBD>¿<EFBFBD>ʼ<EFBFBD><CABC><EFBFBD>ϼ<EFBFBD><CFBC><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 <20><><EFBFBD>裬<EFBFBD><E8A3AC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ں˵<DABA><CBB5>ԼĴ<D4BC><C4B4><EFBFBD>DEMCR <20><>λ24 <20><><EFBFBD>ƣ<EFBFBD>д1 ʹ<><CAB9>
|
||||
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(<28><><EFBFBD><EFBFBD><EFBFBD>Ϻ궨<CFBA><EAB6A8>ΪDWT_CR)<29><>λ0 <20><><EFBFBD>ƣ<EFBFBD>д1 ʹ<><CAB9>
|
||||
*/
|
||||
|
||||
|
||||
@@ -50,29 +50,29 @@ uint32_t GetSysClocksFreq (void)
|
||||
#define DEM_CR_TRCENA (1 << 24)
|
||||
#define DWT_CR_CYCCNTENA (1 << 0)
|
||||
/**
|
||||
* @brief 初始化时间戳
|
||||
* @param 无
|
||||
* @retval 无
|
||||
* @note 使用延时函数前,必须调用本函数
|
||||
* @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>
|
||||
*/
|
||||
HAL_StatusTypeDef HAL_InitTick(uint32_t TickPriority)
|
||||
{
|
||||
/* 使能DWT 外设 */
|
||||
/* ʹ<EFBFBD><EFBFBD>DWT <EFBFBD><EFBFBD><EFBFBD><EFBFBD> */
|
||||
DEM_CR |= (uint32_t)DEM_CR_TRCENA;
|
||||
|
||||
/* DWT CYCCNT 寄存器计数清0 */
|
||||
/* DWT CYCCNT <EFBFBD>Ĵ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>0 */
|
||||
DWT_CYCCNT = (uint32_t)0u;
|
||||
|
||||
/* 使能Cortex-M DWT CYCCNT 寄存器 */
|
||||
/* ʹ<EFBFBD><EFBFBD>Cortex-M DWT CYCCNT <EFBFBD>Ĵ<EFBFBD><EFBFBD><EFBFBD> */
|
||||
DWT_CR |= (uint32_t)DWT_CR_CYCCNTENA;
|
||||
|
||||
return HAL_OK;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief 读取当前时间戳
|
||||
* @param 无
|
||||
* @retval 当前时间戳,即DWT_CYCCNT 寄存器的值
|
||||
* @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>ֵ
|
||||
*/
|
||||
uint32_t CPU_TS_TmrRd(void)
|
||||
{
|
||||
@@ -80,9 +80,9 @@ uint32_t CPU_TS_TmrRd(void)
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief 读取当前时间戳
|
||||
* @param 无
|
||||
* @retval 当前时间戳,即DWT_CYCCNT 寄存器的值
|
||||
* @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>ֵ
|
||||
*/
|
||||
uint32_t HAL_GetTick(void)
|
||||
{
|
||||
@@ -90,39 +90,39 @@ uint32_t HAL_GetTick(void)
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief 采用CPU 的内部计数实现精确延时,32 位计数器
|
||||
* @param us : 延迟长度,单位1 us
|
||||
* @retval 无
|
||||
* @note 使用本函数前必须先调用CPU_TS_TmrInit 函数使能计数器,
|
||||
* 或使能宏CPU_TS_INIT_IN_DELAY_FUNCTION
|
||||
*最大延时值为8 秒,即8*1000*1000
|
||||
* @brief <EFBFBD><EFBFBD><EFBFBD><EFBFBD>CPU <20><><EFBFBD>ڲ<EFBFBD><DAB2><EFBFBD><EFBFBD><EFBFBD>ʵ<EFBFBD>־<EFBFBD>ȷ<EFBFBD><C8B7>ʱ<EFBFBD><CAB1>32 λ<><CEBB><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 <20>룬<EFBFBD><EBA3AC>8*1000*1000
|
||||
*/
|
||||
void CPU_TS_Tmr_Delay_US(uint32_t us)
|
||||
{
|
||||
uint32_t ticks;
|
||||
uint32_t told, tnow, tcnt=0;
|
||||
|
||||
/* 在函数内部初始化时间戳寄存器, */
|
||||
/* <EFBFBD>ں<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ڲ<EFBFBD><EFBFBD><EFBFBD>ʼ<EFBFBD><EFBFBD>ʱ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ĵ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> */
|
||||
#if (CPU_TS_INIT_IN_DELAY_FUNCTION)
|
||||
/* 初始化时间戳并清零 */
|
||||
/* <EFBFBD><EFBFBD>ʼ<EFBFBD><EFBFBD>ʱ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> */
|
||||
HAL_InitTick(5);
|
||||
#endif
|
||||
|
||||
ticks = us * (GET_CPU_ClkFreq() / 1000000); /* 需要的节拍数 */
|
||||
ticks = us * (GET_CPU_ClkFreq() / 1000000); /* <EFBFBD><EFBFBD>Ҫ<EFBFBD>Ľ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> */
|
||||
tcnt = 0;
|
||||
told = (uint32_t)CPU_TS_TmrRd(); /* 刚进入时的计数器值 */
|
||||
told = (uint32_t)CPU_TS_TmrRd(); /* <EFBFBD>ս<EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD>ļ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵ */
|
||||
|
||||
while (1)
|
||||
{
|
||||
tnow = (uint32_t)CPU_TS_TmrRd();
|
||||
if (tnow != told)
|
||||
{
|
||||
/* 32 位计数器是递增计数器 */
|
||||
/* 32 λ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ǵ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> */
|
||||
if (tnow > told)
|
||||
{
|
||||
tcnt += tnow - told;
|
||||
}
|
||||
/* 重新装载 */
|
||||
/* <EFBFBD><EFBFBD><EFBFBD><EFBFBD>װ<EFBFBD><EFBFBD> */
|
||||
else
|
||||
{
|
||||
tcnt += UINT32_MAX - told + tnow;
|
||||
@@ -130,7 +130,7 @@ void CPU_TS_Tmr_Delay_US(uint32_t us)
|
||||
|
||||
told = tnow;
|
||||
|
||||
/*时间超过/等于要延迟的时间,则退出 */
|
||||
/*ʱ<EFBFBD>䳬<EFBFBD><EFBFBD>/<2F><><EFBFBD><EFBFBD>Ҫ<EFBFBD>ӳٵ<D3B3>ʱ<EFBFBD><CAB1>,<2C><><EFBFBD>˳<EFBFBD> */
|
||||
if (tcnt >= ticks)break;
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user