systick一共有4个寄存器
CSR :控制和状态寄存器。
COUNTFLAG :标志位,标志systick计数器是否已经倒数到0 。0 :还没有数到0 。1:已经数到0 了。
CLKSOURCE:时钟源的选择。1:systick使用系统内核时钟。0:可选的外部时钟(根据不同设备有不同的时钟,可以通过查看芯片手册得到,KL25里面是内核时钟的1/16)
TICKINT:中断使能位。1:使能systick中断。0:计数器数到0不触发中断。
ENABLE:计数器是能为。0:计数器禁用。1:计数器运行。
RVR:重载计数器。当计数器倒数到0时,重新从该计数器加载tick值。
CVR:计数器当期的值。存放计数器当前的计数值。
CALIB:校准计数器。有些芯片厂家会将每一秒的频率值存放在该寄存器中。TENMS代表10ms对应的滴答值。通过查芯片手册,该区域在KL25里面该值为0
NOREF:标志时钟源是否选择外部参考时钟。1:非参考时钟。0:参考时钟
SKEW:标志该出厂值TENMS是否精确:0:精确。1:不精确,因为时钟频率的原因。
TENMS:10ms的滴答值。
通过这3个寄存器我们可以编写3个函数:
systick_init:systick初始化
systick_trim:systick校准
systick_isr:systick中断例程。
话不多说:上码。
//函数名称:systick_init
//函数返回:无
//参数说明:clock_scr:内核时钟源的选择:0:内核时钟。1:内核时钟/16。
// systick_unit:systick的每次中断的时间间隔。单位ms 推荐选用10ms。最大为1000ms,即1s中断一次。
//功能概要:初始化ARM Cortex-M处理器内核的SysTick模块作为系统滴答时钟。
void systick_init(uint_8 clock_scr, uint_32 systick_unit)
{
//定义ticks代表时钟源的滴答数
uint_32 ticks;
// 初始化系统滴答计数值
systicks = 0;
// 关闭SYSTICK
SYST_CSR = 0;
// 清除当前值计数器
SYST_CVR = 0;
// 选择时钟源0:内核时钟/16 1:内核时钟
if(0==clock_scr)
{
ticks=core_clk_khz*1000/16;
}
else
{
clock_scr=1;
ticks=core_clk_khz*1000;
}
//设置计数器重载寄存器数值
SYST_RVR = ticks/ 1000*systick_unit;
// 设定 SysTick优先级
SCB_SHPR3 |= SCB_SHPR3_PRI_15(1<<6);
//设置stick中断到1s的次数
g_ticks=1000/systick_unit-1;
// 使用内核时钟,倒计时到0时产生SYSTICK中断,使能SYSTICK
SYST_CSR = (clock_scr<<SysTick_CSR_CLKSOURCE_SHIFT) | SysTick_CSR_ENABLE_MASK | SysTick_CSR_TICKINT_MASK;
}
//函数名称:systick_trim
//函数返回:无
//参数说明:flag: 0表示慢,1表示快
// trim_sec:每一分钟的秒数之差
//功能概要:校准systick,如果每分钟慢一秒,SYST_RVR就减少48M/6000=8000
// 如果每分钟快一秒,SYST_RVR就增加48M/6000=8000
void systick_trim(uint_32 flag, uint_32 trim_sec)
{
uint_32 current_RVR=0;
uint_32 current_CSR=0;
// 初始化系统滴答计数值
systicks = 0;
// 关闭SYSTICK
current_CSR=SYST_CSR;
SYST_CSR = 0;
// 清除当前值计数器
SYST_CVR = 0;
// 设定倒计时计数值
current_RVR=SYST_RVR;
if(0 == flag)
{
current_RVR = current_RVR - current_RVR*trim_sec/60;
}
else
{
current_RVR = current_RVR + current_RVR*trim_sec/60;
}
SYST_RVR=current_RVR;
// 设定 SysTick优先级
SCB_SHPR3 |= SCB_SHPR3_PRI_15(1<<6);
// 使用内核时钟,倒计时到0时产生SYSTICK中断,使能SYSTICK
SYST_CSR = current_CSR;
}
//函数名称:systick_isr
//函数返回:无
//参数说明:无
//功能概要:SysTick定时器中断服务例程,更新系统滴答计数变量值。
void systick_isr(void)
{
//systicks++;
timecount++;
if(timecount > g_ticks) //1s到,递增时,分,秒缓冲区的值
{
timecount = 0;
SecAdd1(g_time); //加1s
}
}
编写该构件还是有一定的难度的。要想别人看的懂,自己也看的懂,就得封装一些函数及数值。