0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

Systick定时器延时原理与HAL_Delay()延时函数的使用

嵌入式应用开发 来源:嵌入式应用开发 作者:嵌入式应用开发 2022-04-26 09:09 次阅读

代码的书写过程中经常用到延时,这里主要讲述一下HAl延时,HAL库之HAL_Delay()函数在72M主频,STM32CUBEMX自动生成情况下,默认为延时1ms单位,即HAL_Delay(500)表示500ms延时,这是因为在默认状态下,SysTick()默认设置为1ms中断,下面就原理进行叙述。

Systick 定时器延时原理

Systick(滴答时钟)是一个24位,向下计数的定时器,当倒计时完成后,定时器可以产生一个中断,所以,当频率一定,计数个数一定时,这个中断就会以一定的时间间隔发生,如果每个中断发送后调用的中断函数中给一个变量累加,这样我们就可以获得一个与时间相关的变量。

HAL_Delay()延时函数的使用

如果你使用STM32CubeMx来生成一个工程,那么使用Systick来延时是非常方便的,你只需要调用HAL库的一个虚函数,它的原型如下:

__weak void HAL_Delay(__IO uint32_t Delay)

可以看到,HAL_Delay()是一个虚函数,这表明用户可以在其它的位置重定义,如果这样,新的函数将会取代它,编译 过程中也不会出现重定义的错误。该函数只有一个32位的参数,明显的,这个形参指定了延时的时间,它的单位是毫秒(ms)。

214344dcweern3lcl5n0n3.jpg硬件延时

关于osDELAY函数可以看一下CMSIS_OS2.h里面的定义,我也是在网上查到具体的定义函数,如下,但是我在官方提供的函数中未找到相关的函数内容。实际使用中就是调用Free-RTOS函数,然后直接使用 OSdelay(5);含义就是延时50ms。

实际上系统OSdelay就是一种程序阻塞的状态,在阻塞态下,其他资源函数进行工作,时间到从阻塞态变为就绪态,再到运行态。

214159vzr15eiii9ibx898.jpg系统延时

软件延时就是大家用的最多的,让程序运行计算来延时,这就很多了,直接上代码。

void delay_ms(u16 nms)
{	
	if(delay_osrunning&&delay_osintnesting==0)	//如果OS已经在跑了,并且不是在中断里面(中断里面不能任务调度)	    
	{		 
		if(nms>=fac_ms)							//延时的时间大于OS的最少时间周期 
		{ 
   			delay_ostimedly(nms/fac_ms);		//OS延时
		}
		nms%=fac_ms;							//OS已经无法提供这么小的延时了,采用普通方式延时    
	}
	delay_us((u32)(nms*1000));					//普通方式延时  
}
void delay_us(u32 nus)
{		
	u32 temp;	    	 
	SysTick->LOAD=nus*fac_us; 					//时间加载	  		 
	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;      					 //清空计数器	 
}
//延时nms
//注意nms的范围
//SysTick->LOAD为24位寄存器,所以,最大延时为:
//nms<=0xffffff*8*1000/SYSCLK
//SYSCLK单位为Hz,nms单位为ms
//对72M条件下,nms<=1864 
void delay_ms(u16 nms)
{	 		  	  
	u32 temp;		   
	SysTick->LOAD=(u32)nms*fac_ms;				//时间加载(SysTick->LOAD为24bit)
	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;       					//清空计数器	  	    
} 

审核编辑:汤梓红
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 定时器
    +关注

    关注

    23

    文章

    3147

    浏览量

    112034
  • 延时函数
    +关注

    关注

    0

    文章

    25

    浏览量

    9966
  • Systick
    +关注

    关注

    0

    文章

    62

    浏览量

    12950
