Systick时钟-创新互联

我们在写单片机程序时,最常用的一个函数就是延时函数,很多情况下,都需要我们产生一个延时,如果此时,程序对延时的精确程度较高,显然一般的延时函数并不能满足我们的需求,那我们该怎么办呢?这个时候,Systick定时器就是它发挥作用的时候了。

武安网站建设公司成都创新互联公司,武安网站设计制作,有大型网站制作公司丰富经验。已为武安上千提供企业网站建设服务。企业网站搭建\外贸网站制作要多少钱,请找那个售后服务好的武安做网站的公司定做!

  什么是Systick定时器呢?简而言之,它是stm32内部系统滴答定时器,并且它是24位倒计时定时器,作用就是能够产生精确的延时时间。当计数到0时,它自动从一个叫做RELOD寄存器中自动加载数值。众所周知,我们想要驱动定时器,需要一个时钟才能驱动,而Systick定时器的时钟比较特殊,它的时钟来源是系统时钟。Systick有两种获得系统时钟的方式,一种是直接取自系统时钟,另一种是将系统时钟8分频,然后再赋值给Systick定时器。

  Systick定时器是属于CM3内核的外设,所有基于CM3内核的单片机都具有这个系统定时器。系统定时器一般用于操作系统,用于产生时基,维持操作系统的心跳。

  这里先来讲讲Systick最基础的用法---精确产生一个延时。这里,就让它延时1秒钟吧。Systick还是比较简单的,因为它只有四个寄存器。如下:

寄存器名称                             寄存器描述
CTRL                                    Systick控制及状态寄存器
LOAD                                    Systick重装载数值寄存器
VAL                                     Systick当前数值寄存器
CALIB                                   Systick校准数值寄存器

我们通过systick产生精确的延时,首先,我们要设置重装载数值。因为,当定时的时间为0时,RELOAD中的数值自动赋值给systick。那么,设置重装载数值,也就是定时时间为,这里延时ms为单位,

SysTick->LOAD = 9000 * i;   //72MHz进行8分频,于是是9MHz,所以9 * 10^6 Hz * 1 * 10^-6 s

接着,我们要使能systick,

SysTick->CTRL = 0x01;      //若为0x00,则关闭定时器

之后,我们要对定时器清零,

SysTick->VAL = 0;

完整代码如下:

void delay_ms ( unsigned int i ){

    unsigned int temp;
    
    SysTick->LOAD = 9000 * i;   //如果是微妙,则 SysTick->LOAd = 9 * i;
    SysTick->CTRL = 0x01;
    SysTick->VAL = 0;
    
    do{
    
        temp = SysTick->CTRL;    //读取当前倒计数值
    
    }while ( ( temp & 0x01 ) && ( !( temp & ( 1 << 16 ) ) ) );
    
    SysTick->CTRL = 0x00;     //关闭计数器
    SysTick->VAL = 0;         //计数器清零

}

另外有需要云服务器可以了解下创新互联scvps.cn,海内外云服务器15元起步,三天无理由+7*72小时售后在线,公司持有idc许可证,提供“云服务器、裸金属服务器、高防服务器、香港服务器、美国服务器、虚拟主机、免备案服务器”等云主机租用服务以及企业上云的综合解决方案,具有“安全稳定、简单易用、服务可用性高、性价比高”等特点与优势,专为企业上云打造定制,能够满足用户丰富、多元化的应用场景需求。


新闻标题:Systick时钟-创新互联
转载源于:http://scjbc.cn/article/dsioic.html

其他资讯