关于systick的构件编写。

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
   }
}
编写该构件还是有一定的难度的。要想别人看的懂,自己也看的懂,就得封装一些函数及数值。








  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值