收藏 人收藏

    评论

    相关推荐

    STM32基于HAL库实现微秒延时

    HAL只提供了ms级的延时,但有些特殊场景,比如与通信速率较慢的设备通信时,会需要用到us级延时。STM32标准库一般是使用系统嘀嗒定时器来进行微妙级别的
    的头像 发表于 10-25 15:31 1689次阅读
    STM32基于<b class='flag-5'>HAL</b>库实现微秒<b class='flag-5'>延时</b>

    Systick定时器是如何去实现delay延时

    Systick定时器是什么?Systick定时器是如何去实现delay延时的?
    发表于 11-17 06:02

    如何用Systick定时器去实现delay延时函数

    什么是SysTick定时器SysTick定时器有何作用?如何用Systick定时器去实现
    发表于 11-24 06:34

    如何对SysTick定时器延时函数进行配置呢

    SysTick定时器主要有哪几个寄存呢?如何对SysTick定时器延时
    发表于 11-24 06:33

    SysTick定时器的相关资料推荐

    SysTick定时器来实现延时,可以不占用系统定时器,节约资源。由于SysTick是在CPU核内部实现的,跟MCU外设无关,因此它的代码可
    发表于 02-09 06:50

    STM32单片机使用定时器中断方式实现毫秒级延时的设计

    因为STM32 HAL库中仅有对HAl_Delay()毫秒级的延时,为实现精确的微秒级延时,就不得不修改Systick,但由于
    发表于 06-04 14:55 1w次阅读
    STM32单片机使用<b class='flag-5'>定时器</b>中断方式实现毫秒级<b class='flag-5'>延时</b>的设计

    【STM32单片机-库函数SysTick延时delay

    : SysTick延时函数头文件 /* --------------------------------------------------------- */#ifndef _DELA
    发表于 11-24 19:06 12次下载
    【STM32单片机-库<b class='flag-5'>函数</b>】<b class='flag-5'>SysTick</b><b class='flag-5'>延时</b>—<b class='flag-5'>delay</b>

    【野火指南者】STM32F103延时函数及其系统定时器SysTick

    学习目的:1、学习STM32的系统定时器及其相关的寄存器2、使用STM32的系统定时器来配置延时函数内容介绍:一、Systick简介二、
    发表于 11-24 20:06 5次下载
    【野火指南者】STM32F103<b class='flag-5'>延时</b><b class='flag-5'>函数</b>及其系统<b class='flag-5'>定时器</b>—<b class='flag-5'>SysTick</b>

    STM32F4: Systick滴答定时器-延时函数讲解(五)

    Systick定时器基础知识讲解Systick相关寄存器库函数讲解delay延时
    发表于 12-01 15:21 12次下载
    STM32F4: <b class='flag-5'>Systick</b>滴答<b class='flag-5'>定时器</b>-<b class='flag-5'>延时</b><b class='flag-5'>函数</b>讲解(五)

    SysTick 定时器

    SysTick定时器来实现延时,可以不占用系统定时器,节约资源。由于SysTick是在CPU核内部实现的,跟MCU外设无关,因此它的代码可
    发表于 12-05 14:51 9次下载
    <b class='flag-5'>SysTick</b> <b class='flag-5'>定时器</b>

    stm32之HAL库实现us延时方法

    stm32之HAL库实现us延时方法HAL_Delay()源码为ms级别的延时如下:/** * @brief This function provides accurate
    发表于 01-17 09:32 5次下载
    stm32之<b class='flag-5'>HAL</b>库实现us<b class='flag-5'>延时</b>方法

    STM32 HAL延时函数 HAL_Delay 解析

    HAL 库有提供延时函数,只不过它只能实现简单的毫秒级别延时,没有实现 us 级别延时。下面我们列出HA
    发表于 01-17 09:48 7次下载
    STM32 <b class='flag-5'>HAL</b> 库<b class='flag-5'>延时</b><b class='flag-5'>函数</b> <b class='flag-5'>HAL_Delay</b> 解析

    【STM32】SysTick滴答定时器delay延时函数讲解)

    Systick定时器,是一个简单的定时器,对于CM3、CM4内核芯片,都有Systick定时器Syst
    发表于 02-10 10:35 13次下载
    【STM32】<b class='flag-5'>SysTick</b>滴答<b class='flag-5'>定时器</b>(<b class='flag-5'>delay</b><b class='flag-5'>延时</b><b class='flag-5'>函数</b>讲解)

    HAL库中用定时器实现自定义延时函数delay_us()

    STM32程序从标准库移植到HAL库的时候,会发现HAL库中只有一个毫秒级延时函数HAL_Delay(),而没有微秒级
    的头像 发表于 09-21 10:33 7536次阅读

    SysTickHAL_Delay的关系与注意事项

    本文将介绍SysTickHAL_Delay()函数之间的关系,以及使用HAL_Delay()函数的注意事项;
    的头像 发表于 04-21 11:32 1084次阅读