stm32 delay文件总结

本文介绍了STM32中基于SysTick定时器实现的延时函数delay_init()、delay_us()和delay_ms()。这些函数通过配置SysTick定时器来实现精确的微秒和毫秒级延时。

stm32 delay文件总结

delay.h

#ifndef __DELAY_H
#define __DELAY_H 			   
#include "sys.h"  
	 
void delay_init(void);
void delay_ms(u16 nms);
void delay_us(u32 nus);

#endif

delay.h声明了三个延时函数

delay.c

#include "delay.h"

static u8  fac_us=0;							//us延时倍乘数			   
static u16 fac_ms=0;							//ms延时倍乘数
			   
//初始化延迟函数
//当使用OS的时候,此函数会初始化OS的时钟节拍
//SYSTICK的时钟固定为HCLK时钟的1/8
//SYSCLK:系统时钟
void delay_init()
{
	SysTick_CLKSourceConfig(SysTick_CLKSource_HCLK_Div8);	//选择外部时钟  HCLK/8
	fac_us=SystemCoreClock/8000000;				//为系统时钟的1/8  
	fac_ms=(u16)fac_us*1000;					//代表每个ms需要的systick时钟数   
}

//延时nus
//nus为要延时的us数.		    								   
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;       					//清空计数器	  	    
} 

systick是一个24位倒记数定时器;

systick的功能是为操作系统提供硬件上的定时中断(滴答中断);保证系统运行的时候不会让一个任务而占用整个系统;可以制作精准的定时功能;

systick定时器的特点可以工作在芯片睡眠状态下此定时器被捆绑在NVIC(中断向量控制器)中,可以用于产生异常和中断;

编程涉及到的寄存器:
SysTick_CTRL 控制寄存器
SysTick_LOAD 重载寄存器
SysTick_VAL 当前值寄存器
SysTick_CALRB 校准值寄存器

SysTick的代码定义

#define SysTick             ((SysTick_Type *)       SysTick_BASE)     /*!< SysTick configuration struct */

定义了 Systick的结构体和其地址
结构体定义如下:

typedef struct
{
  __IO uint32_t CTRL;                         /*!< Offset: 0x00  SysTick Control and Status Register */[0] : ENABLE systick使能位 0=关闭systick功能,1=开启systick功能
  [1] : TICKINT systick中断使能位 0=关闭systick中断,1=开启systick中断
[2] : CLKSOURCE systick时钟源选择位 0=使用HCLK/8时钟源 1=使用HCLK时钟源
[16]: COUNTFLAG systick计数比较标志,如果计数器达到0,则读入为1;当读取或清除当前计数器值时,将自动清除为0;
[其它位] : 保留;
  __IO uint32_t LOAD;                         /*!< Offset: 0x04  SysTick Reload Value Register       */
[23:0] : systick定时器递减到0后,从SysTick_LOAD的值装载给SysTick_VAL(当前值寄存器),从而实现和C51单片机定时器的8位自动重装模式一样的效果;
[其它位]:保留
  __IO uint32_t VAL;                          /*!< Offset: 0x08  SysTick Current Value Register      */[23:0] : 读取时返回当前倒计数的值,写它则使之清零,同时还会清除SysTick控制寄存器和状态寄存器中的COUNTFLAG标志;
[其它位]:保留
  __I  uint32_t CALIB;                        /*!< Offset: 0x0C  SysTick Calibration Register        */[31] :NOREF 外部参考时钟有无标志位 1=没有外部参考时钟(STCLK不可用); 0=外部参考时钟可用
[30] : SKEW 校准值是否为准确1ms标志位 1=准确 ; 0=不准确;
[23:0] : 校准值;(STM3210x使用手册中指出校准值固定为9000,而且当系统滴答时钟设定为9MHz(HCLK/8的最大值),将会产生1ms时间基准)

} SysTick_Type;

misc.c中定义/的//选择外部时钟 函数

void SysTick_CLKSourceConfig(uint32_t SysTick_CLKSource)
{
  /* Check the parameters */
  assert_param(IS_SYSTICK_CLK_SOURCE(SysTick_CLKSource));
  if (SysTick_CLKSource == SysTick_CLKSource_HCLK)
  {
    SysTick->CTRL |= SysTick_CLKSource_HCLK;
  }
  else
  {
    SysTick->CTRL &= SysTick_CLKSource_HCLK_Div8;
  }
}

