【STM32F103】嘀嗒定时器(Systick)_延时函数

本文介绍了如何使用STM32的Systick定时器来创建延时函数,包括初始化设置、延时us和ms的实现。通过配置SysTick的CTRL、LOAD、VAL和CALIB寄存器,实现了基于系统时钟的精确延时,并以查询方式避免了中断处理。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

STM32嘀嗒定时器——延时函数

一 系统Systick定时器

Systick定时器就是系统滴答定时器,一个24 位的倒计数定时器,计到0 时,将从RELOAD 寄存器中自动重装载定时初值。只要不把它在SysTick 控制及状态寄存器中的使能位清除,就永不停息,即使在睡眠模式下也能工作。

在这里我们选用内部时钟源72M,所以SYSTICK的时钟为9M,即SYSTICK定时器以9M的频率递减。
SysTick 主要包含CTRL、LOAD、VAL、CALIB 等4 个寄存器
在这里插入图片描述
在这里插入图片描述

二 代码配置

Delay.h
#ifndef __DELAY_H__
#define __DELAY_H__

#include "stm32f10x.h" 
void delay_init(void) ;      
void delay_us(int32_t nus);    //延时n个us
void delay_ms(int16_t nms);    //延时n个ms

 #endif
Delay.c
/* --------------------------------------------------------- */
// 文件名称:delay.c        
// 功能描述: SysTick延时函数源文件
 
/* --------------------------------------------------------- */
 
#include "delay.h"
 
 
static int8_t  fac_us=0;    //us
static int16_t fac_ms=0;    //ms
 
 
void delay_init()	 
{
	SysTick_CLKSourceConfig(SysTick_CLKSource_HCLK_Div8);//选择外部时钟  HCLK/8
 
	fac_us=72000000/8000000;						    //为系统时钟的1/8  /* fac_us=SystemCoreClock/8000000;	*/
	fac_ms=(int16_t)fac_us*1000;						//每个ms需要的systick时钟数   
}	
//延时Nus
void delay_us(int32_t nus)
{		
	int32_t temp;	    	 
	SysTick->LOAD=nus*fac_us; 							//时间加载	  		 
	SysTick->VAL=0x00;        						    //清空计数器
	SysTick->CTRL=0X01;;          	                    //使能,开始计数 
	do
	{
		temp=SysTick->CTRL;
	}
	while(temp&0x01&&!(temp&(1<<16)));					//等待时间到达   
	 SysTick->CTRL=0x00;       		                    //关闭计数器
	SysTick->VAL =0X00;       							//清空计数器	 
}
 
//延时Nms
void delay_ms(int16_t nms)
{	 		  	  
	int32_t temp;		   
	SysTick->LOAD=(int32_t)nms*fac_ms;					//时间加载(SysTick->LOAD为24bit)
	SysTick->VAL =0x00;           						//清空计数器
	SysTick->CTRL|=0x01 ;                           	//使能,开始计数  
	do
	{
		temp=SysTick->CTRL;
	}
	while(temp&0x01&&!(temp&(1<<16)));					//等待时间到达   
	 SysTick->CTRL=0x00;       		                    //关闭计数器
	 SysTick->VAL =0X00;       							//清空计数器	  	    
} 
 
```此次代码采用为未进入NVIC中断方式,可理解为采用查询方式进行延时


首先,在STM32F103的固件库中,SysTick_Handler函数已经在startup_stm32f10x_hd.s文件中定义,我们不需要手动编写该函数。而是需要在main函数中使用SysTick_Config函数SysTick定时器进行配置。 以下是一个简单的例子: ```c #include "stm32f10x.h" #include "stm32f10x_conf.h" void Delay(__IO uint32_t nTime); int main(void) { /* 初始化SysTick定时器 */ if (SysTick_Config(SystemCoreClock / 1000)) { /* 定时器初始化失败 */ while (1); } /* 系统时钟为72MHz,每个时钟周期为1/72MHz秒 */ /* SysTick_Config(SystemCoreClock / 1000) 的参数为72MHz时钟下,每1ms触发一次中断 */ while (1) { /* 延时一段时间 */ Delay(1000); } } /* 延时函数,使用SysTick定时器 */ void Delay(__IO uint32_t nTime) { TimingDelay = nTime; while(TimingDelay != 0); } /* SysTick中断处理函数 */ void SysTick_Handler(void) { if (TimingDelay != 0x00) { TimingDelay--; } } ``` 在该代码中,我们使用了SysTick_Config函数SysTick定时器进行配置。SysTick_Config函数的参数为时钟周期数,即一次中断触发的时间间隔。在本例中,我们将时钟周期数设置为SystemCoreClock / 1000,即每1ms触发一次中断。 在main函数中,我们使用了一个简单的延时函数Delay来演示SysTick定时器的使用。Delay函数中,我们将一个计数器TimingDelay设置为需要延时的时间,然后在SysTick中断处理函数中递减该计数器,直到计数器为0时,延时结束。 最后,在代码中需要实现SysTick_Handler函数,该函数SysTick定时器中断发生时被调用,我们在该函数中递减计数器TimingDelay。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值