嗨,对话框中,我需要在应用程序执行的任何时刻读取时钟滴答声。我的应用程序涉及到GAP角色切换,因此我从API获得的时钟时间lld_evt_time_get ()重置每次我发出GAPM_RESET_CMD.还有其他的来源来读取时钟滴答声吗?
谢谢提前
嗨wisilica,
不,没有其他寄存器保持计数,你正在读取的是主基本时间参考计数器,它在你重置堆栈后重置。
由于MT_dialog
ARM Cortex-M0: Systick,一个递增的24位硬件计数器,假设它正在运行。如果您停止了Systick,只需重新启动它,尽管注意其他功能可能依赖于Systick,所以我强烈建议永远不要停止或更改当前的重新加载值。有了这些知识,试试下面的方法:# include“systick.h”蜱现在= systick_value();
# include“systick.h”蜱现在= systick_value();
这些是细节,它们已经在代码中:/** \brief结构类型访问系统计时器(SysTick)。*/类型定义结构体{__IO uint32_t CTRL;/*!< Offset: 0x000 (R/W) SysTick Control and Status Register */的偏移量__IO uint32_t负载;/*!< Offset: 0x004 (R/W) SysTick Reload Value Register */的值__IO uint32_t VAL;/*!< Offset: 0x008 (R/W) SysTick当前值寄存器*/__I uint32_t CALIB;/*!< Offset: 0x00C (R/) SysTick校准寄存器*/} SysTick_Type;
/** \brief结构类型访问系统计时器(SysTick)。*/类型定义结构体{__IO uint32_t CTRL;/*!< Offset: 0x000 (R/W) SysTick Control and Status Register */的偏移量__IO uint32_t负载;/*!< Offset: 0x004 (R/W) SysTick Reload Value Register */的值__IO uint32_t VAL;/*!< Offset: 0x008 (R/W) SysTick当前值寄存器*/__I uint32_t CALIB;/*!< Offset: 0x00C (R/) SysTick校准寄存器*/} SysTick_Type;
/* Cortex-M0硬件的内存映射*/#define SCS_BASE (0xE000E000UL) /*!<系统控制空间基地地址*/#define SysTick_BASE (SCS_BASE + 0x0010UL) /*!< SysTick基地地址*/#define NVIC_BASE (SCS_BASE + 0x0100UL) /*!< NVIC基地地址*/#define SCB_BASE (SCS_BASE + 0x0D00UL) /*!<系统控制块基地地址*/
#define SCB ((SCB_Type *) SCB_BASE) /*!< SCB配置结构*/#define SysTick ((SysTick_Type *) SysTick_BASE) /*!< SysTick配置结构体*/#define NVIC ((NVIC_Type *) NVIC_BASE) /*!< NVIC配置结构体*/除非你知道副作用,否则不要这样做:SysTick - > VAL = 0;/*加载SysTick计数器值*//******************************************************************************************* @brief用于读取定时器的当前值** @param[在]无效*返回计时器的当前值*****************************************************************************************/uint32_t systick_value(空白){返回GetBits32 (&SysTick - > VAL SysTick_VAL_CURRENT_Msk);}如果Systick不运行…/******************************************************************************************* @brief启动SysTick定时器** @param[in] usec倒计时持续时间* @param[in] exception设置为TRUE,当计时器倒计时时产生一个异常*到0,FALSE不到** @return无效*****************************************************************************************/无效systick_start(uint32_t usec, uint8_t exception){SetBits32 (&SysTick - > CTRL SysTick_CTRL_ENABLE_Msk 0);/ /禁用systickSetBits32 (&SysTick - >加载、SysTick_LOAD_RELOAD_Msk usec-1);//设置systick timeout based on 1MHz clockSetBits32 (&SysTick - > VAL SysTick_VAL_CURRENT_Msk 0);//清除当前值寄存器和COUNTFLAG为0SetBits32 (&SysTick - > CTRL, SysTick_CTRL_TICKINT_Msk除外);//生成或不生成SysTick异常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[在]无效*返回计时器的当前值*****************************************************************************************/uint32_t systick_value(空白){返回GetBits32 (&SysTick - > VAL SysTick_VAL_CURRENT_Msk);}
/******************************************************************************************* @brief启动SysTick定时器** @param[in] usec倒计时持续时间* @param[in] exception设置为TRUE,当计时器倒计时时产生一个异常*到0,FALSE不到** @return无效*****************************************************************************************/无效systick_start(uint32_t usec, uint8_t exception){SetBits32 (&SysTick - > CTRL SysTick_CTRL_ENABLE_Msk 0);/ /禁用systickSetBits32 (&SysTick - >加载、SysTick_LOAD_RELOAD_Msk usec-1);//设置systick timeout based on 1MHz clockSetBits32 (&SysTick - > VAL SysTick_VAL_CURRENT_Msk 0);//清除当前值寄存器和COUNTFLAG为0SetBits32 (&SysTick - > CTRL, SysTick_CTRL_TICKINT_Msk除外);//生成或不生成SysTick异常SetBits32 (&SysTick - > CTRL SysTick_CTRL_CLKSOURCE_Msk 0);//使用1 MHz的参考时钟频率SetBits32 (&SysTick - > CTRL SysTick_CTRL_ENABLE_Msk 1);/ /启用systick}
你好,
如果设备处于睡眠模式,系统杆就不会运行,最终你将无法计算自己睡眠的时间。这只是ARM处理器提供的一个额外的计数器,你将无法获得设备的操作时间。
确实如此,这是一个指出睡眠问题的好主意。然而,我们不使用sleep,而系统棒的最大优势是它不会被作为硬件计数器的中断所中断。也许这不适用于最初的查询。
嗨wisilica,
不,没有其他寄存器保持计数,你正在读取的是主基本时间参考计数器,它在你重置堆栈后重置。
由于MT_dialog
ARM Cortex-M0: Systick,一个递增的24位硬件计数器,假设它正在运行。如果您停止了Systick,只需重新启动它,尽管注意其他功能可能依赖于Systick,所以我强烈建议永远不要停止或更改当前的重新加载值。
有了这些知识,试试下面的方法:
# include“systick.h”
蜱现在= systick_value();
这些是细节,它们已经在代码中:
/** \brief结构类型访问系统计时器(SysTick)。
*/
类型定义结构体
{
__IO uint32_t CTRL;/*!< Offset: 0x000 (R/W) SysTick Control and Status Register */的偏移量
__IO uint32_t负载;/*!< Offset: 0x004 (R/W) SysTick Reload Value Register */的值
__IO uint32_t VAL;/*!< Offset: 0x008 (R/W) SysTick当前值寄存器*/
__I uint32_t CALIB;/*!< Offset: 0x00C (R/) SysTick校准寄存器*/
} SysTick_Type;
/* Cortex-M0硬件的内存映射*/
#define SCS_BASE (0xE000E000UL) /*!<系统控制空间基地地址*/
#define SysTick_BASE (SCS_BASE + 0x0010UL) /*!< SysTick基地地址*/
#define NVIC_BASE (SCS_BASE + 0x0100UL) /*!< NVIC基地地址*/
#define SCB_BASE (SCS_BASE + 0x0D00UL) /*!<系统控制块基地地址*/
#define SCB ((SCB_Type *) SCB_BASE) /*!< SCB配置结构*/
#define SysTick ((SysTick_Type *) SysTick_BASE) /*!< SysTick配置结构体*/
#define NVIC ((NVIC_Type *) NVIC_BASE) /*!< NVIC配置结构体*/
除非你知道副作用,否则不要这样做:
SysTick - > VAL = 0;/*加载SysTick计数器值*/
/**
****************************************************************************************
* @brief用于读取定时器的当前值
*
* @param[在]无效
*
返回计时器的当前值
****************************************************************************************
*/
uint32_t systick_value(空白)
{
返回GetBits32 (&SysTick - > VAL SysTick_VAL_CURRENT_Msk);
}
如果Systick不运行…
/**
****************************************************************************************
* @brief启动SysTick定时器
*
* @param[in] usec倒计时持续时间
* @param[in] exception设置为TRUE,当计时器倒计时时产生一个异常
*到0,FALSE不到
*
* @return无效
****************************************************************************************
*/
无效systick_start(uint32_t usec, uint8_t exception)
{
SetBits32 (&SysTick - > CTRL SysTick_CTRL_ENABLE_Msk 0);/ /禁用systick
SetBits32 (&SysTick - >加载、SysTick_LOAD_RELOAD_Msk usec-1);//设置systick timeout based on 1MHz clock
SetBits32 (&SysTick - > VAL SysTick_VAL_CURRENT_Msk 0);//清除当前值寄存器和COUNTFLAG为0
SetBits32 (&SysTick - > CTRL, SysTick_CTRL_TICKINT_Msk除外);//生成或不生成SysTick异常
SetBits32 (&SysTick - > CTRL SysTick_CTRL_CLKSOURCE_Msk 0);//使用1 MHz的参考时钟频率
SetBits32 (&SysTick - > CTRL SysTick_CTRL_ENABLE_Msk 1);/ /启用systick
}
你好,
如果设备处于睡眠模式,系统杆就不会运行,最终你将无法计算自己睡眠的时间。这只是ARM处理器提供的一个额外的计数器,你将无法获得设备的操作时间。
由于MT_dialog
确实如此,这是一个指出睡眠问题的好主意。然而,我们不使用sleep,而系统棒的最大优势是它不会被作为硬件计数器的中断所中断。也许这不适用于最初的查询。