zoukankan      html  css  js  c++  java
  • 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的功能。

  • 相关阅读:
    [CF1355] Codeforces Round #643 (Div. 2)
    [ABC189] AtCoder Beginner Contest 189
    P3702 [SDOI2017]序列计数 (三模数NTT)
    P3321 [SDOI2015]序列统计 (NTT快速幂)
    洛谷P4157 [SCOI2006]整数划分
    洛谷P2553 [AHOI2001]多项式乘法
    洛谷P1919 (模板)A*B Problem升级版(FFT快速傅里叶)
    MySQL学习总结-详细版(包括下载安装)
    查看oracle数据库中表是否被锁
    SQL优化(面试题)
  • 原文地址:https://www.cnblogs.com/isakovsky/p/11428230.html
Copyright © 2011-2022 走看看