STM32的HAL库的us级的延时。

#define SysclkFrequency 480				//系统主频		

void HAL_Delay_Us(uint32_t us)
{
		for(uint32_t t=0;t<us;t++)
    {	
				for(uint32_t i=0;i<SysclkFrequency;i++)   //1us
				{	
						__NOP();
				}
    }
}

### STM32 HAL中的微秒延时实现方法 在STM32 HAL中,虽然官方提供了`HAL_Delay()`函数用于毫秒延时,但对于微秒延时功能并未直接提供标准API。然而,可以通过自定义方式基于HAL的功能来实现微秒延时。 #### 方法一:利用SysTick计数器计算当前时间戳 通过读取SysTick寄存器的值并结合系统滴答频率(`SystemCoreClock`),可以精确地计算出当前的时间戳(以微秒为单位),从而实现微秒延时逻辑。以下是一个具体的代码示例: ```c #include "stm32f4xx_hal.h" // 获取当前时间戳(单位:微秒) static uint32_t getCurrentMicros(void) { uint32_t m = HAL_GetTick(); const uint32_t tms = SysTick->LOAD + 1; __IO uint32_t u = tms - SysTick->VAL; if (GXT_SYSTICK_IsActiveCounterFlag()) { m = HAL_GetTick(); u = tms - SysTick->VAL; } return (m * 1000 + (u * 1000) / tms); } // 微秒延时函数 void Delay_us(uint16_t nus) { uint32_t start_time = getCurrentMicros(); while ((getCurrentMicroos() - start_time) < nus) {} } ``` 此方法的核心在于通过`SysTick->LOAD`和`SysTick->VAL`寄存器获取剩余计数值,并将其转换成微秒别的时间差[^2]。 --- #### 方法二:基于定时器外设实现高精度延时 另一种更通用的方式是使用STM32内部的高或基本定时器(Timer)模块。这种方法的优点是可以释放CPU资源,在等待过程中允许执行其他任务。具体实现如下所示: ```c #include "stm32f4xx_hal.h" TIM_HandleTypeDef htim; // 初始化定时器配置 void MX_TIM_Init(TIM_TypeDef* TIMx, uint32_t Prescaler, uint32_t Period) { htim.Instance = TIMx; htim.Init.Prescaler = Prescaler; // 预分频系数 htim.Init.CounterMode = TIM_COUNTERMODE_UP; htim.Init.Period = Period; // 自动重装载值 htim.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1; HAL_TIM_Base_Init(&htim); // 启用定时器中断或其他模式可选 HAL_TIM_Base_Start(&htim); } // 基于定时器的微秒延时函数 void Timer_Delay_us(uint16_t us) { uint32_t ticks_start = __HAL_TIM_GET_COUNTER(&htim); uint32_t ticks_end = ticks_start + (us * SystemCoreClock / 1000000); while (__HAL_TIM_GET_COUNTER(&htim) < ticks_end) {} // 等待直到达到目标周期 } ``` 在此方案中,初始化了一个硬件定时器实例(htim),并通过设置预分频器(Prescaler)以及自动重载值(Period)调整其分辨率至满足需求的程度[^1]。 --- #### 性能对比分析 两种方法各有优劣: - **方法一**简单易懂且无需额外占用任何硬件资源,适合轻量化的应用场景;但由于采用轮询机制,可能会浪费较多CPU处理能力。 - **方法二**则更加灵活高效,尤其适用于复杂项目环境下的多任务调度场景下。不过需要注意的是它会消耗一定数量的定时器通道资源。 综上所述,开发者应根据实际项目的具体情况选择合适的解决方案。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值