【STM32-HAL库】实现微秒、毫秒、纳秒延时。(STM32F4系列)(附带工程下载链接)

使用了本代码后不能使用HAL库自带的HAL_Delay函数

使用了本代码后不能使用HAL库自带的HAL_Delay函数

使用了本代码后不能使用HAL库自带的HAL_Delay函数

一、新建工程

 可以参考我的新建工程系列教程

stm32-HAL库+cubeMX新建工程教程系列https://blog.csdn.net/qq_39150957/article/details/143087351?fromshare=blogdetail&sharetype=blogdetail&sharerId=143087351&sharerefer=PC&sharesource=qq_39150957&sharefrom=from_link

二、移植代码

delay.h

#ifndef __DELAY_H__
#define __DELAY_H__

/* 包含头文件 ----------------------------------------------------------------*/
#include "stm32f4xx_hal.h"
#include "main.h"
void delay_init(uint8_t SYSCLK);
void delay_us(int32_t nus);
void delay_xms(uint16_t nms);
void delay_ms(int32_t nms);
#endif

delay.c

#include "delay.h"
/*
适用于STM32F407系列
*/
static uint8_t  fac_us=0;							//us延时倍乘数			   
static uint16_t fac_ms=0;							//ms延时倍乘数,在os下,代表每个节拍的ms数

//初始化延迟函数
//SYSTICK的时钟固定为AHB时钟的1/8
//SYSCLK:系统时钟频率
void delay_init(uint8_t SYSCLK)
{
	HAL_SYSTICK_CLKSourceConfig(SYSTICK_CLKSOURCE_HCLK_DIV8);
	fac_us=SYSCLK/8;						//不论是否使用OS,fac_us都需要使用
	fac_ms=(uint16_t)fac_us*1000;				//非OS下,代表每个ms需要的systick时钟数   
}								    
 /****************************
 ** 定时us
 ** nus: 需要定时的微秒数
 **延时nus
 **nus为要延时的us数.	
 **注意:nus的值,不要大于798915us(最大值即2^24/fac_us@fac_us=21)
 *****************************/
void delay_us(int32_t nus) 
 {
	uint32_t 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
 //对168M条件下,nms<=798ms 
void delay_xms(uint16_t nms)
{
	uint32_t temp;
	SysTick->LOAD=(uint32_t)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;     		  		//清空计数器	  	    
} 
 
 /****************************
 ** 定时ms
 ** nms: 需要定时的毫秒数
 *****************************/
 void delay_ms(int32_t nms) 
 {
	uint8_t repeat=nms/540;						//这里用540,是考虑到某些客户可能超频使用,
											//比如超频到248M的时候,delay_xms最大只能延时541ms左右了
	uint16_t remain=nms%540;
	while(repeat)
	{
		delay_xms(540);
		repeat--;
	}
	if(remain)delay_xms(remain); 
 }

三、使用代码

main.c中

  /* USER CODE BEGIN 2 */

//传入参数为当前芯片频率
delay_init(168);

  /* USER CODE END 2 */

之后就可以使用函数delay_ms(毫秒延时)、delay_xms(纳秒延时)、delay_us(微秒延时)了

传入参数为延时事件。

例如延时一秒

delay_ms(1000);//延时1秒
delay_us(1000000);//延时1秒
delay_xms(1000000000);//延时1秒

四、工程下载

通过百度网盘分享的文件:delay_us.zip提取码:6666https://pan.baidu.com/s/1I–gUvHxdVqrnnhkqF07AQ

作者:暮雪倾风

物联沃分享整理
物联沃-IOTWORD物联网 » 【STM32-HAL库】实现微秒、毫秒、纳秒延时。(STM32F4系列)(附带工程下载链接)

发表回复