STM32:精准延时delay——SysTick使用

一、SysTick使用详解

1. SysTick简介

SysTick是一个24位的系统节拍定时器system tick timer,SysTick,具有自动重载和溢出中断功能,所有基于Cortex_M3处理器的微控制器都可以由这个定时器获得一定的时间间隔。

2. SysTick相关寄存器

状态寄存器-CTRL

STCLK外部时钟源:AHB总线时钟的 1/8
FCLK 内部时钟:AHB总线时钟——STM32F103是72MHz
在这里插入图片描述

重装载数值寄存器-LOAD

在这里插入图片描述

当前值寄存器-VAL

在这里插入图片描述

校准寄存器-CALIB

在这里插入图片描述

二、编写精准延时——delay

delay.h

#ifndef __DELAY_H
#define __DELAY_H 			   
#include "stm32f10x.h"
 
void delay_s(u16 s);
void delay_ms(u16 ms);
void delay_us(u32 us);

#endif

delay.c

#include "delay.h"

#define AHB_INPUT  72  	//请按RCC中设置的AHB时钟频率填写到这里(单位MHz)

void delay_us(u32 uS)		//uS微秒级延时程序(参考值即是延时数,72MHz时最大值233015)
{
    
     	
	u32 temp;
	SysTick->LOAD=AHB_INPUT*uS;      //重装计数初值(当主频是72MHz,72次为1微秒)
	SysTick->VAL=0x00;        		 //清空定时器的计数器
	SysTick->CTRL=0x00000005;		 //内部时钟FCLK,打开定时器
	do
	{
    
    
		temp=SysTick->CTRL;
	}
	while(temp&0x01&&!(temp&(1<<16)));		//等待时间到达  
	SysTick->CTRL=0x00000004;				//关闭定时器
	SysTick->VAL=0x00;        				//清空定时器的计数器
}

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

猜你喜欢

转载自blog.csdn.net/MQ0522/article/details/113375822