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

   日期:2021-01-31     浏览:140    评论:0    
核心提示:一、SysTick使用详解1. SysTick简介SysTick是一个24位的系统节拍定时器system tick timer,SysTick,具有自动重载和溢出中断功能,所有基于Cortex_M3处理器的微控制器都可以由这个定时器获得一定的时间间隔。2. SysTick相关寄存器状态寄存器-CTRLSTCLK外部时钟源:AHB总线时钟的 1/8FCLK 内部时钟:AHB总线时钟——STM32F103是72MHz重装载数值寄存器-LOAD当前值寄存器-VAL校准寄存器-CALIB

一、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毫秒的延时
	}
}
 
打赏
 本文转载自:网络 
所有权利归属于原作者,如文章来源标示错误或侵犯了您的权利请联系微信13520258486
更多>最近资讯中心
更多>最新资讯中心
0相关评论

推荐图文
推荐资讯中心
点击排行
最新信息
新手指南
采购商服务
供应商服务
交易安全
关注我们
手机网站:
新浪微博:
微信关注:

13520258486

周一至周五 9:00-18:00
(其他时间联系在线客服)

24小时在线客服