当前位置: 首页 > article >正文

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

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

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

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

一、新建工程

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

stm32-HAL库+cubeMX新建工程教程(以F103C8T6为例)icon-default.png?t=O83Ahttps://blog.csdn.net/qq_39150957/article/details/136637881?fromshare=blogdetail&sharetype=blogdetail&sharerId=136637881&sharerefer=PC&sharesource=qq_39150957&sharefrom=from_link【STM32-HAL库】立创梁山派新建工程并点灯(GD32F470ZGT6)cubeMX+HAL库+keil5icon-default.png?t=O83Ahttps://blog.csdn.net/qq_39150957/article/details/136637881?fromshare=blogdetail&sharetype=blogdetail&sharerId=136637881&sharerefer=PC&sharesource=qq_39150957&sharefrom=from_link【STM32-HAL库】立创梁山派天空星版新建工程并点灯(GD32F407VET6)icon-default.png?t=O83Ahttps://blog.csdn.net/qq_39150957/article/details/137161558?fromshare=blogdetail&sharetype=blogdetail&sharerId=137161558&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提取码:6666icon-default.png?t=O83Ahttps://pan.baidu.com/s/1I--gUvHxdVqrnnhkqF07AQ


http://www.kler.cn/news/341122.html

相关文章:

  • 贪心算法:原理、应用与优化
  • Python OpenCV精讲系列 - 实例分割深入理解(十八)
  • 【devops】x-ui 实现一键安装 x-ray 打造高速国际冲浪 | xray管理平台
  • C# 类型增加自定义xml序列化
  • 【gRPC】1—gRPC是什么
  • Python中的with关键字和文件操作
  • Linux SSH服务
  • C语言练习
  • 【AAOS】Android Automotive 10模拟器源码下载及编译
  • Springboot 阿里云对象存储OSS 工具类
  • 69. Three.js背景透明度
  • 详解机器学习经典模型(原理及应用)——条件随机场
  • 【动态规划-最长递增子序列(LIS)】力扣2826. 将三个组排序
  • 【网站架构部署与优化】HAProxy
  • Redis存储时key的设置
  • 金融壹账通亮相2024东亚保险大会 深度参与粤港澳大湾区保险创新探讨
  • 物流系统原有40T数据加上每天至少要比之前多3G数据产品,这种该怎么解决
  • DHASH感知算法计算视频相邻帧的相似度
  • 代理IP的类型及其在爬虫中的应用
  • LeetCode组合总和