STM32CubeIDE如何实现HAL库 微秒Us延迟(HAL_Us_Delay)

在STM32CubeIDE中,此软件使用的是HAL库,而且对于时间延迟只有HAL_Delay()函数,也就是毫秒延迟函数。

下文将讲述如何在STM32CubeIDE中获取微秒延迟函数(HAL_Delay_us)。

首先选择一个定时器,要注意选择的是哪一个定时器。因为不同的定时器可能时钟频率不同。由于选择的时钟频率不同,后续程序中的数值要对应进行相应的修改。

本次作者使用的是TIM4定时器,使用的是STM32F437芯片,打开芯片数据手册可观察到TIM4挂载在APB1总线上。

 

 在图形化配置界面,打开Clock Configuration 可以观察到TIM5挂载的APB1时钟频率是多少。此时作者配置的是90MHz,如下图所示。

 在TIM5配置中选中Internal Clock,然后将预分频系数设置成90-1=89(因为此处是从0开始计数)

Counter Period 改成1

点击生成代码

在tim.c中添加如下代码

void HAL_Delay_us(uint16_t us)
{
    uint16_t delay = 0xffff-us-5;		//从此数进行计数,如计数了65535次则刚好1us	
    										
    HAL_TIM_Base_Start(&htim5);  	    //开启计数器
    __HAL_TIM_SetCounter(&htim5,delay);	//设置计数器
    while(delay<0xffff-5)
    {
        delay = __HAL_TIM_GetCounter(&htim5); 获取当前计数值
    }
    HAL_TIM_Base_Stop(&htim5);
}

在tim.h中添加如下代码

void HAL_Delay_us(uint16_t us);

至此得到了微秒延迟的函数,只需要调用HAL_Delay_us()函数即可

测试:

使用引脚高低电平翻转+延迟函数,如设置正确的话将实现方波信号。

(测试前需要对引脚进行使能)

测试代码如下:

在main.c的While循环中添加如下代码:

//us延时测试
HAL_GPIO_TogglePin(GPIOE, GPIO_PIN_8);
HAL_Delay_us(1000);

打开示波器,接上设置的相应引脚,烧录程序,可得如下图示波形:

 

STM32HAL并没有直接提供用于实现微秒级精确延迟的功能,它是ST官方为STM32系列微控制器开发的一个 HAL (Hardware Abstraction Layer) ,主要用于简化硬件访问和管理,比如GPIO配置、定时器控制等。如果你需要在STM32实现微秒级别的延时,通常会借助系统定时器(SysTick Timer)或者高级定时器如TIM。 1. **使用SysTick**:你可以通过配置SysTick中断,并在回调函数中更新计数器来实现延时。首先,你需要开启SysTick并设置周期,然后计算出到达指定微秒数所需的次数,等待计数器达到该值即可。 ```c // 假设需要1000us延时 uint32_t delayUs = 1000; sys_tick_counter_t targetCount = SysTick_GetCounter() + (delayUs * sysTickPeriod); while (SysTick_GetCounter() < targetCount); ``` 记得启用SysTick中断并且处理好可能的时间溢出问题。 2. **使用高级定时器**:如果对精度有更高要求,可以使用定时器的预分频功能,设置适当的定时器寄存器,然后利用定时器的中断机制来实现延时。 ```c TIM_HandleTypeDef htim; // 配置定时器... htim.Instance->CCR1 = (microsecondsToCounts(1000) - 1); // 设置CC寄存器,减一是因为到达此点就触发中断 __HAL_TIM_SET_AUTORELOAD(&htim, htim.Instance->CCR1); __HAL_TIM_ENABLE_IT(&htim, TIM_IT_Update); // 开启更新事件 __HAL_TIM_START(&htim); // 启动定时器 // 更新函数 void TIM_IRQHandler(TIM_HandleTypeDef* htim) { if (HTIM_IsUpdateEvent(htim)) { // 延迟已到,处理后续任务... } } ``` 这里`microsecondsToCounts()`是一个辅助函数,将微秒转换为定时器寄存器可以处理的数值。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值