STM32-延时函数(基于SysTick)

1.SysTick介绍

1.1 简介

        SysTick 叫做系统滴答时钟、系统定时器,属于 Cortex-M3 内核中的一个外设(外围设备),被捆绑在NVIC中,用来产生SYSTICK异常(异常号:15)。以前,大多数操作系统需要一个硬件定时器来产生操作系统需要的滴答中断,作为整个系统的时基。这个定时器专用于实时操作系统,是为操作系统而设计的。

        SysTick是一个24bit向下递减的计数器,当计到0时,从RELOAD寄存器中自动重装载定时初值。

注意:

  • 定时器的位数越多,定时时间越长。
  • 通过计数值间接计算定时时间,不能像操作系统直接调用函数实现延时或定时功能。
  • 1.2 工作原理

    工作原理

    2.延时函数

    2.1 微秒延时函数(uS)

    
    #define AHB_INPUT  72  //请按RCC中设置的AHB时钟频率填写到这里(单位MHz)    以1us来定的
    
    void delay_us(u32 uS){ //uS微秒级延时程序(参考值即是延时数,72MHz时最大值233015)	
    	SysTick->CTRL = 0;
        SysTick->LOAD=AHB_INPUT*uS - 1;//重装计数初值(当主频是72MHz,72次为1微秒)
    	SysTick->VAL=0x00;        //清空定时器的计数器
    	SysTick->CTRL=0x00000005;//时钟源HCLK,打开定时器
    	while(!(SysTick->CTRL&0x00010000)); //等待计数到0
    	SysTick->CTRL=0;//关闭定时器
    }
    
    

    2.2 毫秒级延时函数(mS)

    
    void delay_ms(u16 ms){ //mS毫秒级延时程序(参考值即是延时数,最大值65535)	 		  	  
    	while( ms-- != 0){
    		delay_us(1000);	//调用1000微秒的延时
    	}
    }
    //或者
    void delay_ms2(uint32_t ms)
    {
    	while(ms --)
    	{
    		SysTick->CTRL = 0; 			// 关闭系统定时器后才能配置寄存器
    		SysTick->LOAD = 72000 - 1; 			// 设置计数值,用于设置定时的时间
    		SysTick->VAL = 0; 			// 清空当前值还有计数标志位
    		SysTick->CTRL = 5; 			// 使能系统定时器工作,且时钟源为系统时钟的8分频(168MHz/8=21MHz)
    		while(!(SysTick->CTRL&0x00010000)); //等待计数到0
    		SysTick->CTRL = 0; 			// 关闭系统定时器	
    	}
    }
    
    

    2.3 秒级延时函数(S)

    
    void delay_s(u16 s){ //S秒级延时程序(参考值即是延时数,最大值65535)	 		  	  
    	while( s-- != 0){
    		delay_ms(1000);	//调用1000毫秒的延时
    	}
    } 
    
    

    2.4 delay.h

    
    #ifndef __DELAY_H
    #define __DELAY_H
    
    #include "stm32f10x.h"
    
    #define uint32_t  u32
    #define uint16_t  u16
    #define uint8_t   u8
    
    void delay_us(u32 us);
    void delay_ms(u16 ms);
    void delay_ms2(uint32_t ms);
    void delay_s(u16 s);
    
    #endif
    
    

    2.5 delay.c

    
    #include "delay.h"
    
    #define AHB_INPUT  72  //请按RCC中设置的AHB时钟频率填写到这里(单位MHz)    以1us来定的
    
    /*
        1S    72 000 000   
        1ms   72 000  
        1us   72
    */
    
    //微秒(us)
    void delay_us(u32 us){ //uS微秒级延时程序(参考值即是延时数,72MHz时最大值233015)	
    	SysTick->CTRL = 0;
        SysTick->LOAD=AHB_INPUT*us - 1;//重装计数初值(当主频是72MHz,72次为1微秒)
    	SysTick->VAL=0x00;        //清空定时器的计数器
    	SysTick->CTRL=0x00000005;//时钟源HCLK,打开定时器
    	while(!(SysTick->CTRL&0x00010000)); //等待计数到0
    	SysTick->CTRL=0;//关闭定时器
    }
    
    //毫秒(ms)
    void delay_ms(u16 ms){ //mS毫秒级延时程序(参考值即是延时数,最大值65535)	 		  	  
    	while( ms-- != 0){
    		delay_us(1000);	//调用1000微秒的延时
    	}
    }
    //或者
    void delay_ms2(u32 ms)
    {
    	while(ms --)
    	{
    		SysTick->CTRL = 0; 			// 关闭系统定时器后才能配置寄存器
    		SysTick->LOAD = 72000 - 1; 			// 设置计数值,用于设置定时的时间
    		SysTick->VAL = 0; 			// 清空当前值还有计数标志位
    		SysTick->CTRL = 5; 			// 使能系统定时器工作,且时钟源为系统时钟的8分频(168MHz/8=21MHz)
    		while(!(SysTick->CTRL&0x00010000)); //等待计数到0
    		SysTick->CTRL = 0; 			// 关闭系统定时器	
    	}
    }
    
    //秒(S)
    void delay_s(u16 s){ //S秒级延时程序(参考值即是延时数,最大值65535)	 		  	  
    	while( s-- != 0){
    		delay_ms(1000);	//调用1000毫秒的延时
    	}
    } 
    
    

    结束语

            以上就是对基于SysTick的延时函数的一个总结。

    作者:加油1234

    物联沃分享整理
    物联沃-IOTWORD物联网 » STM32-延时函数(基于SysTick)

    发表回复