嗨对话,我需要在执行应用程序的任何执行点上阅读时钟滴答。我的应用程序涉及差距角色切换,因此我从API获得的时钟时间lld_evt_time_get()每次发布A时重置gapm_reset_cmd。还有其他来源可以阅读时钟刻度吗?
提前致谢
嗨,Wisilica,
不,没有其他寄存器继续计数,您正在阅读的是主要的基本时间参考计数器,它重置堆栈后重置。
谢谢mt_dialog
ARM Cortex-M0:Systick,假设它正在运行,则是一个增量的24位硬件计数器。如果您停止Systick,请重新开始,尽管当心其他功能可能取决于Systick,因此我强烈建议您不要停止或实际上更改当前的重载值。有了这些知识,请尝试以下内容:#include“ systick.h”tick现在= systick_value();
#include“ systick.h”tick现在= systick_value();
这些是代码中已经存在的详细信息:/** \简短结构类型访问系统计时器(Systick)。*/Typedef结构{__IO UINT32_T CTRL;/ *!__IO UINT32_T加载;/ *!__IO UINT32_T VAL;/ *!__i uint32_t calib;/ *!<偏移:0x00C(R/)Systick校准寄存器 */} systick_type;
/** \简短结构类型访问系统计时器(Systick)。*/Typedef结构{__IO UINT32_T CTRL;/ *!__IO UINT32_T加载;/ *!__IO UINT32_T VAL;/ *!__i uint32_t calib;/ *!<偏移:0x00C(R/)Systick校准寄存器 */} systick_type;
/ * Cortex-M0硬件的内存映射 */#define scs_base(0xe000e000uul) / *!<系统控制空间基础地址 * /#define systick_base(scs_base + 0x0010ul) / *!#define nvic_base(scs_base + 0x0100uul) / *!#define scb_base(scs_base + 0x0d00ul) / *!<系统控制块基础地址 * /
#define scb(((scb_type *)scb_base) / *!#Define Systick((Systick_Type *)systick_base) / *!#define nvic((nvic_type *)nvic_base) / *!除非您知道侧面影响:Systick-> Val = 0;/ *加载Systick计数器值 *//********************************************************************************************************** @brief函数读取计时器的当前值** @param [in] void** @return计时器的当前值********************************************************************************************************/uint32_t systick_value(void){返回getBits32(&systick-> val,systick_val_current_msk);}如果Systick不运行。/********************************************************************************************************** @brief函数启动Systick Timer** @param [in] usec倒计时的持续时间* @param [in]异常设置为true以生成异常,当计时器计算下*到0,错误不** @return void********************************************************************************************************/void systick_start(uint32_t usec,uint8_t异常){setBits32(&systick-> ctrl,systick_ctrl_enable_msk,0);//禁用SysticksetBits32(&systick-> load,systick_load_reload_msk,usec-1);//基于1MHz时钟设置Systick TimeoutsetBits32(&systick-> val,systick_val_current_msk,0);//清除当前值寄存器和计数FLAG为0setBits32(&systick-> ctrl,systick_ctrl_tickint_msk,异常);//生成或不生成系统异常setBits32(&systick-> ctrl,systick_ctrl_clksource_msk,0);//使用1 MHz的参考时钟频率setBits32(&systick-> ctrl,systick_ctrl_enable_msk,1);//启用Systick}
Systick-> Val = 0;/ *加载Systick计数器值 */
/********************************************************************************************************** @brief函数读取计时器的当前值** @param [in] void** @return计时器的当前值********************************************************************************************************/uint32_t systick_value(void){返回getBits32(&systick-> val,systick_val_current_msk);}
/********************************************************************************************************** @brief函数启动Systick Timer** @param [in] usec倒计时的持续时间* @param [in]异常设置为true以生成异常,当计时器计算下*到0,错误不** @return void********************************************************************************************************/void systick_start(uint32_t usec,uint8_t异常){setBits32(&systick-> ctrl,systick_ctrl_enable_msk,0);//禁用SysticksetBits32(&systick-> load,systick_load_reload_msk,usec-1);//基于1MHz时钟设置Systick TimeoutsetBits32(&systick-> val,systick_val_current_msk,0);//清除当前值寄存器和计数FLAG为0setBits32(&systick-> ctrl,systick_ctrl_tickint_msk,异常);//生成或不生成系统异常setBits32(&systick-> ctrl,systick_ctrl_clksource_msk,0);//使用1 MHz的参考时钟频率setBits32(&systick-> ctrl,systick_ctrl_enable_msk,1);//启用Systick}
你好,
如果设备处于睡眠模式,则系统不会运行,最终您将无法计算您睡觉的时间。它只是ARM处理器提供的附加计数器,您将无法获得设备的运行时间。
相当,可以指出睡眠问题的一个好主意。但是,我们没有使用睡眠,而Systick的最大优势在于,它不会因中断是硬件计数器而破坏。也许这不适合原始查询。
嗨,Wisilica,
不,没有其他寄存器继续计数,您正在阅读的是主要的基本时间参考计数器,它重置堆栈后重置。
谢谢mt_dialog
ARM Cortex-M0:Systick,假设它正在运行,则是一个增量的24位硬件计数器。如果您停止Systick,请重新开始,尽管当心其他功能可能取决于Systick,因此我强烈建议您不要停止或实际上更改当前的重载值。
有了这些知识,请尝试以下内容:
#include“ systick.h”
tick现在= systick_value();
这些是代码中已经存在的详细信息:
/** \简短结构类型访问系统计时器(Systick)。__IO UINT32_T加载;/ *!__IO UINT32_T VAL;/ *!__i uint32_t calib;/ *!<偏移:0x00C(R/)Systick校准寄存器 */
*/
Typedef结构
{
__IO UINT32_T CTRL;/ *!
} systick_type;
/ * Cortex-M0硬件的内存映射 */#define nvic_base(scs_base + 0x0100uul) / *!#define scb_base(scs_base + 0x0d00ul) / *!<系统控制块基础地址 * /
#define scs_base(0xe000e000uul) / *!<系统控制空间基础地址 * /
#define systick_base(scs_base + 0x0010ul) / *!
#define scb(((scb_type *)scb_base) / *!#Define Systick((Systick_Type *)systick_base) / *!#define nvic((nvic_type *)nvic_base) / *!除非您知道侧面影响:
Systick-> Val = 0;/ *加载Systick计数器值 */
/**
*******************************************************************************************************
* @brief函数读取计时器的当前值
*
* @param [in] void
*
* @return计时器的当前值
*******************************************************************************************************
*/
uint32_t systick_value(void)
{
返回getBits32(&systick-> val,systick_val_current_msk);
}
如果Systick不运行。
/**
*******************************************************************************************************
* @brief函数启动Systick Timer
*
* @param [in] usec倒计时的持续时间
* @param [in]异常设置为true以生成异常,当计时器计算下
*到0,错误不
*
* @return void
*******************************************************************************************************
*/
void systick_start(uint32_t usec,uint8_t异常)
{
setBits32(&systick-> ctrl,systick_ctrl_enable_msk,0);//禁用Systick
setBits32(&systick-> load,systick_load_reload_msk,usec-1);//基于1MHz时钟设置Systick Timeout
setBits32(&systick-> val,systick_val_current_msk,0);//清除当前值寄存器和计数FLAG为0
setBits32(&systick-> ctrl,systick_ctrl_tickint_msk,异常);//生成或不生成系统异常
setBits32(&systick-> ctrl,systick_ctrl_clksource_msk,0);//使用1 MHz的参考时钟频率
setBits32(&systick-> ctrl,systick_ctrl_enable_msk,1);//启用Systick
}
你好,
如果设备处于睡眠模式,则系统不会运行,最终您将无法计算您睡觉的时间。它只是ARM处理器提供的附加计数器,您将无法获得设备的运行时间。
谢谢mt_dialog
相当,可以指出睡眠问题的一个好主意。但是,我们没有使用睡眠,而Systick的最大优势在于,它不会因中断是硬件计数器而破坏。也许这不适合原始查询。