嗨,对话框中,我需要在应用程序执行的任何点读取时钟滴答声。我的应用程序涉及GAP角色切换,因此需要从API获取时钟时间lld_evt_time_get ()重置,每次我发出GAPM_RESET_CMD.是否有其他来源来读取时钟滴答声?
谢谢提前
嗨wisilica,
不,没有其他寄存器保持计数,你正在读取的是主基时间引用计数器,在你重置堆栈后重置。
由于MT_dialog
ARM Cortex-M0: Systick,一个递增的24位硬件计数器,假设它正在运行。如果你停止了Systick,重新启动它,尽管注意其他功能可能依赖于Systick,所以我强烈建议永远不要停止或更改当前的重新加载值。有了这些知识,试试以下方法:# include“systick.h”Ticks现在= systick_value();
# include“systick.h”Ticks现在= systick_value();
这些是细节,已经在代码中了:/** \brief访问System Timer (SysTick)的结构类型。*/类型定义结构体{__IO uint32_t CTRL;/*!< Offset: 0x000 (R/W) SysTick Control and Status Register */__IO uint32_t负载;/*!< Offset: 0x004 (R/W) SysTick重载值寄存器*/__IO uint32_t VAL;/*!< Offset: 0x008 (R/W) SysTick当前值寄存器*/__I uint32_t CALIB;/*!< Offset: 0x00C (R/) SysTick校准寄存器*/} SysTick_Type;
/** \brief访问System Timer (SysTick)的结构类型。*/类型定义结构体{__IO uint32_t CTRL;/*!< Offset: 0x000 (R/W) SysTick Control and Status Register */__IO uint32_t负载;/*!< Offset: 0x004 (R/W) SysTick重载值寄存器*/__IO uint32_t VAL;/*!< Offset: 0x008 (R/W) SysTick当前值寄存器*/__I uint32_t CALIB;/*!< Offset: 0x00C (R/) SysTick校准寄存器*/} SysTick_Type;
/* Memory mapping of Cortex-M0 Hardware */#define SCS_BASE (0xE000E000UL) /*!<系统控制空间基地地址*/#define SysTick_BASE (SCS_BASE + 0x0010UL) /*!< SysTick Base Address */#define NVIC_BASE (SCS_BASE + 0x0100UL) /*!< NVIC Base Address */#define SCB_BASE (SCS_BASE + 0x0D00UL) /*!< System Control Block Base Address */
#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无效*****************************************************************************************/Void systick_start(uint32_t usec, uint8_t exception){SetBits32 (&SysTick - > CTRL SysTick_CTRL_ENABLE_Msk 0);/ /禁用systickSetBits32 (&SysTick - >加载、SysTick_LOAD_RELOAD_Msk usec-1);//设置基于1MHz时钟的systick超时SetBits32 (&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无效*****************************************************************************************/Void systick_start(uint32_t usec, uint8_t exception){SetBits32 (&SysTick - > CTRL SysTick_CTRL_ENABLE_Msk 0);/ /禁用systickSetBits32 (&SysTick - >加载、SysTick_LOAD_RELOAD_Msk usec-1);//设置基于1MHz时钟的systick超时SetBits32 (&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, systick的最大优点是它不会被中断中断作为硬件计数器。也许这对原始查询不合适。
嗨wisilica,
不,没有其他寄存器保持计数,你正在读取的是主基时间引用计数器,在你重置堆栈后重置。
由于MT_dialog
ARM Cortex-M0: Systick,一个递增的24位硬件计数器,假设它正在运行。如果你停止了Systick,重新启动它,尽管注意其他功能可能依赖于Systick,所以我强烈建议永远不要停止或更改当前的重新加载值。
有了这些知识,试试以下方法:
# include“systick.h”
Ticks现在= systick_value();
这些是细节,已经在代码中了:
/** \brief访问System Timer (SysTick)的结构类型。
*/
类型定义结构体
{
__IO uint32_t CTRL;/*!< Offset: 0x000 (R/W) SysTick Control and Status Register */
__IO uint32_t负载;/*!< Offset: 0x004 (R/W) SysTick重载值寄存器*/
__IO uint32_t VAL;/*!< Offset: 0x008 (R/W) SysTick当前值寄存器*/
__I uint32_t CALIB;/*!< Offset: 0x00C (R/) SysTick校准寄存器*/
} SysTick_Type;
/* Memory mapping of Cortex-M0 Hardware */
#define SCS_BASE (0xE000E000UL) /*!<系统控制空间基地地址*/
#define SysTick_BASE (SCS_BASE + 0x0010UL) /*!< SysTick Base Address */
#define NVIC_BASE (SCS_BASE + 0x0100UL) /*!< NVIC Base Address */
#define SCB_BASE (SCS_BASE + 0x0D00UL) /*!< System Control Block Base Address */
#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无效
****************************************************************************************
*/
Void 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);//设置基于1MHz时钟的systick超时
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, systick的最大优点是它不会被中断中断作为硬件计数器。也许这对原始查询不合适。