STM32 HAL库计数器实现延时

在STM32等嵌入式系统开发中,计数器延时和HAL_Delay函数是两种常见的实现延时的方式。

 计数器延时

优点:

精确控制:通过合理设置计数器的初始值、计数频率以及终止条件等,可以实现较为精确的延时控制。尤其是在对时间精度要求较高的应用场景下,能够根据具体需求灵活调整延时时间,满足各种不同的定时需求。

不阻塞程序执行:与HAL_Delay函数不同,计数器延时一般是在后台通过不断更新计数器的值来实现延时效果,在延时过程中程序可以继续执行其他任务,不会像HAL_Delay那样阻塞整个程序流程,使得系统能够同时处理多个任务,提高了系统的并发处理能力和整体运行效率。

可移植性较好:计数器延时的实现通常基于对硬件定时器或系统时钟滴答计数的操作,其核心逻辑相对独立于特定的库函数。因此,在不同的STM32型号或其他类似的嵌入式平台之间进行移植时,只要硬件定时器或时钟相关的配置相似,就可以较为方便地将计数器延时代码进行迁移,不需要依赖于特定库函数的实现细节。

资源利用灵活:可以根据实际需求选择合适的定时器资源来实现计数器延时。如果系统中有多个定时器可用,还可以根据不同的任务需求分配不同的定时器进行延时操作,合理利用硬件资源,并且可以通过调整定时器的参数来优化资源占用情况,比如通过设置合适的预分频值来平衡定时精度和定时器资源的占用。

缺点:

代码复杂度相对较高:相比于直接使用HAL_Delay函数,计数器延时需要开发者自己编写更多的代码来实现计数器的初始化、计数操作以及条件判断等。这要求开发者对硬件定时器的工作原理、寄存器配置等有较深入的了解,增加了代码开发和维护的难度,尤其对于初学者来说可能不太容易掌握。

需要考虑定时器冲突:在多任务环境下,如果多个任务都使用计数器延时且共享同一定时器资源,就需要特别注意定时器的冲突问题。必须合理安排每个任务对定时器的使用时间和方式,避免出现定时器资源争用导致的定时不准确或其他异常情况。否则,可能会影响到各个任务的正常执行,破坏系统的稳定性。

硬件依赖性:计数器延时严重依赖于硬件定时器或系统时钟的正常运行。如果硬件定时器出现故障或者系统时钟不稳定,那么基于计数器的延时功能就会受到影响,可能导致延时不准确甚至无法正常实现延时效果。

计数器延时参考代码

volatile uint32_t software_tick_counter = 0;//软件计数器
static uint32_t last_time=0;

void LED2_Blink(void)//实现在0-499ms内LED2亮起,500-999msLED2熄灭,0.5s转换状态
{
    uint32_t currentTime = HAL_GetTick();//获取当前时间的ms数
	
	if(currentTime - last_time >= 1)//判断是否过去了1ms
    {
	     software_tick_counter++;
	     last_time=currentTime;
	  if (software_tick_counter >= 1000) //大于等于1000,清零重新计数
		{ 
          software_tick_counter = 0;
        }
	}
   if(software_tick_counter<=499)
	{
     HAL_GPIO_WritePin(GPIOA, GPIO_PIN_1, GPIO_PIN_SET);//灯亮
	}
 else
	{
     HAL_GPIO_WritePin(GPIOA, GPIO_PIN_1, GPIO_PIN_RESET);//灯灭
	}
    
}

 HAL_Delay

优点:

简单易用:HAL_Delay是STM32 HAL库提供的一个用于实现延时的函数,开发者只需要传入想要延时的时间参数(通常以毫秒为单位),就可以轻松实现延时功能,无需关心底层定时器的具体配置和计数操作等细节,大大降低了开发难度,节省了开发时间,尤其适合于对延时精度要求不是特别高且希望快速实现简单延时功能的应用场景。

标准化操作:作为HAL库的一部分,HAL_Delay遵循了HAL库的统一规范和接口设计。这意味着在不同的STM32项目中,只要使用了HAL库,就可以以相同的方式使用HAL_Delay函数来实现延时,使得代码具有一定的规范性和可维护性,方便团队协作开发以及代码的复用和移植(在基于HAL库的项目之间)。

缺点:

阻塞程序执行:HAL_Delay函数在执行延时操作时会阻塞整个程序的运行,即在延时期间,程序无法执行其他任何任务,只能等待延时时间结束后才能继续执行后续的代码。这在一些需要同时处理多个任务的复杂应用场景下,可能会导致系统响应速度变慢,降低了系统的整体运行效率,甚至可能影响到对实时性要求较高的任务的正常执行。

精度有限:HAL_Delay函数的延时精度通常取决于HAL库对定时器的配置以及系统时钟的频率等因素。一般来说,其精度相对不是特别高,可能无法满足某些对延时精度要求极高的应用场景,比如需要精确到微秒级别的定时操作。

不可移植性(相对):虽然HAL库在STM32系列中应用广泛,但如果要将基于HAL库使用HAL_Delay函数的代码移植到其他非HAL库的嵌入式平台或者不同架构的处理器上,就需要对延时功能进行重新实现,因为HAL_Delay函数是HAL库特有的,依赖于HAL库的内部实现机制,这增加了代码移植的难度和工作量。 

作者:Miraitowa →19%

物联沃分享整理
物联沃-IOTWORD物联网 » STM32 HAL库计数器实现延时

发表回复