嗨对话框,我需要在任何执行的位置读取时钟滴点。我的应用程序涉及GAP角色切换,因此我从API获得的时钟时间lld_evt_time_get()每次发出a时都会重置gapm_reset_cmd.。是否有其他源来阅读时钟滴答?
提前致谢
嗨Wisilica,
不,没有其他寄存器,保持计数,您正在读取的一个是重置堆栈后重置的主要基础时间参考计数器。
谢谢mt_dialog.
ARM Cortex-M0:Systick,假设它正在运行的递增24位硬件计数器。如果您停止了Systick,请再次启动它虽然要注意其他功能可能取决于Systick,所以我强烈建议永远不会停止或确实更改当前的重新加载值。携带这种知识,试试以下内容:#include“systick.h”蜱虫= systick_value();
#include“systick.h”蜱虫= systick_value();
这些是详细信息,这些详细信息已在代码中:/ ** \简短的结构类型访问系统计时器(Systick)。* /typedef struct.{__IO UINT32_T CTRL;/ *!<偏移:0x000(R / W)Systick控制和状态寄存器* /__IO UINT32_T负载;/ *!<偏移:0x004(R / W)Systick重载值寄存器* /__IO UINT32_T VAL;/ *!<偏移:0x008(R / W)Systick电流值寄存器* /__i uint32_t calib;/ *!<偏移:0x00c(r /)systick校准寄存器* /} systick_type;
/ ** \简短的结构类型访问系统计时器(Systick)。* /typedef struct.{__IO UINT32_T CTRL;/ *!<偏移:0x000(R / W)Systick控制和状态寄存器* /__IO UINT32_T负载;/ *!<偏移:0x004(R / W)Systick重载值寄存器* /__IO UINT32_T VAL;/ *!<偏移:0x008(R / W)Systick电流值寄存器* /__i uint32_t calib;/ *!<偏移:0x00c(r /)systick校准寄存器* /} systick_type;
/ * Cortex-M0硬件的内存映射* /#define scs_base(0xe000e000ul)/ *!<系统控制空间基数地址* /#define systick_base(scs_base + 0x0010ul)/ *!#define nvic_base(scs_base + 0x0100ul)/ *!#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计时器** @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超时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 [in] void** @return计时器的当前值***************************************************************************************** /Uint32_t systick_value(void){返回getbits32(&systick-> val,systick_val_current_msk);}
/ ******************************************************************************************* @brief函数启动systick计时器** @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超时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,最终您将无法计算您睡觉的时间。它只是由ARM处理器提供的额外计数器,您将无法获得设备的运行时间。
相当如此,有一个好主意指出睡眠问题。然而,我们不使用睡眠,并且Systick的巨大优势是它不会被中断是硬件柜台的中断。也许这不适合原始查询。
嗨Wisilica,
不,没有其他寄存器,保持计数,您正在读取的一个是重置堆栈后重置的主要基础时间参考计数器。
谢谢mt_dialog.
ARM Cortex-M0:Systick,假设它正在运行的递增24位硬件计数器。如果您停止了Systick,请再次启动它虽然要注意其他功能可能取决于Systick,所以我强烈建议永远不会停止或确实更改当前的重新加载值。
携带这种知识,试试以下内容:
#include“systick.h”
蜱虫= systick_value();
这些是详细信息,这些详细信息已在代码中:
/ ** \简短的结构类型访问系统计时器(Systick)。
* /
typedef struct.
{
__IO UINT32_T CTRL;/ *!<偏移:0x000(R / W)Systick控制和状态寄存器* /
__IO UINT32_T负载;/ *!<偏移:0x004(R / W)Systick重载值寄存器* /
__IO UINT32_T VAL;/ *!<偏移:0x008(R / W)Systick电流值寄存器* /
__i uint32_t calib;/ *!<偏移:0x00c(r /)systick校准寄存器* /
} systick_type;
/ * Cortex-M0硬件的内存映射* /#define nvic_base(scs_base + 0x0100ul)/ *!#define scb_base(scs_base + 0x0d00ul)/ *!<系统控制块基地地址* /
#define scs_base(0xe000e000ul)/ *!<系统控制空间基数地址* /
#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计时器
*
* @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超时
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.
}
你好,
如果设备处于睡眠模式,则不会运行Systick,最终您将无法计算您睡觉的时间。它只是由ARM处理器提供的额外计数器,您将无法获得设备的运行时间。
谢谢mt_dialog.
相当如此,有一个好主意指出睡眠问题。然而,我们不使用睡眠,并且Systick的巨大优势是它不会被中断是硬件柜台的中断。也许这不适合原始查询。