滴答定时器

Systick定时器,是一个简单的定时器,对于CM3,CM4内核芯片,都有Systick定时器。Systick定时器常用来做延时,或者实时系统的心跳时钟。还可以节约MCU资源,不用浪费一个定时器,工作原理和定时器相似。

滴答定时器的应用

滴答定时器广泛应用于嵌入式系统和操作系统中,可以用来实现延时函数、实时时钟、定时器、任务调度等。下面=介绍一下滴答定时器的一些应用:

  • 延时函数:通过滴答定时器来实现软件延时,可以在不使用硬件延时器的情况下进行精确延时,比如在控制LED灯闪烁的时候可以使用滴答定时器来产生定时器中断来控制LED灯的亮灭时间。
  • 实时时钟:在嵌入式系统中,可以使用滴答定时器来实现实时时钟的功能,通过定时器中断来更新系统时钟。
  • 定时器:在嵌入式系统中,可以使用滴答定时器来实现硬件计时器的功能,比如控制飞机遥控器的发送信号的时间间隔。
  • 任务调度:在操作系统中,滴答定时器可以用来实现任务调度,通过定时器中断来调度任务的执行。

要在32位单片机上使用滴答定时器进行延时,可以按照以下步骤进行:

1.配置滴答定时器(SysTick)的时钟源和计数器周期。在Cortex-M0架构中,SysTick定时器是内置的,并且使用外部时钟源,通常使用CPU时钟或外部晶振时钟。可以使用以下代码配置SysTick定时器的计数器周期为1毫秒:

复制//初始化待代码
void systick_config(void)
{
    SysTick_Config(SystemCoreClock/1000);
}

这里SystemCoreClock是系统时钟频率,这里假设为1MHz,将SysTick的计数器周期设置为1毫秒(1000Hz)。

//对应的中断函数,可设置计数变量,单位是1ms
void SysTick_Handler(void)
{

uint32_t tick =0;

tick ++;

}

2.在需要进行延时的地方,调用delay_ms()函数进行延时。该函数的实现如下:
复制void delay_ms(uint32_t ms)
{
    uint32_t start_tick = SysTick->VAL;
    uint32_t delay_ticks = ms * (SystemCoreClock/1000);

    while (delay_ticks > 0)
    {
        uint32_t current_tick = SysTick->VAL;
        if (current_tick > start_tick)
        {
            delay_ticks -= (current_tick - start_tick);
        }
        else
        {
            delay_ticks -= (current_tick + (0xFFFFFFFF - start_tick) + 1);
        }

        start_tick = current_tick;
    }
}

该函数使用当前SysTick计数器的值和计算出的延时所需的SysTick计数器值之间的差来计算延时时间。在循环中,如果当前SysTick计数器的值大于初始值,则直接减去它们的差;如果当前SysTick计数器的值小于初始值,则减去它们的差再加上SysTick计数器的最大值。

这样就可以使用SysTick定时器在32位单片机上进行精确的延时了。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值