STM32F103系列_使用系统时钟SysTick的延时函数

STM32F103系列_使用系统时钟SysTick的延时函数

设计起因

使用TIM时钟做延时,很浪费TIM,为了充分利用STM32时钟的使用,我们使用很精确的系统时钟来做延时。

代码

Delay.c

//延时函数初始化
#include "stm32f10x.h"
#include "Delay.h"

void Delay_Init(void)
{
    
    
	SysTick_CLKSourceConfig(SysTick_CLKSource_HCLK_Div8); //选择外部时钟
}

//微秒延时
void Delay_us(u16 n)
{
    
    
	u32 temp;
	SysTick->LOAD = n * 9;					  //时间加载
	SysTick->VAL = 0x00;					  //清空计数器
	SysTick->CTRL |= SysTick_CTRL_ENABLE_Msk; //开始倒数
	do
	{
    
    
		temp = SysTick->CTRL;
	} while ((temp & 0x01) && !(temp & (1 << 16))); //等待时间到达
	SysTick->CTRL &= ~SysTick_CTRL_ENABLE_Msk;		//关闭计数器
	SysTick->VAL = 0X00;							//清空计数器
}

//毫秒延时
void Delay_ms(u16 n)
{
    
    
	u32 temp;
	SysTick->LOAD = (u32)n * 9000;			  //时间加载
	SysTick->VAL = 0x00;					  //清空计数器
	SysTick->CTRL |= SysTick_CTRL_ENABLE_Msk; //开始倒数
	do
	{
    
    
		temp = SysTick->CTRL;
	} while ((temp & 0x01) && !(temp & (1 << 16))); //等待时间到达
	SysTick->CTRL &= ~SysTick_CTRL_ENABLE_Msk;		//关闭计数器
	SysTick->VAL = 0X00;							//清空计数器
}

//秒延时
void Delay_s(u16 n)
{
    
    
	for (u16 x = 0; x < n; x++)
	{
    
    
		u32 temp;
		SysTick->LOAD = 9000000;				  //时间加载
		SysTick->VAL = 0x00;					  //清空计数器
		SysTick->CTRL |= SysTick_CTRL_ENABLE_Msk; //开始倒数
		do
		{
    
    
			temp = SysTick->CTRL;
		} while ((temp & 0x01) && !(temp & (1 << 16))); //等待时间到达
		SysTick->CTRL &= ~SysTick_CTRL_ENABLE_Msk;		//关闭计数器
		SysTick->VAL = 0X00;							//清空计数器
	}
}

Delay.h

#ifndef __DELAY_H
#define __DELAY_H 			   

extern void Delay_Init(void);

extern void Delay_ms(u16 n);
extern void Delay_us(u16 n);
extern void Delay_s(u16 n);

#endif

使用方法

1、在mian函数里调用Delay.h头文件,并调用Delay_Init()初始化延时函数;
2、使用Delay_us()来进行微秒级别延时,延时几微秒,括号内就填上几;
3、使用Delay_ms()来进行毫秒级别延时,延时几毫秒,括号内就填上几;
4、使用Delay_s()来进行秒级别延时,延时几秒,括号内就填上几;

猜你喜欢

转载自blog.csdn.net/xingdala/article/details/121590559