delay编程步骤
给SysTick_LOAD重载值;
清零SysTick_VAL;
通过配置寄存器SysTick_CTRL设置时钟输入(HCLK/8或HCLK)并且使能systick;
应用中的三个重要的函数
void delay_init(u8 SYSCLK); //初始化延迟函数
void delay_us(u32 nus); //延时n微妙
void delay_ms(u16 nms); //延时n毫秒

<think>首先,用户的问题是:"我想查找STM32中实现delay功能所需的头文件请问stm32delay文件include"。基于系统级指令,我需要使用中文回答,并参考提供的引用。关键点是用户想了解STM32中实现delay功能所需的头文件。我需要从引用中提取相关信息。回顾引用:-引用[1]:描述了在Keil中配置delay.c和.h文件的步骤。它提到delay.h文件的内容:包括stm32f10x.h,并定义了delay函数原型。-引用[2]:提供了delay.c文件的代码,其中实现了delay_us和delay_ms函数。-引用[3]:讨论创建通用头文件,支持printf、us延时等。-引用[4]:关于Keil开发环境搭建,包括添加文件和头文件路径。-引用[5]:关于GPIO初始化和调试端口,提到了RCC时钟配置。用户的问题焦点是:实现delay功能所需的头文件。具体来说,是STM32开发中delay函数依赖的头文件。从引用[1]:-delay.h文件中包含:#include"stm32f10x.h"-这行代码:#include"stm32f10x.h",这是在delay.h文件中包含的,表明delay功能的实现依赖于stm32f10x.h头文件。从引用[2]:-delay.c文件中包含:#include"delay.h"-但更关键的是,delay.c中的函数如delay_us使用SysTick寄存器,如SysTick->LOAD等。SysTick是Cortex-M核心的一部分,所以可能需要包括core_cm3.h或其他相关核心头文件。在STM32开发中,标准的外设库或HAL库通常需要使用stm32f10x.h或其他系列特定的头文件。引用[1]指定了stm32f10x.h。另外,在引用[4]中提到了添加文件路径,包括可能需要CMSIS相关头文件。总结所需头文件:1.**stm32f10x.h**:用于STM32F10x系列的寄存器定义和外设访问。这是核心的。2.**core_cm3.h**或类似:因为SysTick是Cortex-M3核心的一部分,在使用SysTick时可能需要包括CMSIS核心头文件。引用中没有直接提到,但在标准STM32项目中,通常会包括CMSIS。在引用[1]的delay.h中只包括stm32f10x.h,但在STM32库中,stm32f10x.h可能已经包括了core_cm3.h或类似。用户需要确保正确包含。此外,在delay.c中,可能需要包括特定于项目的头文件delay.h。回答结构:-解释基本要求。-列出主要头文件。-参考引用以增加可信度。用户还指定了"参考站内引用",所以我需要明确引用提供的source。最终回答应包括:-所需头文件stm32f10x.h(对于F10x系列),并建议包括Core相关的头文件。-描述如何设置路径和项目配置,如添加include路径。最后,系统指令要求生成相关问题。相关问题:1.如何配置Keil项目以包含delay功能?2.实现delay时需要考虑哪些硬件因素?3.除了SysTick,还有什么其他方式实现STM32中的延时?4.如何优化STM32的延迟函数精度?使用正确的格式:-行内数学表达式用$...$格式——但这个问题没有数学表达式,所以不适用。-独立公式——无。-LaTeX语法——无需求。-中文回答。-在引用段落末尾添加引用标识,如[^1]。准备回答:"在STM32中实现delay功能,主要需要的头文件是用于配置SysTick定时器的。根据引用[1],在delay.h文件中必须包括stm32f10x.h来访问STM32寄存器和定义。此外,在delay.c文件中使用了SysTick寄存器,这可能需要CMSIS核心头文件如core_cm3.h,但在stm32f10x.h中可能已包括它[^1][^2]。具体配置时,需要在Keil魔法棒中添加include路径到user目录[^1]。"生成相关问题。</think> 根据您的查询和提供的引用内容,我将详细解答STM32中实现delay功能所需的头文件。在STM32开发中,delay功能通常基于SysTick定时器实现,这是一个高效的内核级定时器。关键头文件包括系统寄存器定义文件和自定义delay文件。以下基于引用内容逐步解释: ### 1. **核心头文件需求** - **主要头文件:`stm32f10x.h`** 在实现delay功能时,必须包含此头文件。它为STM32F10x系列提供寄存器定义和地址映射(如SysTick寄存器的访问)。例如,在`delay.c`文件中使用`SysTick->LOAD`等寄存器,依赖于`stm32f10x.h`中的结构体定义(如`SysTick_Type`)。 来源引用:引用[1]中明确指出,`delay.h`文件以`#include "stm32f10x.h"`开头,这确保了对STM32硬件的访问支持[^1]。 - **代码示例(delay.h)**: ```c #ifndef __DELAY_H__ #define __DELAY_H__ #include "stm32f10x.h" // 关键头文件,用于STM32寄存器定义 void Delay_us(uint16_t us); void Delay_ms(uint16_t ms); void Delay_s(uint16_t s); #endif /* __DELAY_H__ */ ``` - **可选头文件:CMSIS核心头文件(如`core_cm3.h`)** SysTick是Cortex-M内核的一部分,而非STM32外设。在STM32标准库(如标准外设库或HAL库)中,`stm32f10x.h`通常会间接包含CMSIS核心头文件(如`core_cm3.h`用于Cortex-M3)。如果您的delay函数直接操作SysTick寄存器(如引用[2]中的代码),确保项目已包含CMSIS支持。Keil开发环境中,CMSIS文件默认包含在项目启动文件中,但如引用[4]所述,需在魔法棒配置中添加路径[^4][^2]。 ### 2. **完整的头文件结构** - **自定义delay文件:`delay.h`** 您需要创建此文件来声明delay函数原型(如`Delay_us`, `Delay_ms`)。它依赖`stm32f10x.h`提供基础支持。 - **delay实现文件:`delay.c`** 此文件包含函数实现,并需包含`delay.h`。引用[2]显示`delay.c`以`#include "delay.h"`开头,但关键依赖仍是底层寄存器定义[^2]。 - **代码示例(delay.c部分)**: ```c #include "delay.h" // 包含自定义头文件 void delay_us(uint32_t nus) { SysTick->LOAD = nus * 168 - 1; // 依赖stm32f10x.h定义的SysTick寄存器 // ... 其他代码 } ``` ### 3. **Keil环境配置** - **添加头文件路径**: 在Keil中,需通过“魔法棒” > “C/C++” > “Include Paths”添加`user`目录路径(或其他存放`delay.h`和`delay.c`的目录)。否则,编译器无法找到头文件。引用[1]详细描述了此步骤[^1]。 - **项目结构**: 确保项目包含`delay.c`文件,并在启动文件中关联CMSIS。引用[4]建议添加CMSIS和USER目录,尤其注意启动文件(如`startup_stm32f10x_hd.s`)和库文件[^4]。 ### 4. **注意事项** - **系列兼容性**:`stm32f10x.h`适用于STM32F10x系列(如F103)。如果使用其他系列(如STM32F4),则需相应头文件(如`stm32f4xx.h`)。 - **时钟配置**:delay函数依赖系统时钟频率(如引用[2]中`nus * 168`基于168MHz时钟)。需在`main.c`中正确配置系统时钟(使用`RCC`库),确保延时精准。引用[5]提到使用`RCC_APB2PeriphClockCmd`启用外设时钟[^5]。 - **精度优化**:如果需要高精度延时,建议结合CMSIS的SysTick函数或使用HAL库的`HAL_Delay`,但后者需额外头文件如`stm32f1xx_hal.h`。 ### 总结 - **必需头文件**:`stm32f10x.h`(用于寄存器定义) + 自定义`delay.h`(声明函数)。 - **辅助头文件**:确保CMSIS核心头文件(如`core_cm3.h`)通过项目配置间接包含。 - **配置步骤**:在Keil中添加`user`目录为include路径,并包含`delay.c`到项目中[^1][^4]。 如果需要完整项目模板,我可提供参考代码或调试建议。 ###
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值