STM32嵌入式开发学习笔记(四):使用滴答计时器实现精准计时

前面我们讲过,因为在STM32上没有系统时间的接口,因此无法调用sleep函数,在本文中,笔者将利用滴答计时器实现精准延时。

查阅技术手册,滴答计时器依赖于一个SysTick_Type类型寄存器,定义如下

typedef struct
{
vu32 CTRL;
vu32 LOAD;
vu32 VAL;
vuc32 CALIB;
} SysTick_TypeDef; 

四个成员分别意义是控制和状态,重装载值,当前值,校准值。

滴答计时器的原理很简单,就是利用系统时钟信号,每接到一个时钟信号计数器加一,和校准值相等时就自动归零。

指向SysTick 外设的指针被如下声明:

#define SysTick ((SysTick_TypeDef *) SysTick_BASE) 

要使用滴答计时器时,调用此指针即可。

首先,我们用SysTick_CLKSourceConfig函数初始化systick

void systick_configer(){
    SysTick_CLKSourceConfig(SysTick_CLKSource_HCLK_Div8);    
}

注意,我这里给的参数是SysTick_CLKSource_HCLK_Div8,就是时钟信号八分频,每接到8个时钟信号才让计数器+1,因为systick外设时钟频率是72MHz,也就是每秒要跳72M次,如果试图用此信号记录1秒的时间,就会爆计数器,因为计数器只有24位,只能存储16M的数字。

void Delay_ms(int ms){
    while(ms--){
        SysTick->LOAD=9000;
        SysTick->VAL=0;
        SysTick->CTRL|=1;
        while(!(SysTick->CTRL&(1<<16)));
        SysTick->VAL=0;
        SysTick->CTRL&=0xfffffffe;
    }
}

时钟频率是72MHz,八分频就是9MHz,因此每毫秒就是计数9000次。

首先清空计数器,然后将重装载值设置为9000,一旦计数器达到此值,控制寄存器的第16位就会变成1;

最后,将控制寄存器最后一位置为1,此位是时钟使能开关,若为1则时钟开始计数。

然后等待并判断控制寄存器的第16位是否为1,若此条件达成,重置。

由于systick寄存器每一位都有不同的功能,需要分别操作,甚至有些位无法访问,因此要善于使用位运算。

#ifndef _SYSTICK_H
    #define _SYSTICK_H
    void systick_configer();
    void Delay_ms(int ms);
#endif 
//systick.h

至此,我们利用滴答计时器实现了类似于sleep的功能。

 

转载于:https://www.cnblogs.com/isakovsky/p/11428230.html

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值