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

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中断方式,可理解为采用查询方式进行延时


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值